Redux

Posted by アライさん on 2021年02月25日

State

单一
Redux应用中,所有的state都被保存在一个单一对象中。
如何以最简单的形式把state描述出来。
把state想象成数据库,减少嵌套。

Action

把数据传到store的有效载荷,是store数据的唯一来源。
一般通过store.dispatch()将action传到store。
action内必须使用字符串类型的“type”字段表示将要执行的动作。(大项目定义单独的模块或文件来存放action)。
除了“type”字段外,action的结构完全自定义。
action举例:

1
2
3
{ type: '点赞文章', articleId: 42 }
{ type: '请求用户参数', response: { id: 3, name: 'Mary' } }
{ type: '插入一条数据', data: {text:'我是一条文本数据',id:11 } }

Action创建函数

action创建函数只是返回action

1
2
3
4
5
6
function addTodo(text) {
return {
type: ADD_TODO,
text
}
}
1
2
//发起一次dispatch
dispatch(addTodo('文本内容'))

Reducer

reducers指定了state的变化如何响应actions并发送到store。

1
2
//传入老state和action,返回新的state
(previousState,action) => newState

永远不好在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。