reducer要做的事就是怎样更新状态
reducer是一个纯函数,接收旧的state和acion返回新的state
reducer的禁止:
- 修改传入参数;
- 执行有副作用的操作,如 API 请求和路由跳转;
- 调用非纯函数,如
Date.now()
或Math.random()。
-
const initialState = { visibilityFilter: VisibilityFilters.SHOW_ALL, todos: [] }; function todoApp(state = initialState, action) { switch (action.type) { case SET_VISIBILITY_FILTER: return Object.assign({}, state, { visibilityFilter: action.filter }) default: return state } }
不要修改
state
。 使用Object.assign()
新建了一个副本。不能这样使用Object.assign(state, {visibilityFilter: action.filter })
,因为它会改变第一个参数的值。你必须把第一个参数设置为空对象。在default
情况下返回旧的state
。遇到未知的 action 时,一定要返回旧的state
。
两种等价的方法
import { combineReducers } from 'redux'; const todoApp = combineReducers({ visibilityFilter, todos }) export default todoApp;
export default function todoApp(state = {}, action) { return { visibilityFilter: visibilityFilter(state.visibilityFilter, action), todos: todos(state.todos, action) } }
或者添加KEY两种等价的方法(key是用来筛选出state中的你所需要的数据进行处理)
const reducer = combineReducers({
a: doSomethingWithA,
b: processB,
c: c
})
function reducer(state = {}, action) { return { a: doSomethingWithA(state.a, action), b: processB(state.b, action), c: c(state.c, action) } }