对应视频:http://video.sike.io/javascript-redux-writing-a-todo-list-reducer-adding-a-todo
本节使用到的环境:https://jsbin.com/kaboqe/edit?js,console
就像之前写计数器的 reducer
那样,我们依然使用测试驱动开发,编写一个 todo 应用的“状态计算器” (reducer
).
不同的是我们这次将加入 deepFreeze
来保护应用状态不被修改。
我们首先要写的是处理添加 todo 的逻辑。
todo 应该被包含在一个数组里面。每一个 todo 都有标号和内容,以及它们的完成状态,默认是未完成的。
const todos = (state = [], action) => {
};
const testAddTodo = () => {
const stateBefore = [];
const action = {
type: 'ADD_TODO',
id: 0,
text: 'Learn Redux'
};
const stateAfter = [
{
id: 0,
text: 'Learn Redux',
completed: false
}
];
};
为了确保 reducer
是纯函数,我们将使用 deepFreeze
来 “冰冻” stateBefore
和 action
.
const testAddTodo = () => {
//...
deepFreeze(stateBefore);
deepFreeze(action);
expect(
todos(stateBefore, action)
).toEqual(stateAfter);
};
接下来就可以开始实现 reducer
对应的添加 todo 功能了。
const todos = (state = [], action) => {
switch (action.type) {
case 'ADD_TODO':
return [
...state,
{
id: action.id,
text: action.text,
completed: false // 默认值
}
];
default:
return state;
}
};
需要注意:
- 要使用非转变方法去计算新的数组。
- 状态的初始化值。
- 遇到无法处理的动作总是返回当前状态。
现在执行测试,可以完美通过~
// ...前面写的代码
testAddTodo();
console.log('测试通过!');
reducer
接受当前状态和被分发的动作,计算应用下一个状态。- 纯函数。
- 判断
action.type
去计算不同的状态变化。 - 总是处理未知的动作。
- 总是处理未初始化的状态。
- 通过确认在触发动作后与预期一致确保
reducer
符合要求。
- 不可变的单一状态树
- 用动作描述状态变化
- 纯函数和非纯函数
- reducer 函数
- 为计数器编写一个带有测试的 reducer 函数
- store 方法:getState,dispatch 和 subscribe
- 从头实现 store
- React 计数器示例
- 使用 slice(),concat() 和 ...(展开运算符) 来避免修改数组
- 使用 Object.assign() 和 ...(展开运算符) 来避免修改对象
- 编写代办事项列表的 Reducer (添加一个代办事项)
- 编写代办事项列表的 Reducer (切换代办事项的完成状态)
- “Reducer 组合”和数组
- “Reducer 组合”和对象
- 使用 combineReducers() 实现 Reducer组合
- 从头实现 combineReducer()
- React 代办事项列表示例(添加一个代办事项)
- React 代办事项列表示例(切换代办事项的完成状态)
- React 代办事项列表示例(过滤代办事项)
- 提取展示型组件( TODO, TODOLIST )
- 提取展示型组件( AddTodo, Footer, FilterLink )
- 提取容器组件 ( FILTERLINK )
- 提取容器组件 ( VisibleTodoList, AddTodo )
- 通过 props 显式地向下传递 store
- 通过 context 隐式地向下传递 store
- 使用 React Redux 的 传递 store
- 使用 React Redux 的 connect() 生成容器 ( VisibleTodoList )
- 使用 React Redux 的 connect() 生成容器 ( AddTodo )
- 使用 React Redux 的 connect() 生成容器 ( FooterLink )
- 提取动作创造器