React Hook 的 useState 有什么小坑需要注意?

阅读时长 5 分钟读完

React Hook 是 React 16.8 引入的一种新的编程模式,它使得在函数组件中使用状态和其他 React 特性非常方便。其中最常用的 Hook 是 useState,它让我们可以在函数组件中使用局部的、可变的状态。但是,在使用 useState 的过程中,有一些小坑需要注意,本文将对这些坑点进行详细解析,并提供相应的示例代码。

useState 是怎么工作的?

在介绍小坑之前,我们先来了解一下 useState 是如何工作的。

useState 接收一个初始状态 initialState,并返回一个数组,其中:

  • state 是当前状态的值,初始值为 initialState;
  • setState 是一个函数,用于更新 state 的值。

使用 setState 更新状态时,React 会重新渲染组件,并将新的状态值传递给组件。

小坑解析

1. useState 不能在条件语句中使用

很多初学者会犯的一个错误是,在条件语句中使用 useState。例如:

这样做是有问题的。因为在每次渲染时,useState 都会重新执行一次,所以上面的代码中,如果 isLoading 为 true,则会在每次渲染时创建一个新的空数组,使得之前的数据丢失。

解决办法很简单,只需要将 useState 放在条件语句前面即可:

2. useState 的更新方式

在使用 useState 更新状态值时,有两种方式,分别是直接传入新值和传入一个更新函数。例如:

这两种方式的区别在于,直接传入新值时,React 可能会将多个 setState 调用合并为一个,在某些情况下会导致更新失效。而传入一个更新函数,则不会出现这种问题。所以,建议优先使用传入更新函数的方式。

3. useState 和组件 ref 的配合使用

在函数组件中,我们可以使用 useRef 来获取一个组件元素的引用,但是,在有些情况下,我们需要在 useState 中保存这个引用。例如,我们需要在组件加载时,对某个元素进行聚焦:

这里,inputRef 的初始值为 null,组件加载时,我们通过 setInputRef 来保存 input 元素的引用。

然后在 useEffect 中,我们通过监听 inputRef 的变化,来实现对 input 元素的聚焦。需要注意的是,此处必须将 inputRef 作为 useEffect 的依赖,否则 useEffect 将不会在 inputRef 变化时被调用。

4. useState 更新时的异步问题

在使用 Class 组件时,setState 更新状态是异步的,也就是说,更新操作不会立即生效。而在函数组件中使用 useState 时,我们需要注意它是怎么更新状态的。

虽然 useState 可以让我们在函数组件中使用状态,但是它不会保证状态更新是同步的。实际上,它会把状态更新操作放到一个队列中,等到函数退出之后,才会批量处理这些更新操作。

这可能引起一些奇怪的问题,在状态更新后的 DOM 操作中使用 state 值,可能无法得到更新后的值。例如,下面的代码:

这个问题的解决办法是使用 useEffect。

使用 useEffect 监听 count 的变化,这样在更新操作完成之后,才会执行对应的回调函数。

总结

在使用 useState 的过程中,我们需要注意以下几点:

  • 不要在条件语句中使用 useState;
  • 优先使用传入更新函数的方式更新 state;
  • 在组件 ref 和 useState 配合使用时,需要注意 useEffect 的依赖;
  • useState 更新状态是异步的,可能会导致其他问题。

希望本文对您有所帮助,让您在使用 useState 时更加得心应手。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645b0f5b968c7c53b0d6c516

纠错
反馈