Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 访问ComponentWillUnmount中的道具时使用react挂钩_Javascript_Reactjs - Fatal编程技术网

Javascript 访问ComponentWillUnmount中的道具时使用react挂钩

Javascript 访问ComponentWillUnmount中的道具时使用react挂钩,javascript,reactjs,Javascript,Reactjs,我正在实现一个附件组件,并试图通过在卸载组件以清理本地blob资源时调用URL.revokeObjectURL()来成为一个好公民 使用一个类组件,我会使用ComponentWillUnmount,我认为这会很好地工作。现在我正在使用一个功能组件,我需要使用一个useEffect挂钩,它有一个调用URL.revokeObjectUrl方法的清理函数。这是我的第一个方法 useEffect(() => { return () => { attachments &a

我正在实现一个附件组件,并试图通过在卸载组件以清理本地blob资源时调用URL.revokeObjectURL()来成为一个好公民

使用一个类组件,我会使用ComponentWillUnmount,我认为这会很好地工作。现在我正在使用一个功能组件,我需要使用一个useEffect挂钩,它有一个调用URL.revokeObjectUrl方法的清理函数。这是我的第一个方法

 useEffect(() => {
    return () => {
      attachments &&
        attachments.forEach((a) => {
          console.log('cleaning', a.uri);
          URL.revokeObjectURL(a.uri);
        });
    };
  });
但附件道具未定义;我读过这篇文章是因为它的值是从组件第一次渲染时开始设置的。因此,我尝试将道具添加到依赖项数组中

 useEffect(() => {
    return () => {
      attachments &&
        attachments.forEach((a) => {
          console.log('cleaning', a.uri);
          URL.revokeObjectURL(a.uri);
        });
    };
  }, [attachments]);
但当附件对象更新时,每当上传新附件时,它就会运行清理代码


实现useEffect的正确方法是什么,以便在卸载组件时只清理一次?我发现了这一点,但对解决方案不太满意,并认为一定有更好的方法

我遇到了同样的问题,找到了一种适合我的方法

我使用Ref来存储blob,而不是State。我只是在卸载组件时清理useEffect中的Ref

  React.useEffect(() => {
    return () => {
      // Cleanup blobs when component unmount
      ref.current.map((file) => URL.revokeObjectURL(file));
    };
  }, []);

我遇到了同样的问题,找到了一种适合我的方法

我使用Ref来存储blob,而不是State。我只是在卸载组件时清理useEffect中的Ref

  React.useEffect(() => {
    return () => {
      // Cleanup blobs when component unmount
      ref.current.map((file) => URL.revokeObjectURL(file));
    };
  }, []);

复制品?嗨@AnthumChris,这个问题是关于组件安装的。我正在寻找有关组件卸载的解决方案。Bhaskar Gyan Vardhan对该SO问题的第一个答案也试图回答如何使用挂钩进行卸载,但是该示例在卸载时没有使用任何组件道具。我的问题是,要访问useEffect钩子中的道具,我需要添加一个依赖项,这意味着每当依赖项发生变化时,清理功能都会运行,我只希望它在卸载时运行一次。这个答案还应该提供一些
组件将卸载的示例。你没看见他们吗?@simondefreeze你找到解决这个问题的办法了吗?我想做完全相同的事情,但也不知道如何正确调用URL.revokeObjectURL(URL),使用我在组件状态下拥有的URL。Hi@drazewski不幸的是,我还没有找到解决方案。我不确定我在这里遗漏了什么,我很惊讶没有更多的人报道这一点。这是第22条军规-如果不将附件包括在dependencies数组中,则卸载时将不会有最新的附件列表,但将其添加到dependency数组意味着它将在每次更新附件数组时运行代码。是否重复?嗨@AnthumChris,这个问题是关于组件安装的。我正在寻找有关组件卸载的解决方案。Bhaskar Gyan Vardhan对该SO问题的第一个答案也试图回答如何使用挂钩进行卸载,但是该示例在卸载时没有使用任何组件道具。我的问题是,要访问useEffect钩子中的道具,我需要添加一个依赖项,这意味着每当依赖项发生变化时,清理功能都会运行,我只希望它在卸载时运行一次。这个答案还应该提供一些
组件将卸载的示例。你没看见他们吗?@simondefreeze你找到解决这个问题的办法了吗?我想做完全相同的事情,但也不知道如何正确调用URL.revokeObjectURL(URL),使用我在组件状态下拥有的URL。Hi@drazewski不幸的是,我还没有找到解决方案。我不确定我在这里遗漏了什么,我很惊讶没有更多的人报道这一点。这是一个第二十二条军规的情况-如果您不在dependencies数组中包含附件,卸载时它将不会有最新的附件列表,但将其添加到dependency数组意味着它将在每次更新附件数组时运行代码。啊,非常聪明,我会这样做:)我仍然希望React有一个更优雅的方式来做这件事,我很惊讶更多的人对此没有问题。啊,非常聪明,我会这样做:)我仍然希望React有一个更优雅的方式来做这件事,我很惊讶更多的人对此没有问题。