React-hooks:useReducer

useReducer 文档地址

useReducer 是一个 React Hook,它允许你向组件里面添加一个 reducer

对于拥有许多状态更新逻辑的组件来说,过于分散的事件处理程序可能会令人不知所措。对于这种情况,你可以将组件的所有状态更新逻辑整合到一个外部函数中,这个函数叫做reducer

const [state, dispatch] = useReducer(reducer, initialArg, init?)
参数:
  • reducer:用于更新 state 的纯函数。参数为 state 和 action,返回值是更新后的 state。state 与 action 可以是任意合法值。
  • initialArg:用于初始化 state 的任意值。初始值的计算逻辑取决于接下来的 init 参数。
  • 可选参数 init:用于计算初始值的函数。如果存在,使用 init(initialArg) 的执行结果作为初始值,否则使用 initialArg。
返回值:

返回一个由两个值组成的数组:

  1. 当前的 state。初次渲染时,它是init(initialArg)initialArg (如果没有 init 函数)。
  2. dispatch 函数。用于更新 state并触发组件的重新渲染。
注意事项:
  • useReducer 是一个 Hook,所以只能在 **组件的顶层作用域 **或自定义 Hook 中调用,而不能在循环或条件语句中调用。如果你有这种需求,可以创建一个新的组件,并把 state 移入其中。
  • 严格模式下 React 会 调用两次 reducer 和初始化函数,这可以 帮助你发现意外的副作用。这只是开发模式下的行为,并不会影响生产环境。只要 reducer 和初始化函数是纯函数(理应如此)就不会改变你的逻辑。其中一个调用结果会被忽略。

对比 useState 和 useReducer

  • 代码体积: 通常,在使用 useState 时,一开始只需要编写少量代码。而 useReducer 必须提前编写 reducer 函数和需要调度的 actions。但是,当多个事件处理程序以相似的方式修改 state 时,useReducer 可以减少代码量。
  • 可读性: 当状态更新逻辑足够简单时,useState 的可读性还行。但是,一旦逻辑变得复杂起来,它们会使组件变得臃肿且难以阅读。在这种情况下,useReducer 允许你将状态更新逻辑与事件处理程序分离开来。
  • 可调试性: 当使用 useState 出现问题时, 你很难发现具体原因以及为什么。 而使用 useReducer 时, 你可以在 reducer 函数中通过打印日志的方式来观察每个状态的更新,以及为什么要更新(来自哪个 action)。 如果所有 action 都没问题,你就知道问题出在了 reducer 本身的逻辑中。 然而,与使用 useState 相比,你必须单步执行更多的代码。
  • 可测试性: reducer 是一个不依赖于组件的纯函数。这就意味着你可以单独对它进行测试。一般来说,我们最好是在真实环境中测试组件,但对于复杂的状态更新逻辑,针对特定的初始状态和 action,断言 reducer 返回的特定状态会很有帮助。
编写一个好的 reducers

编写 reducers 时最好牢记以下两点:

  • reducers 必须是纯粹的。 这一点和 状态更新函数 是相似的,reducers 在是在渲染时运行的!(actions 会排队直到下一次渲染)。 这就意味着 reducers 必须纯净,即当输入相同时,输出也是相同的。它们不应该包含异步请求、定时器或者任何副作用(对组件外部有影响的操作)。它们应该以不可变值的方式去更新 对象 和 数组。
  • 每个 action 都描述了一个单一的用户交互,即使它会引发数据的多个变化。 举个例子,如果用户在一个由 reducer 管理的表单(包含五个表单项)中点击了 重置按钮,那么 dispatch 一个 reset_form 的 action 比 dispatch 五个单独的 set_field 的 action 更加合理。如果你在一个 reducer 中打印了所有的 action 日志,那么这个日志应该是很清晰的,它能让你以某种步骤复现已发生的交互或响应。这对代码调试很有帮助!

相关推荐

  1. <span style='color:red;'>react</span>

    react

    2024-04-20 23:38:04      58 阅读
  2. React

    2024-04-20 23:38:04       58 阅读
  3. React

    2024-04-20 23:38:04       36 阅读
  4. React

    2024-04-20 23:38:04       29 阅读
  5. <span style='color:red;'>react</span>

    react

    2024-04-20 23:38:04      24 阅读
  6. <span style='color:red;'>React</span>

    React

    2024-04-20 23:38:04      21 阅读
  7. ReactNative

    2024-04-20 23:38:04       39 阅读
  8. ReactReact native

    2024-04-20 23:38:04       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-20 23:38:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-20 23:38:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-20 23:38:04       82 阅读
  4. Python语言-面向对象

    2024-04-20 23:38:04       91 阅读

热门阅读

  1. el-table 遇到的问题一

    2024-04-20 23:38:04       31 阅读
  2. 使用JWT、Redis + token实现用户登录的两种方式。

    2024-04-20 23:38:04       31 阅读
  3. Android 13 有线以太网静态ip保存逻辑梳理分析

    2024-04-20 23:38:04       28 阅读
  4. 使用Python实现超参数调优

    2024-04-20 23:38:04       34 阅读
  5. Swift知识点 --- AnyView

    2024-04-20 23:38:04       39 阅读
  6. hyref 开发者推荐项目

    2024-04-20 23:38:04       35 阅读
  7. React Flow浏览器默认事件失效问题解决

    2024-04-20 23:38:04       32 阅读
  8. npm 更改国内镜像的方法

    2024-04-20 23:38:04       38 阅读
  9. 等保测评:网络安全法规框架下的关键合规实践

    2024-04-20 23:38:04       39 阅读