reactjs - 在卸载组件之前删除 React 组件状态

标签 reactjs use-effect use-state debouncing react-component-unmount

如果我从 useEffect 返回一个函数,我可以确定该函数将在组件卸载时运行。但是 React 似乎在调用我的卸载函数之前删除本地状态。

考虑一下:

function Component () {

  const [setting, setSetting] = useState(false)

  useEffect(() => {

    setSetting(true)

    // This should be called when unmounting component
    return () => {

      console.log('Send setting to server before component is unmounted')
      console.log(setting) // false (expecting setting to be true)
      
    }
  }, [])
  
  return (
    <p>Setting is: {setting ? 'true' : 'false'}</p>
  )
}

谁能确认预期的行为是应该删除组件状态?而且,如果这是正确的行为,那么如何在卸载组件之前将当前组件状态发送到服务器?

为了提供一些上下文,我正在对服务器的发布请求进行去抖动处理,以避免每次用户更改设置时都触发​​它。去抖动效果很好,但我需要一种方法来在用户离开页面时触发请求,因为排队的去抖动方法将不再从卸载的组件中触发。

最佳答案

并不是 React“抹掉状态值”,而是你有 closure关于设置值(挂载时的值)。

要获得预期的行为,您应该使用 ref 和另一个 useEffect 使其保持最新。

function Component() {
  const [setting, setSetting] = useState(false);

  const settingRef = useRef(setting);

  // Keep the value up to date
  // Use a ref to sync the value with component's life time
  useEffect(() => {
    settingRef.current = setting;
  }, [setting])
  

  // Execute a callback on unmount.
  // No closure on state value.
  useEffect(() => {
    const setting = settingRef.current;
    return () => {
      console.log(setting);
    };
  }, []);

  return <p>Setting is: {setting ? "true" : "false"}</p>;
}

关于reactjs - 在卸载组件之前删除 React 组件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65290212/

相关文章:

reactjs - 将 MediaRecorder 分块到 Google Cloud 平台时视频上传损坏

node.js - React App 安装后编译失败

react-native - 如何在单一useEffect react native中使用focus和blur listener

javascript - 无法使用 microbundle 和 React 渲染自定义组件包中的 useState、useEffect Hook

javascript - React - 重构类组件以将部件移动到功能组件

javascript - 将钩子(Hook)置于某种状态

reactjs - 取消 Context.Consumer 创建的 useEffect 清理函数中的所有订阅

reactjs - React useEffect 强制我添加触发无限循环的依赖项

javascript - 如何在对象数组中使用 usestate 更新状态?

dependencies - 使用 useEffect 和 useState 避免 ESLint 'react-hooks/exhaustive-deps' 警告