reactjs - 使用 react 钩子(Hook)检查组件是否已卸载?

标签 reactjs react-hooks

我正在检查组件是否已卸载,以避免调用状态更新函数。

  1. 这是第一个选项,并且有效
const ref = useRef(false)
  useEffect(() => {
    ref.current = true
    return () => {
      ref.current = false
    }
  }, [])

....
if (ref.current) {
  setAnswers(answers)
  setIsLoading(false)
}
....
  • 第二个选项是使用 useState,它的 isMounted 始终为 false,尽管我在组件 did mount 中将其更改为 true
  • const [isMounted, setIsMounted] = useState(false)
    
    useEffect(() => {
      setIsMounted(true)
      return () => {
        setIsMounted(false)
      }
    }, [])
    
    ....
    if (isMounted) {
      setAnswers(answers)
      setIsLoading(false)
    }
    ....
    

    与第一个选项相比,为什么第二个选项不起作用?

    最佳答案

    我编写了这个自定义钩子(Hook),它可以检查组件当前是否已安装,如果您有一个长时间运行的操作并且组件可能在完成并更新 UI 状态之前被卸载,则非常有用。

    import { useCallback, useEffect, useRef } from "react";
    
    export function useIsMounted() {
      const isMountedRef = useRef(true);
      const isMounted = useCallback(() => isMountedRef.current, []);
    
      useEffect(() => {
        return () => void (isMountedRef.current = false);
      }, []);
    
      return isMounted;
    }
    

    用法

    function MyComponent() {
      const [data, setData] = React.useState()
      const isMounted = useIsMounted()
    
      React.useEffect(() => {
        fetch().then((data) => {
          // at this point the component may already have been removed from the tree
          // so we need to check first before updating the component state
          if (isMounted()) {
            setData(data)
          }
        })
      }, [...])
    
      return (...)
    }
    

    现场演示

    Edit 58979309/checking-if-a-component-is-unmounted-using-react-hooks

    关于reactjs - 使用 react 钩子(Hook)检查组件是否已卸载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58979309/

    相关文章:

    javascript - 如何正确过滤数组

    mysql - 使用 Controller 的响应进行登录验证

    javascript - react 。如何在没有警告的情况下将 Grid 插入 TabPanel?

    javascript - 动态表单为第一个和第二个输入返回相同的值

    reactjs - 如果我在 React 的 useEffect 第二个参数中添加多个依赖项会怎样?

    javascript - React 初学者在将 Material-UI 示例应用到 React 项目时遇到问题。 State 与 Hooks 的工作方式不同

    javascript - react : HTML Details toggles uncontrollably when starts open

    javascript - 在 useImperativeHandle 内部调用的调度不调用操作

    reactjs - Antd 中的固定宽度列?

    reactjs - react TS2304 错误 : Cannot find name 'Component'