# Redux

Redux 遵循了 Flux 的思想,2015年由 Dan Abramov (opens new window) 提出。二者很像,但在具体细节上有很大区别。后来 Dan 加入了 Facebook,Redux 也就成了 Facebook 官方提供的状态管理框架。

# 基础概念

  • Actions: 是一个 JS 对象,形如 { type: 'todos/add', payload: 'Buy milk' }
  • Action Creators: 返回 Action 的函数,形如 (...) => action
  • Reducers: 是一个函数,形如 (state, action) => newState
  • Immutability: Reducer 必须是纯函数,它返回的 newState 必须是 state 的深拷贝/浅拷贝,不能直接修改 state 对象本身
  • Dispatch

备注:

  • 纯函数就是其返回值只依赖入参,不依赖全局变量/资源的函数

# Action

Action 是个普通的对象,如下 dispatch 中的参数就是 Action:

store.dispatch({
  type: 'COMPLETE_TODO',
  index: 1
})

store.dispatch({
  type: 'SET_VISIBILITY_FILTER',
  filter: 'SHOW_COMPLETED'
})

# Reducer

Reducer 是纯函数,入参是 state 和 action,它需要返回一个新的 state。注意它不能直接修改 state 本身,哪怕只修改一个小字段也要构造并返回一个新的 state。一个简单的例子如下:

function todos(state = [], action) {
  switch (action.type) {
    case 'ADD_TODO':
      // 注意不能就地修改state
      // 不能通过 state.push({ text: action.text, completed: false }) 来实现
      return [
        ...state,  // 必须拷贝一份新的
        {
          text: action.text,
          completed: false
        }
      ]
    case 'COMPLETE_TODO':
      return state.map((todo, index) => {
        if (index === action.index) {
          return Object.assign({}, todo, {
            completed: true
          })
        }
        return todo
      })
    default:
      return state
  }
}

# 学习建议

可以在 Redux 英文官网 (opens new window) 学习 Redux,中文官网的文档落后很多,不建议阅读。重要的知识点有:

  • 在 React 中使用 Redux
  • 使用 Redux Toolkit 简化开发
  • 使用中间件处理异步逻辑
  • 使用 TypeScript

# 其它深入思考

Redux 规定 Reducer 不能就地修改 state,这有点反人类,会加重垃圾回收器的负担。针对这点 Dan 在 issue 上做出了回应 (opens new window),他认为不会影响性能。