redux副作用處理之redux-thunk使用
一、安裝
yarn add redux-thunk // 或 npm install --save redux-thunk
二、使用
import { createStore, applyMiddleware } from "redux"; import * as loginActions from "./action/login"; import reducer from "./reducer"; import logger from "redux-logger"; import thunk from "redux-thunk"; // 創(chuàng)建倉庫 const store = applyMiddleware(thunk, logger)(createStore)(reducer);
三、為什么要使用redux-thunk?
redux中的action都必須要是一個(gè)平面對(duì)象,所以就不能有任何的副作用,redux-thunk就是為了解決這一問題,使用redux-thunk中間件后,允許action返回一個(gè)函數(shù),這個(gè)函數(shù)是允許有副作用的
例如:
寫一個(gè)帶有副作用的action:
export function setTime(payload) { return function () { setTimeout(() => { console.log("定時(shí)器"); }, 1000); }; }
如果沒有使用redux-thunk會(huì)直接報(bào)錯(cuò)顯示action必須是一個(gè)平面對(duì)象
import { createStore, applyMiddleware } from "redux"; import * as loginActions from "./action/login"; import reducer from "./reducer"; import logger from "redux-logger"; import thunk from "redux-thunk"; // 創(chuàng)建倉庫 const store = applyMiddleware(logger)(createStore)(reducer); store.dispatch(loginActions.setTime());
使用了redux-thunk中間件后正常運(yùn)行
四、redux-thunk運(yùn)行原理
redux-thunk中間件一般放在第一個(gè),因?yàn)樗诮邮誥ction時(shí)如果發(fā)現(xiàn)action不是一個(gè)平面對(duì)象
那么它就不會(huì)傳遞給下一個(gè)中間件
它會(huì)直接將這個(gè)函數(shù)運(yùn)行
如果action是一個(gè)平面對(duì)象它才會(huì)往后傳遞
五、redux-thunk原理
redux-thunk會(huì)返回給action3個(gè)參數(shù)
- 1.dispatch:store的dispatch
- 2.getState:store的getState
- 3.extraArgument:用戶傳入的參數(shù)
源碼:
function createThunkMiddleware(extraArgument) { return ({ dispatch, getState }) => next => action => { // 如果當(dāng)前的action是一個(gè)函數(shù)直接調(diào)用該函數(shù) if (typeof action === 'function') { return action(dispatch, getState, extraArgument); } // 如果當(dāng)前的action是一個(gè)平面對(duì)象,傳遞個(gè)下一個(gè)中間件 return next(action); }; } const thunk = createThunkMiddleware(); // 可以使用withExtraArgument傳入一個(gè)參數(shù) thunk.withExtraArgument = createThunkMiddleware; export default thunk;
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
React Native AsyncStorage本地存儲(chǔ)工具類
這篇文章主要為大家分享了React Native AsyncStorage本地存儲(chǔ)工具類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10react進(jìn)階教程之異常處理機(jī)制error?Boundaries
在react中一旦出錯(cuò),如果每個(gè)組件去處理出錯(cuò)情況則比較麻煩,下面這篇文章主要給大家介紹了關(guān)于react進(jìn)階教程之異常處理機(jī)制error?Boundaries的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08react國際化化插件react-i18n-auto使用詳解
這篇文章主要介紹了react國際化化插件react-i18n-auto使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03詳解React中setState回調(diào)函數(shù)
這篇文章主要介紹了詳解React中setState回調(diào)函數(shù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06記錄React使用connect后,ref.current為null問題及解決
記錄React使用connect后,ref.current為null問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05ReactNative-JS 調(diào)用原生方法實(shí)例代碼
這篇文章主要介紹了ReactNative-JS 調(diào)用原生方法實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10