Reducer
Reducers 指定了应用状态的变化如何响应 actions 并发送到 store 的
设计 State 结构
以 todo 应用为例,需要保存两种不同的数据:
当前选中的任务过滤条件;
完整的任务列表。
{
visibilityFilter: 'SHOW_ALL',
todos: [
{
text: 'Consider using Redux',
completed: true,
},
{
text: 'Keep all state in a single tree',
completed: false
}
]
}
Action 处理
现在我们已经确定了 state 对象的结构,就可以开始开发 reducer。reducer 就是一个纯函数,接收旧的 state 和 action,返回新的 state。
现在处理 SET_VISIBILITY_FILTER。需要做的只是改变 state 中的 visibilityFilter。
function todoApp(state = initialState, action) {
switch (action.type) {
case SET_VISIBILITY_FILTER:
return Object.assign({
}, state, {
visibilityFilter: action.filter
})
default:
return state
}
}
注意:
1.不要修改 state。 使用 Object.assign() 新建了一个副本。不能这样使用 Object.assign(state, { visibilityFilter: action.filter }),因为它会改变第一个参数的值。你必须把第一个参数设置为空对象。你也可以开启对 ES7 提案对象展开运算符的支持, 从而使用 { …state, …newState } 达到相同的目的。
2.在 default 情况下返回旧的 state。遇到未知的 action 时,一定要返回旧的 state。
拆分 Reducer
目前的代码看起来有些冗长:
function todoApp(state = initialState, action) {
switch (action.type) {
case SET_VISIBILITY_FILTER:
return Object.assign({
}, state, {
visibilityFilter: action.filter
})
case ADD_TODO:
return Object.assign({
}, state, {
todos: