Redux中異步action與同步action的使用
異步action
- action:Object{} => 同步action
- action:function() => 異步action
同步action | 異步action | |
---|---|---|
類型 | Object類型的對(duì)象 | function()函數(shù) |
dispatch(action) | 同步的action被dispatch到store后; store直接將其交給reducer加工。 | 異步的action函數(shù)被dispatch到store后; store會(huì)先調(diào)用這個(gè)函數(shù),等待異步任務(wù)結(jié)束。 |
store監(jiān)測(cè)到傳入的action是一個(gè)一般對(duì)象,那么store就知道這是一個(gè)同步的action,store就會(huì)把這個(gè)action交給Reducers去加工,執(zhí)行。
但是store若監(jiān)測(cè)到傳入的action是一個(gè)函數(shù),那么store就知道這是一個(gè)異步的action,store就會(huì)配合中間件,先調(diào)用這個(gè)函數(shù)。等到函數(shù)內(nèi)的異步任務(wù)結(jié)束,再調(diào)用函數(shù)內(nèi)部的同步的dispatch,再交給Reducers去加工狀態(tài)。同時(shí),store調(diào)用這個(gè)包裹著異步任務(wù)的函數(shù)時(shí),會(huì)傳入一個(gè)dispatch方法作為函數(shù)的參數(shù),以供函數(shù)內(nèi)部異步任務(wù)結(jié)束時(shí)使用這個(gè)同步的dispatch。
中間件(Middleware):redux-thunk
安裝中間件:
npm install redux-thunk // 或 yarn add redux-thunk
引入中間件:
既然中間件是配合store使用的,那么當(dāng)然是在store中引入并使用這個(gè)中間件
store.js:
/* 該文件專門用于暴露一個(gè)store對(duì)象,整個(gè)應(yīng)用只有一個(gè)store對(duì)象 */ // 引入createStore,專門用于創(chuàng)建redux中最為核心的store對(duì)象 import { legacy_createStore as createStore, applyMiddleware } from 'redux'; // 引入為Count組件服務(wù)的reducer import countReducer from './count_reducer' // 引入redux-thunk,用于支持異步action import thunk from 'redux-thunk' // 暴露store export default createStore(countReducer, applyMiddleware(thunk))
代碼解釋:
applyMiddleware是redux中用于執(zhí)行中間件的函數(shù);
引入redux-thunk中間件;
在creaetStore時(shí),將applyMiddleware傳入作為createStore的第二個(gè)參數(shù);
applyMiddleware本身是一個(gè)函數(shù),用于執(zhí)行中間件,所以要把(thunk)傳入applyMiddleware這個(gè)函數(shù)。
applyMiddleware(thunk)含義是:執(zhí)行thunk這個(gè)中間件。
這樣一來(lái),store就會(huì)在接收到一個(gè)函數(shù)類型的action時(shí),去調(diào)用這個(gè)action對(duì)應(yīng)的函數(shù)。
并且,異步action中一般都會(huì)調(diào)用同步的action,所以store在調(diào)用這個(gè)異步action對(duì)應(yīng)的函數(shù)時(shí),會(huì)傳入dispatch方法作為參數(shù),以供異步任務(wù)結(jié)束后,使用這個(gè)dispatch方法調(diào)用同步的action。
count_action_creator.js:
/* 該文件專門為Count組件生成action動(dòng)作對(duì)象 */ import { INCREMENT, DECREMENT } from './constant' // 同步action,就是指action的值為Object對(duì)象 export const createIncrementAction = data => ({ type: INCREMENT, data }) // ({ type: 'increment', data }) 相當(dāng)于 { return { type: 'increment', data } } export const createDecrementAction = data => ({ type: DECREMENT, data }) // 異步action,就是指action的值是函數(shù) export const createIncrementAsyncAction = (data, time) => { return (dispatch) => { setTimeout(() => { dispatch(createIncrementAction(data)) }, time) } }
在Count組件中調(diào)用這個(gè)函數(shù):
incrementAsync = () => { const { value } = this.selectedNumber store.dispatch(createIncrementAsyncAction(value * 1, 500)) }
異步action總結(jié):
延遲的動(dòng)作不想交給組件自身,想交給action時(shí),可以使用異步的action
(但異步action并不是必須的);何時(shí)需要異步action:
想對(duì)狀態(tài)進(jìn)行操作,但是具體的數(shù)據(jù)靠異步任務(wù)返回;具體編碼:
npm install redux-thunk
或
yarn add redux-thunk安裝中間件創(chuàng)建action的函數(shù)不再返回一個(gè)一般對(duì)象,而是返回一個(gè)函數(shù),該函數(shù)中寫異步任務(wù);
異步任務(wù)有結(jié)果后,使用store傳入的dispatch參數(shù)分發(fā)一個(gè)同步的action去真正操作數(shù)據(jù)
備注:異步action不是必須要寫的,完全可以自己在組件中等待異步任務(wù)的結(jié)果之后再去分發(fā)同步action。
到此這篇關(guān)于Redux中異步action與同步action的使用的文章就介紹到這了,更多相關(guān)Redux 異步action與同步action內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解如何在React中有效地監(jiān)聽(tīng)鍵盤事件
React是一種流行的JavaScript庫(kù),用于構(gòu)建用戶界面,它提供了一種簡(jiǎn)單而靈活的方式來(lái)創(chuàng)建交互式的Web應(yīng)用程序,在React中,我們經(jīng)常需要監(jiān)聽(tīng)用戶的鍵盤事件,以便根據(jù)用戶的輸入做出相應(yīng)的反應(yīng),本文將向您介紹如何在React中有效地監(jiān)聽(tīng)鍵盤事件,并展示一些常見(jiàn)的應(yīng)用場(chǎng)景2023-11-11React?useEffect不支持async?function示例分析
這篇文章主要為大家介紹了React?useEffect不支持async?function示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07React組件實(shí)例三大屬性state props refs使用詳解
這篇文章主要為大家介紹了React組件實(shí)例三大屬性state props refs使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09React動(dòng)態(tài)更改html標(biāo)簽的實(shí)現(xiàn)方式
這篇文章主要介紹了React動(dòng)態(tài)更改html標(biāo)簽的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12React文件名和目錄規(guī)范最佳實(shí)踐記錄(總結(jié)篇)
React在使用時(shí)非常靈活,如果沒(méi)有一個(gè)規(guī)范約束項(xiàng)目,在開(kāi)發(fā)過(guò)程中會(huì)非常混亂,本文將介紹幾個(gè)優(yōu)秀的規(guī)范,介紹文件名和目錄前,需要先簡(jiǎn)述一下幾種通用的類型,用來(lái)區(qū)分文件的功能,感興趣的朋友一起看看吧2022-05-05react-router-domV6嵌套路由實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了react-router-domV6嵌套路由實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01React?+?Typescript領(lǐng)域初學(xué)者的常見(jiàn)問(wèn)題和技巧(最新)
這篇文章主要介紹了React?+?Typescript領(lǐng)域初學(xué)者的常見(jiàn)問(wèn)題和技巧,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06