useEffect为何存在?

215 阅读2分钟

useEffect为何存在?

React中的组件通常用于渲染用户界面,但有时也需要执行一些与界面无关的操作,比如订阅数据源、手动管理DOM、发起网络请求等。这些操作被称为副作用

在React中,副作用的处理原本是通过生命周期方法来完成的,比如componentDidMount、componentDidUpdate和componentWillUnmount。然而,这些生命周期方法在使用时需要编写重复的代码,并且容易引起混乱。

为了解决这个问题,React团队在React 16.8版本引入了useEffect钩子。它允许开发者在函数组件中定义副作用操作,并通过声明式的方式管理它们。

使用useEffect可以更简洁地表达组件的副作用行为,并提供了更好的可读性和可维护性。

useEffect的工作原理是:每当组件渲染完成后(包括首次渲染和更新),都会执行useEffect中定义的副作用操作。可以通过设置依赖项数组来控制何时触发副作用的执行。

尽管useEffect提供了便利,但它也有一些缺点。其中一点是,如果不正确地使用useEffect,可能会导致性能问题或产生意外的行为。例如,在useEffect中未正确处理依赖项数组,可能会导致无限循环的副作用触发。另外,由于useEffect在每次渲染后都会执行,可能会导致一些不必要的重复操作

所以, 并非创建任何组件都要使用useEffect,比如转换数据以进行渲染和事件处理。

如何正确使用useEffect来获取数据?

因为useEffect不仅在组件加载后会执行,在组件更新后也可能会执行,这样会导致一些问题存在。

需要记住useEffect和它的第二个参数之间的关系:

  • useEffect在组件加载后,将会执行一次;
  • 当useEffect的第二个参数(数组),没有传入,则在组件每次更新之后,useEffect都会执行一次;
  • 当useEffect的第二个参数是一个空数组,useEffect在组件更新后,不会执行;
  • 当useEffect的第二个参数不是一个空数组,useEffect在组件更新后,是否会执行,取决于该数组中的的某个元素时候是否发生了变化。如果没有一个元素发生了变化,则useEffect不会执行。
useEffect(() => {}, []);