发布于 2026-01-06 2 阅读
0

深入探讨“useEffect”。

深入探讨“useEffect”。

useEffect 是做什么用的?

useEffect 是在 React 16.8 版本中引入的,在此之前,React 开发者通常使用 componentDidMount 和 componentWillUnmount。useEffect
是一个内置的 React Hook,允许你在函数式组件中执行副作用。这些副作用是指不会直接影响 UI 的操作,例如获取数据、添加事件监听器等等。

为什么 useEffect 接受两个参数?

它接受两个参数,第一个参数是一个函数,其中包含要执行的副作用的代码;第二个参数(可选)是要执行的次数。

第一个例子

import React, { useState, useEffect } from 'react';

function Timer() {
  const [time, setTime] = useState(0);

  useEffect(() => {
    const intervalId = setInterval(() => {
      setTime(prevTime => prevTime + 1);
    }, 1000);
  }, []);

  return <div>{time} seconds have passed.</div>;
}
Enter fullscreen mode Exit fullscreen mode

在上面的例子中,它只会在组件挂载后运行一次。

第二个例子

import React, { useState, useEffect } from 'react';

function Timer() {
  const [time, setTime] = useState(0);

  useEffect(() => {
    const intervalId = setInterval(() => {
      setTime(prevTime => prevTime + 1);
    }, 1000);
  }, [time]); 

  return <div>{time} seconds have passed.</div>;
}
Enter fullscreen mode Exit fullscreen mode

在上面的例子中,我们可以看到我是如何传递第二个参数的,这样每次“时间”改变时它都会渲染。

使用中的清理效果如何?

虽然这种方法并非总是被使用或教授,但它对于提高效率和防止内存泄漏至关重要。
我们应该在 useEffect 中运行清理操作,以避免应用程序中出现内存泄漏,从而防止应用程序运行缓慢。

清理示例

import React, { useState, useEffect } from 'react';

function Timer() {
  const [time, setTime] = useState(0);

  useEffect(() => {
    const intervalId = setInterval(() => {
      setTime(prevTime => prevTime + 1);
    }, 1000);

    return () => {
      clearInterval(intervalId);
    };
  }, [time]);

  return <div>{time} seconds have passed.</div>;
}
Enter fullscreen mode Exit fullscreen mode

在上面的示例中,我们可以看到我添加了一个返回值,该返回值将返回一个 clearInterval,该 clearInterval 将使用 intervalId 进行清理,从而避免应用程序中的内存泄漏。

希望这篇文章对大家有所帮助,如有任何疑问,欢迎随时提问,我很乐意解答。

劳塔罗。

文章来源:https://dev.to/lausuarez02/useeffect-in-deep-30hp