赞
踩
redux
里,action
仅仅是携带了数据的普通js
对象。action creator
返回的值是这个action
类型的对象。然后通过store.dispatch
进行分发,同步的情况下一切都很完美,但是reducer无法处理异步的情况。
那么我们就需要在action
和reducer
中间架起一座桥梁来处理异步。这就是middleware
安装命令: npm i redux-thunk
在你创建的store.js
中去引入使用:
import { applyMiddleware, combineReducers, createStore } from "redux";
import TabbarReducer from "./reducers/TabbarReducer";
import reduxThunk from "redux-thunk"
const reducer = combineReducers({
TabbarReducer
})
const store = createStore(reducer, applyMiddleware(reduxThunk));
export default store;
异步的话那么这个中间件将起作用,如果是同步的话还是走同步。
那么你在actionCreator
中如果写成异步的话必须写成返回一个函数,并且这个函数带有一个参数dispatch
,在你异步获取到数据是进行dispatch
,并用payload
将你需要传到参数传过去即可。如下示例:
function getCinemaListAction() {
return (dispatch) => {
axios({
url: '...',
method: 'get/post',
headers: {}
}).then((res) => {
dispatch({
type: 'cinemalist',
payload: res.data
})
})
}
}
reducer
中去判断取值:
然后去需要的页面去订阅取值:
订阅问题,在redux中每次发布的时候,会把所有订阅的东西拿出来执行,这样的话完全没必要,我们可以在当前组件销毁的时候取消订阅,如下写法:
安装命令: npm i redux-promise
在store.js
中引入:
react-thunk
和react-promise
写法上不同,功能上一样:
react-promise
返回一个promise
:
Redux DevTools Extension
在store.js
中配置:
import { applyMiddleware, combineReducers, createStore, compose } from "redux";
import TabbarReducer from "./reducers/TabbarReducer";
import reduxThunk from "redux-thunk"
import reduxPromise from "redux-promise"
const reducer = combineReducers({
TabbarReducer
})
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const store = createStore(reducer, /* preloadedState, */ composeEnhancers(
applyMiddleware(reduxThunk, reduxPromise)
));
export default store;
这样配置完之后,在调试器哪里就有状态了:
在学习React的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。