小编Byr*_*son的帖子

React hooks 异步清理警告舞蹈

我见过一些类似的问题,但没有一个措辞完全像这样:

我有一个通过声明式 React 组件模型公开的命令式 API,并且在大多数情况下它运行得很好,但我遇到了一些我不知道如何解决的警告,所以我一直忽略。

我有一个自定义挂钩,大致如下所示:

function useViewer(someDependency) {
  const [ready, setReady] = useState(true);
  useEffect(() => {
    if (!ready) return;
    const viewer = makeViewer(someDependency);
    return () => {
      setReady(false);
      viewer.cleanup().then(() => setReady(true));
    }
  }, [someDependency, ready]);
}
Run Code Online (Sandbox Code Playgroud)

该标志的要点ready是查看器的清理需要在创建后续查看器之前进行。

然而,当我这样做时,我收到以下警告:

警告:无法对已卸载的组件执行 React 状态更新。这是一个空操作,但它表明应用程序中存在内存泄漏。要修复此问题,请取消 useEffect 清理函数中的所有订阅和异步任务。

我可以在组件卸载时不发生状态更新,如下所示:


function useViewer(someDependency) {
  const [ready, setReady] = useState(true);
  const hasUnmountedRef = useHasUnmounted();
  useEffect(() => {
    if (!ready) return;
    const viewer = makeViewer(someDependency);
    return () => {
      setReady(false);
      viewer.cleanup().then(() => {
        const hasUnmounted = …
Run Code Online (Sandbox Code Playgroud)

reactjs

6
推荐指数
0
解决办法
823
查看次数

标签 统计

reactjs ×1