跳到主要内容

简述在函数组件中使用哪个Hook可以包裹副作用(改变 DOM、添加订阅、设置定时器、记录日志等) ?

参考答案:

在函数组件中,你可以使用 useEffect Hook 来包裹副作用。useEffect 允许你在函数组件中执行副作用操作,这些操作可能包括改变 DOM、添加订阅、设置定时器、记录日志等。

useEffect 的基本用法如下:

import React, { useEffect } from 'react';

function Example() {
  useEffect(() => {
    // 副作用代码
    // 这个函数会在组件渲染后执行,并且在每次组件的 props 或 state 发生变化时重新执行

    // 例如,我们可以添加订阅、设置定时器、改变 DOM 等
    const subscription = props.source.subscribe();
    const id = setInterval(() => {
      console.log('每秒打印一次');
    });

    // 清除副作用的代码应该放在这个返回的函数中
    // 这样,当组件卸载或 props/state 发生变化时,我们可以清除之前的副作用
    return () => {
      subscription.unsubscribe();
      clearInterval(id);
    };
  }, [props.source]); // 依赖列表,当这些值发生变化时,副作用函数会重新执行

  return <div>Hello, World!</div>;
}

在这个例子中,useEffect 的回调函数包含了一些副作用代码。当 Example 组件首次渲染时,这个回调函数会被执行。当 props.source 发生变化时,回调函数也会被执行。在返回的函数中,我们清除了之前的副作用,以确保不会出现内存泄漏或其他问题。

需要注意的是,useEffect 的回调函数会在每次组件渲染后执行,因此你应该避免在其中执行过于昂贵的操作,以免影响性能。如果你需要执行的操作只会在组件首次渲染后执行一次,你可以将依赖列表留空,如下所示:

useEffect(() => {
  // 只会在组件首次渲染后执行一次的副作用代码
}, []);