跳到主要内容

状态管理

用 state 响应输入

预览

  • 了解声明式 UI 变成和命令式 UI 编程有何不同
  • 了解如何列举组件可能处于的不同视图状态
  • 了解如何在代码中触发不同视图状态的变化

总结

  • 声明式编程意味着为每一个视图状态声明 UI 而非细致地控制 UI (命令式)
  • 当开发一个组件时:
    • 写出你的组件中所有的视图状态
    • 确定是什么触发了这些状态的改变
    • 通过 useState 模块化内存中的 state
    • 删除热河不必要的 state 变量
    • 连接时间处理函数去设置 state

选择 state 结构

预览

  • 使用单个 state 变量还是多个 state 变量
  • 组织 state 时应避免的内容
  • 如何解决 state 结构中的创建问题

构建 state 的原则

  • 合并关联的 state: 如果某两个 state 变量总是一起变化,则将它们统一成一个 state 便俩个可能更好
  • 避免互相矛盾的 state
  • 避免冗余的 state
  • 不要在 state 中镜像 props
  • 避免重复的 state
  • 避免深度嵌套的 state

总结

  • 如果两个 state 变量总是一起更新,请考虑将它们合并为一个。
  • 仔细选择你的 state 变量,以避免创建“极难处理”的 state。
  • 用一种减少出错更新的机会的方式来构建你的 state。
  • 避免冗余和重复的 state,这样您就不需要保持同步。
  • 除非您特别想防止更新,否则不要将 props 放入 state 中。
  • 对于选择类型的 UI 模式,请在 state 中保存 ID 或索引而不是对象本身。
  • 如果深度嵌套 state 更新很复杂,请尝试将其展开扁平化。

在组件之间共享 state

预览

  • 如何使用状态提升在组件之间共享状态
  • 什么是受控组件?什么是非受控组件

受控组件和非受控组件

通常我们把包含“不受控制”状态的组件称为“非受控组件”,相反,当组件中的重要信息是由 props 而不是其自身状态驱动时,就可以认为该组件是“受控组件”。

非受控组件通常很简单,因为它们不需要太多配置。但是当你想把它们组合在一起使用时,就不那么灵活了。受控组件具有最大的灵活性,但它们需要父组件使用 props 对其进行配置。

总结

  • 当你想要整合两个组件时,将它们的 state 移动到共同的父组件中
  • 然后在父组件中通过 props 把信息传递下去
  • 最后,向下传递事件处理程序,以便子组件可以改变父组件的 state
  • 考虑将组件视为“受控”(由 props 驱动)或是“不受控”(由 state 驱动)是十分有益的

对 state 进行保留和重置

预览

  • React 如何“处理”组件结构
  • React 何时选择保留或重置 state
  • 如何强制 React 重置组件的 state
  • key 和组件类型如何影响 state 是否被保留

总结

  • 只要在相同位置渲染的是相同组件,React 就会保留状态
  • state 不会被保存在 JSX 标签里。它与你在树中放置该 JSX 的位置相关联
  • 你可以通过为一个子树指定一个不同的 key 来重置它的 state
  • 不要嵌套组件的定义,否则你会意外地导致 state 被重置

迁移状态逻辑至 Reducer 中

预览

  • 什么是 reducer 函数
  • 如何将 useState 重构成 useReducer
  • 什么时候使用 reducer
  • 如何编写一个好的 reducer
    • reducers 必须是纯粹的
    • 每个 action 都描述了一个单一的用户交互,即使它会引发数据的多个辩护

使用 Context 深层传递参数

使用 Reducer 和 Context 来拓展你的应用