Redux中间件与异步操作
基本流程1.创建store,带有三个方法:store.dispatch,store.subscribe,store.getState import { applyMiddleware,createStore } from 'redux'; const store = createStore( reducer,applyMiddleware(thunk,logger) ); 2.view发出dispatch->action del = () => { store.dispatch({ type: 'DEL',data: this.state.count - 1 }); } 3.reducer处理action数据 export default (state = {},action) => { switch (action.type) { // state即返回的新状态,新的state即本次的返回值,所以每次都是往空的对象里,先推state,再新增属性或改变原来属性的值 case 'ADD': return Object.assign({},{count: action.data}); case 'ADD2': return Object.assign({},{count: action.data}); case 'ADD3': return Object.assign({},{count: action.data}); case 'DEL': return Object.assign({},{count: action.data}); case 'AJAX': return Object.assign({},{res: action.data.res}); default: return { count: 0,res: 'aaaa' }; } } 4.view层通过store.subscribe()方法设置监听函数,一旦state发生变化,就会自定执行这个函数. store.subscribe(() => { // subscribe即,每一次dispatch,都会触发reducer处理数据,即触发store.subscribe this.setState({ count: store.getState().count,// reducer返回新的state,即state的值被改变state = 1 res: store.getState().res }); }); 异步操作1.用户发出Action,Reducer函数算出新的State,View重新渲染. let next = store.dispatch; store.dispatch = function dispatchAndLog(action) { console.log('dispatching',action); next(action); console.log('next state',store.getState()); } 上面代码中,对store.dispatch进行了重定义,在发送Action前后添加了打印功能,这就是中间件的雏形. import { applyMiddleware,createStore } from 'redux'; import { createLogger } from 'redux-logger'; import thunk from 'redux-thunk'; const logger = createLogger(); const store = createStore( reducer,logger) ); 5.applyMiddleware redux-thunk中间件1.异步操作至少要送出两个Action,用户触发第一个Action,这个跟同步操作一样,没有问题. add3 = () => { store.dispatch(dispatchAction(this.state.count + 3)); } function dispatchAction(count) { return (dispatch) => { dispatch({ type: 'ADD3',data: count }); } } dispatchAction是一个Action Creater,返回一个函数,这个函数执行后,发出一个action,然后执行异步操作,拿到结果后,再次dispatch,发出一个Action. 使用redux-thunk发Async Action的例子1.首先,这是个关于action creator的解释. function changeNum(count) { return { type: 'ADD2',data: count } } add2 = () => { store.dispatch(changeNum(this.state.count + 2)); } 2.Thunk的做法就是扩展了这个action creator.Thunk允许action creator返回一个函数,而且这个函数第一个参数是dispatch.所以不光改造action creator,如果你要用thunk,你还要把它放进middleware里去,这样函数类型的action就被thunk middleware捕获,根据你的函数逻辑,再去dispatch常规的action.这样Async Action其实就是发Ajax之前dispatch一发,收到服务器响应后dispatch一发,报错的话再来dispatch一发. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |