網(wǎng)站首頁 編程語言 正文
異步action
- action:Object{} => 同步action
- action:function() => 異步action
? | 同步action | 異步action |
---|---|---|
類型 | Object類型的對象 | function()函數(shù) |
dispatch(action) | 同步的action被dispatch到store后; store直接將其交給reducer加工。 |
異步的action函數(shù)被dispatch到store后; store會先調(diào)用這個函數(shù),等待異步任務(wù)結(jié)束。 |
? | ? | ? |
store監(jiān)測到傳入的action是一個一般對象,那么store就知道這是一個同步的action,store就會把這個action交給Reducers去加工,執(zhí)行。
但是store若監(jiān)測到傳入的action是一個函數(shù),那么store就知道這是一個異步的action,store就會配合中間件,先調(diào)用這個函數(shù)。等到函數(shù)內(nèi)的異步任務(wù)結(jié)束,再調(diào)用函數(shù)內(nèi)部的同步的dispatch,再交給Reducers去加工狀態(tài)。同時,store調(diào)用這個包裹著異步任務(wù)的函數(shù)時,會傳入一個dispatch方法作為函數(shù)的參數(shù),以供函數(shù)內(nèi)部異步任務(wù)結(jié)束時使用這個同步的dispatch。
中間件(Middleware):redux-thunk
安裝中間件:
npm install redux-thunk
// 或
yarn add redux-thunk
引入中間件:
既然中間件是配合store使用的,那么當然是在store中引入并使用這個中間件
store.js:
/*
該文件專門用于暴露一個store對象,整個應(yīng)用只有一個store對象
*/
// 引入createStore,專門用于創(chuàng)建redux中最為核心的store對象
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時,將applyMiddleware傳入作為createStore的第二個參數(shù);
applyMiddleware本身是一個函數(shù),用于執(zhí)行中間件,所以要把(thunk)傳入applyMiddleware這個函數(shù)。
applyMiddleware(thunk)含義是:執(zhí)行thunk這個中間件。
這樣一來,store就會在接收到一個函數(shù)類型的action時,去調(diào)用這個action對應(yīng)的函數(shù)。
并且,異步action中一般都會調(diào)用同步的action,所以store在調(diào)用這個異步action對應(yīng)的函數(shù)時,會傳入dispatch方法作為參數(shù),以供異步任務(wù)結(jié)束后,使用這個dispatch方法調(diào)用同步的action。
count_action_creator.js:
/*
該文件專門為Count組件生成action動作對象
*/
import { INCREMENT, DECREMENT } from './constant'
// 同步action,就是指action的值為Object對象
export const createIncrementAction = data => ({ type: INCREMENT, data })
// ({ type: 'increment', data }) 相當于 { 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)用這個函數(shù):
incrementAsync = () => {
const { value } = this.selectedNumber
store.dispatch(createIncrementAsyncAction(value * 1, 500))
}
異步action總結(jié):
延遲的動作不想交給組件自身,想交給action時,可以使用異步的action
(但異步action并不是必須的);何時需要異步action:
想對狀態(tài)進行操作,但是具體的數(shù)據(jù)靠異步任務(wù)返回;具體編碼:
npm install redux-thunk
或
yarn add redux-thunk安裝中間件創(chuàng)建action的函數(shù)不再返回一個一般對象,而是返回一個函數(shù),該函數(shù)中寫異步任務(wù);
異步任務(wù)有結(jié)果后,使用store傳入的dispatch參數(shù)分發(fā)一個同步的action去真正操作數(shù)據(jù)
備注:異步action不是必須要寫的,完全可以自己在組件中等待異步任務(wù)的結(jié)果之后再去分發(fā)同步action。
原文鏈接:https://blog.csdn.net/Svik_zy/article/details/125838979
相關(guān)推薦
- 2022-04-20 Python設(shè)計模式中的行為型策略模式_python
- 2022-08-27 C語言數(shù)據(jù)結(jié)構(gòu)之棧與隊列的相互實現(xiàn)_C 語言
- 2021-12-09 帶你一文了解C#中的LINQ_C#教程
- 2022-09-09 Oracle存儲過程與函數(shù)的詳細使用教程_oracle
- 2023-07-25 mongodb本地連接失敗解決方案
- 2023-04-19 TypeError [ERR_INVALID_ARG_TYPE]: The “path“ argum
- 2022-04-17 Python?如何引入同級包和模塊_python
- 2022-11-11 react中代碼塊輸出,代碼高亮顯示,帶行號,能復(fù)制的問題_React
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支