react effect定义和清除的方法

387 阅读2分钟

1.react 副作用

你之前可能已经在 React 组件中执行过数据获取、订阅或者手动修改过 DOM。我们统一把这些操作称为“副作用”,或者简称为“作用”。

useEffect 就是一个 Effect Hook,给函数组件增加了操作副作用的能力。

当你调用 useEffect 时,就是在告诉 React 在完成对 DOM 的更改后运行你的“副作用”函数。由于副作用函数是在组件内声明的,所以它们可以访问到组件的 props 和 state。

默认情况下,React 会在每次渲染后调用副作用函数 —— 包括第一次渲染的时候。

2.清除副作用

副作用函数还可以通过返回一个函数来指定如何“清除”副作用。

useEffect(() => {

    function handleStatusChange(status) {

      setIsOnline(status.isOnline);

    }


    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);

    // Specify how to clean up after this effect:

    return function cleanup() {

    ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);

    };

  });

为什么要在 effect 中返回一个函数?  这是 effect 可选的清除机制。每个 effect 都可以返回一个清除函数。如此可以将添加和移除订阅的逻辑放在一起。它们都属于 effect 的一部分。

这个清除的功能我也是最近才注意到,很适合应用于清除定时器的场景。

3.写法

  • 只在最顶层使用 Hook

不要在循环,条件或嵌套函数中调用 Hook,  确保总是在你的 React 函数的最顶层以及任何 return 之前调用他们。遵守这条规则,你就能确保 Hook 在每一次渲染中都按照同样的顺序被调用。这让 React 能够在多次的 useState 和 useEffect 调用之间保持 hook 状态的正确。

  • 只在 React 函数中调用 Hook

不要在普通的 JavaScript 函数中调用 Hook。 你可以:

✅ 在 React 的函数组件中调用 Hook

✅ 在自定义 Hook 中调用其他 Hook

  • 使用多个 Effect 实现关注点分离