Redux 异步操作中间件 Redux-thunk
Redux同步修改状态数据时,Redux要求store.dispatch() 传递过来的action是个普通的js对象,这个对象用于描述对数据的操作
但是到了异步的时候,我们需要使用Redux的中间件Redux-thunk,当然中间件有很多。Redux-thunk只是其中的一个。
1.安装Redux-thunk
npm install --save redux-thunk
2.配置中间件:
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './reducers';
const store = createStore(
rootReducer,
applyMiddleware(thunk)
);
此时Redux要求store.dispatch() 传递过来的action是个函数。redux-thunk会判断传递过来的action类型,是否为函数,若为函数类型,则自动调用这个function,并返回dispatch,这样在异步操作的任何时刻都可以dispatch了。
redux-thunk 源码展示
function createThunkMiddleware(extraArgument) {
return function (_ref) {
var dispatch = _ref.dispatch,
getState = _ref.getState;
return function (next) {
return function (action) {
if (typeof action === 'function') {
return action(dispatch, getState, extraArgument);
}
return next(action);
};
};
};
}
var thunk = createThunkMiddleware();
thunk.withExtraArgument = createThunkMiddleware;
3.如何使用
store.dispatch(
changeFn()
);
function changFn () {
return (dispatch,state)=>{
axios.get('xx').then((res)=>{
console.log('ajax请求成功了')
dispatch()
}).catch(()=>{
console.log('error');
});
}
}
总结:
redux的状态更改:
view——>actions——>reducer——>state变化——>view变化(同步)
view——>actions——>redux middleware——>actions——>reducer——>state变化——>view变化 (异步)
redux middleware就是在actions和reducer之间做了一些处理,不让store.dispatch 后立即到达reducer去修改状态。
异步的时候action了两次