State
单一
Redux应用中,所有的state都被保存在一个单一对象中。
如何以最简单的形式把state描述出来。
把state想象成数据库,减少嵌套。
Action
把数据传到store的有效载荷,是store数据的唯一来源。
一般通过store.dispatch()将action传到store。
action内必须使用字符串类型的“type”字段表示将要执行的动作。(大项目定义单独的模块或文件来存放action)。
除了“type”字段外,action的结构完全自定义。
action举例:
1 | { type: '点赞文章', articleId: 42 } |
Action创建函数
action创建函数只是返回action
1 | function addTodo(text) { |
1 | //发起一次dispatch |
Reducer
reducers指定了state的变化如何响应actions并发送到store。
1 | //传入老state和action,返回新的state |
永远不好在reducer中进行:
- 修改传入参数;
- 执行有副作用的操作,如 API 请求和路由跳转;
- 调用非纯函数,如 Date.now() 或 Math.random()。
确保reducer纯净,确保只要传入的参数相同,返回计算得到的state就一定相同。没有特殊情况。不允许有API请求等(返回的数据不同,每次新state也不同),单纯执行计算(只要代码没问题,单纯的计算结果永远相同)。
Store
单一。Redux应用只有一个单一的store。
Store的职责:
- 维持应用的 state;
- 提供 getState() 方法获取 state;
- 提供 dispatch(action) 方法更新 state;
- 通过 subscribe(listener) 注册监听器;
- 通过 subscribe(listener) 返回的函数注销监听器
可以在任何地方调用store.dispatch(action)
store会把当前的state和action,传给reducer,reducer计算出新的state,返回。API接口请求或路由跳转,都应该在dispatch之前。
异步Action
一般来说,异步API请求至少需要3种action:开始请求action、请求成功action、请求失败action。