为什么 React 钩子以这种方式命名为 useXXX?

IT技术 reactjs react-hooks
2021-05-03 23:12:02

我一直想知道 React 钩子的命名。比如useEffect,这个名字怎么暗示componentDidUpdate或者componentDidMount之类的东西,它等价于什么?而我们在组件加载后所做的这些动作不是副作用而是主要应用流程的一部分,那么为什么将这些称为副作用呢?

2个回答

为什么 React 钩子以这种方式命名为 useXXX?

来自钩子文档,使用自定义钩子

我是否必须以“use”开头命名我的自定义 Hook?请做。这个约定非常重要。没有它,我们将无法自动检查是否违反 Hooks 规则,因为我们无法判断某个函数是否包含对 Hooks 的调用。

use前缀不指示除了它是一个react发生react即已经建立作为命名约定钩其它特定功能。这类似于使用withXXXX前缀的 HOC 命名约定

为什么这些被称为副作用?

useEffect钩子用于在满足特定条件时触发效果,在这种情况下,当更新其依赖项数组中的值时。它是基于类的组件的生命周期函数的同义词,两个最常见的函数是componentDidMountcomponentDidUpdate

react状态模型被认为是使用纯函数来更新状态,即setState// useStateetc 接受输入,不会改变它们而是返回一个对象,而其他函数,例如useEffect不直接改变和返回对象,但是可以发出其他效果,例如调用异步 API 端点等。

使用数组的超级简单示例

  • array::map是一个纯函数,它遍历一个数组,将每个元素映射到一个新值,并返回一个新数组。没有副作用。(redux reducer 类似,返回下一个状态值)
  • array::forEach是一个纯函数,它遍历一个数组,为每个元素调用一个副作用回调,并返回undefined. 副作用。(调用一个API,通常没有返回值,但会在别处触发更新)

在函数式编程范式中,当函数做了一些改变其环境的事情时,它被称为 sideEffect。

在 React 中,组件的工作只是给出一个关于 ui 应该是什么样子的视图。但为此我们可能需要一些其他数据而不仅仅是props。例如:通过网络请求。并且当我们做任何事情而不仅仅是返回视图时,比如附加事件侦听器等,这些都是副作用。