redux中間件之redux-thunk的具體使用
redux的核心概念其實(shí)很簡(jiǎn)單:將需要修改的state都存入到store里,發(fā)起一個(gè)action用來(lái)描述發(fā)生了什么,用reducers描述action如何改變state tree 。創(chuàng)建store的時(shí)候需要傳入reducer,真正能改變store中數(shù)據(jù)的是store.dispatch API。
1.概念
dispatch一個(gè)action之后,到達(dá)reducer之前,進(jìn)行一些額外的操作,就需要用到middleware。你可以利用 Redux middleware 來(lái)進(jìn)行日志記錄、創(chuàng)建崩潰報(bào)告、調(diào)用異步接口或者路由等等。
換言之,中間件都是對(duì)store.dispatch()的增強(qiáng)
2.中間件的用法
import { applyMiddleware, createStore } from 'redux'; import thunk from 'redux-thunk'; const store = createStore( reducers, applyMiddleware(thunk) );
直接將thunk中間件引入,放在applyMiddleware方法之中,傳入createStore方法,就完成了store.dispatch()的功能增強(qiáng)。即可以在reducer中進(jìn)行一些異步的操作。
3.applyMiddleware()
其實(shí)applyMiddleware就是Redux的一個(gè)原生方法,將所有中間件組成一個(gè)數(shù)組,依次執(zhí)行。
中間件多了可以當(dāng)做參數(shù)依次傳進(jìn)去
const store = createStore( reducers, applyMiddleware(thunk, logger) );
如果想了解它的演化過(guò)程可以去redux的官方文檔:https://redux.js.org/advanced/middleware
4.redux-thunk
分析redux-thunk的源碼node_modules/redux-thunk/src/index.js
function createThunkMiddleware(extraArgument) { return ({ dispatch, getState }) => next => action => { if (typeof action === 'function') { return action(dispatch, getState, extraArgument); } return next(action); }; } const thunk = createThunkMiddleware(); thunk.withExtraArgument = createThunkMiddleware; export default thunk;
redux-thunk中間件export default的就是createThunkMiddleware()過(guò)的thunk,再看createThunkMiddleware這個(gè)函數(shù),返回的是一個(gè)柯里化過(guò)的函數(shù)。我們?cè)俜g成ES5的代碼容易看一點(diǎn),
function createThunkMiddleware(extraArgument) { return function({ dispatch, getState }) { return function(next){ return function(action){ if (typeof action === 'function') { return action(dispatch, getState, extraArgument); } return next(action); }; } } }
這么一看,就可以看出來(lái)redux-thunk最重要的思想,就是可以接受一個(gè)返回函數(shù)的action creator。如果這個(gè)action creator 返回的是一個(gè)函數(shù),就執(zhí)行它,如果不是,就按照原來(lái)的next(action)執(zhí)行。
正因?yàn)檫@個(gè)action creator可以返回一個(gè)函數(shù),那么就可以在這個(gè)函數(shù)中執(zhí)行一些異步的操作。
例如:
export function addCount() { return {type: ADD_COUNT} } export function addCountAsync() { return dispatch => { setTimeout( () => { dispatch(addCount()) },2000) } }
addCountAsync函數(shù)就返回了一個(gè)函數(shù),將dispatch作為函數(shù)的第一個(gè)參數(shù)傳遞進(jìn)去,在函數(shù)內(nèi)進(jìn)行異步操作就可以了。
參考文檔:http://www.redux.org.cn/docs/advanced/Middleware.html
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
收藏Javascript中常用的55個(gè)經(jīng)典技巧
收藏Javascript中常用的55個(gè)經(jīng)典技巧...2007-08-08three.js中3D視野的縮放實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了three.js中3D視野的縮放實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11javascript預(yù)加載圖片、css、js的方法示例介紹
預(yù)加載的好處可以讓網(wǎng)頁(yè)更快的呈現(xiàn)給用戶,缺點(diǎn)就是可能會(huì)增加無(wú)用的請(qǐng)求,不多說(shuō)了,作為一個(gè)前端攻城師都懂的,下面分享我做的測(cè)試和得到的結(jié)果2013-10-10兩種方法實(shí)現(xiàn)文本框輸入內(nèi)容提示消失
第一種方法:基于HTML5 input標(biāo)簽的新特性 - placeholder 。另外,x-webkit-speech 屬性可以實(shí)現(xiàn)語(yǔ)音輸入功能;第二種方法: 用span模擬,定位span,借助JS鍵盤(pán)事件判斷輸入,確定span里的內(nèi)容顯示隱藏2013-03-03JS實(shí)現(xiàn)消息來(lái)時(shí)讓網(wǎng)頁(yè)標(biāo)題閃動(dòng)效果的方法
這篇文章主要介紹了JS實(shí)現(xiàn)消息來(lái)時(shí)讓網(wǎng)頁(yè)標(biāo)題閃動(dòng)效果的方法,實(shí)例分析了JavaScript基于時(shí)間函數(shù)動(dòng)態(tài)操作頁(yè)面元素的技巧,并附帶了開(kāi)心網(wǎng)的標(biāo)題閃動(dòng)解決方案,需要的朋友可以參考下2016-04-04JavaScript 對(duì)象成員的可見(jiàn)性說(shuō)明
與java等基于類的面向?qū)ο笳Z(yǔ)言的private、protected、public等關(guān)鍵字的用途類似,基于對(duì)象的JavaScript語(yǔ)言,在對(duì)象構(gòu)造上也存在類似的成員可見(jiàn)性問(wèn)題。2009-10-10