react 技术栈(全家桶)学习心得

React 技术栈学习,redux 知识点

2018-12-09  本文已影响32人  AndyChen

如何合理地设计 state

设计 state 总结

设计 Redux State 的关键在于,像设计数据库一样设计 state。把 state 看作应用在内存中的一个数据库,action、reducer 等看作操作这个数据库的 SQL 语句。

state 的 key

redux 的三大原则

参考

单一数据源

state 是只读的

使用纯函数来执行修改

Redux 三个基本概念

action

  1. action 是把数据从应用层传递到 store 的有效载体,它是 store 数据的唯一来源。
  2. action 本质上是 JavaScript 普通对象。
  3. 我们约定,action 内必须使用一个字符串类型的 type 字段来表示将要执行的动作。
  4. action 仅仅表示某对象发生了什么行为,我们应该尽量减少在 action 中传递的数据。

reducer

  1. action 只是描述了有事情发生了这一事实,并没有指明应用如何更新 state。
  2. 而这正是 reducer 要做的事情。reducer 就是一个纯函数,接收当前 state 和 action,返回新的 state。函数形式:(previousState, action) => newState
  3. 只要传入参数相同,返回的 newState 就一定相同。没有特殊情况、没有副作用,没有 API 请求、没有变量修改,单纯执行计算。
  4. 保持 reducer 纯净非常重要。永远不要在 reducer 里做这些操作:
    • 修改传入参数;
    • 执行有副作用的操作,如 API 请求和路由跳转;
    • 调用非纯函数,如 Date.now() 或 Math.random()。
  5. 记得不要修改 previousState 的值,创建一个新的对象返回给 newState。

store

使用 reducers 来根据 action 更新 state, 存储在 store 中。store 把之前创建的 action 和 reducer 联系在一起。
一个 Redux 应用中只有一个 store,store 保存了唯一数据源。
store 的职责有:

redux 数据流

redux 架构使用严格的单向数据流动方式,其生命周期分为以下四步:

  1. 应用调用 store.dispatch(action) 发送 Action
  2. redux 根据传入的 action 调用对应的 reducer 方法
  3. 根 reducer 把子 reducer 的结果合并成一颗 state 树
  4. redux store 保存根 reducer 生成的 state 树

得到的 state 树即为当前应用的下一个 state,所有订阅 store.subscribe(listener) 的监听器都将被调用。监听器可以调用 store.getState() 获得当前 state。

React-Redux 组件

UI 组件(presentational component)

UI 组件负责 UI 的呈现

容器组件(container component)

负责管理数据和逻辑

react-redux

react-redux 提供了一个 connect 函数,用于把 react 组件和 redux 的 store 连接起来,生成一个容器组件,负责数据管理和业务逻辑,其签名如下:

connect(mapStateToProps, mapDispatchToProps)(componentName)

mapStateToProps

输入逻辑:外部的数据(即state对象)如何转换为 UI 组件的参数。

mapDispatchToProps

输出逻辑:用户发出的动作如何变为 Action 对象,继而从 UI 组件传出去。

const mapDispatchToProps = (
  dispatch,
  ownProps
) => {
  return {
    onClick: () => {
      dispatch({
        type: 'SET_VISIBILITY_FILTER',
        filter: ownProps.filter
      });
    }
  };
}
const mapDispatchToProps = {
  onClick: (filter) => {
    type: 'SET_VISIBILITY_FILTER',
    filter: filter
  };
}

参考

  1. 有关 mapStateToProps 与 mapDispatchToProps,还可以参考《深入浅出React和Redux》P71-73,【3.2.5 React-Redux】章节。
  2. 阮一峰的网络日志 -> Redux 入门教程(三):React-Redux 的用法

    有对 connect(mapStateToProps, mapDispatchToProps)(componentName) 的详细解读,上面有关 mapStateToProps 与 mapDispatchToProps 的解读文字,均来自这篇文章(略有修改)。

  3. Redux 官方文档中文翻译
  4. Redux 文档 -> 英文原版
  5. 前端手记 TodoMVC 之 Redux 篇

扩展阅读

  1. 刘一奇 -> React 与 Redux 系列教程,一共八篇文章
  2. 理解Redux应用架构——(一)Redux结构概览
  3. 理解Redux应用架构——(二)创建store的createStore
  4. 理解Redux应用架构——(三)让你爱上的Redux middleware

个人学习心得项目地址

关于作者

上一篇下一篇

猜你喜欢

热点阅读