当前位置: 首页 > 知识库问答 >
问题:

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

施英哲
2023-03-14

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

使用一个类组件,我会使用ComponentWillUnmount,我认为这会很好地工作。现在我正在使用一个功能组件,我需要使用一个useffect钩子,它有一个调用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的正确方法是什么,以便在卸载组件时只清理一次?我觉得这篇文章很好,但对解决方案不太满意,认为一定有更好的方法

共有2个答案

汪才英
2023-03-14

这可能有助于:

  const {getRootProps, getInputProps} = useDropzone({
    accept: 'image/*',
    onDrop: acceptedFiles => {
      setFiles(acceptedFiles.map(file => Object.assign(file, {
        preview: URL.createObjectURL(file)
      })));
    }
  });
  
  const thumbs = files.map(file => (
    <div style={thumb} key={file.name}>
      <div style={thumbInner}>
        <img
          src={file.preview}
          style={img}
        />
      </div>
    </div>
  ));

  useEffect(() => () => {
    // Make sure to revoke the data uris to avoid memory leaks
    files.forEach(file => URL.revokeObjectURL(file.preview));
  }, [files]);

从…起https://react-dropzone.js.org/#section-预演

卫嘉谊
2023-03-14

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

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

  React.useEffect(() => {
    return () => {
      // Cleanup blobs when component unmount
      ref.current.map((file) => URL.revokeObjectURL(file));
    };
  }, []);
 类似资料:
  • 在JSX中,如何从引用的属性值中引用来自的值? 例如: 生成的HTML输出为:

  • 问题内容: 在JSX中,如何从带引号的属性值内部引用值? 例如: 产生的HTML输出为: 问题答案: React(或JSX)不支持在属性值内进行变量插值,但您可以将任何JS表达式放在花括号内作为整个属性值,因此可以这样做:

  • 我在 时,我将收到以下YellowBox警告。 警告:失败的proType:无效的prop类型的提供给,的预期实例。检查DatePickerIOS的渲染方法。 警告:失败的propType:未在中指定所需的prop。检查的渲染方法。 警告:propType失败:提供给的类型为的prop无效,应为

  • 问题内容: 我正在尝试使用组件接收的道具使用React hook setState()设置状态。我尝试使用以下代码: 问题是加载组件时正在设置状态。但是,当它收到新的道具时,状态不会更新。在这种情况下如何更新状态?提前致谢。 问题答案: hooks函数参数仅使用一次,而不是每次prop更改时使用。您必须使用钩子来实现所谓的功能

  • 问题内容: 注意:我在使用React Native时遇到了这个特定的问题,但是我想这也同样适用于React。 我有一个使用React.Component构建的React组件。我不需要设置状态,但是我有道具。我建议的语法如下: 我知道我可以使用函数来构造此组件,如下所示: 但是我更喜欢前者,因为我的组件会增长,可能会有状态等,我只想以相似的方式构建所有组件。 现在,我的linter抱怨拥有一个无用的

  • 希望你们今天过得愉快。我是第一次对原生动画做出反应,遇到了一个问题。问题是我正在更新动画回调中的状态,就像这样 状态已更新,但当第二次调用此动画函数时,它无法访问最新状态。如果activeIndex为0,并且第一次运行时,activeIndex更新为1,但第二次调用此动画函数时,activeIndex仍然为0,并且仍然更新为1,依此类推。activeIndex在此回调外部更新—这只发生在回调内部。

  • 问题内容: 假设我在其中一个组件上具有以下render函数。我从父元素传递了prop函数。 上级: 儿童: (我正在使用ES6类) 我无法在地图功能中使用,因为没有引用我所不想要的内容。我在哪里绑定它以便可以访问我的? 问题答案: 您可以设置为通过第二个参数回调 或者您可以使用没有自己的箭头功能,并且在其中指向封闭上下文

  • 我遇到了一个大问题,其中有一个函数无法访问react中组件的道具: 但是当我把它改成一个胖箭头函数时,它工作得很好 这是为什么呢?我有什么不明白的?