返回

React组件优雅地摆脱生命周期函数

前端


在React应用程序中,有一个根组件,它的生命周期非常长,一旦创建,除非我们调用unmountComponentAtNode接口或用户关闭浏览器选项卡,否则它不会被卸载。因此,它会始终伴随整个应用程序的存在。因此,我们在根组件的componentDidMount函数中, 通常会做一些初始化操作,而在componentWillUnmount函数中,通常会做一些清理操作。

然而,随着React版本更新,生命周期函数被废弃了。我们如何优雅的消灭掉这些生命周期函数呢?我们通常可以使用useEffect和useLayoutEffect来代替componentDidMount,但对于componentWillUnmount,我们却没有任何替代方案。

但实际上,在大多数情况下,我们并不需要在componentWillUnmount函数中做任何清理操作,因为React 会自动在卸载组件时,调用清除所有的事件监听和计时器。而且,即使我们确实需要在componentWillUnmount函数中做一些清理操作,我们也可以通过使用finalize方法来实现。

使用finalize方法,首先我们需要使用useRef钩子创建一个ref,然后将组件实例赋给该ref。在finalize方法中,我们可以做一些清理操作。最后,在组件被卸载之前,React会自动调用finalize方法。

例如:

import { useEffect, useRef, finalize } from "react";

const MyComponent = () => {
  const ref = useRef();

  useEffect(() => {
    ref.current = {
      cleanup: () => {
        // 在这里做一些清理操作
      }
    };
  }, []);

  finalize(() => {
    ref.current.cleanup();
  });

  return <div>My Component</div>;
};

使用finalize方法可以很好地替代componentWillUnmount函数,而且可以确保在组件被卸载之前,我们的清理操作一定会被执行。