You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保React组件中文件上传初始化代码仅执行一次?

解决StrictMode下重复创建文件上传控件的问题

你遇到的问题是因为React StrictMode在开发环境中会两次执行副作用函数,加上HMR热更新时组件重新挂载,导致每次都新建了FileUploadWithPreview实例,从而出现多个控件。要让初始化代码只执行一次,需要做好副作用清理,同时用useRef持久化实例:

import { useState, useEffect, useRef } from 'react';

export default function YourUploadComponent({ multiple }) {
  const uploadFieldRef = useRef(null);

  useEffect(() => {
    // 仅当实例未创建时执行初始化
    if (!uploadFieldRef.current) {
      uploadFieldRef.current = new FileUploadWithPreview('fileUpload', {
        multiple: multiple,
      });

      const handleImageAdded = (e) => {
        const { detail } = e;
        console.log('detail', detail);
      };

      window.addEventListener(Events.IMAGE_ADDED, handleImageAdded);

      // 组件卸载/重渲染时清理资源
      return () => {
        uploadFieldRef.current?.destroy();
        window.removeEventListener(Events.IMAGE_ADDED, handleImageAdded);
        uploadFieldRef.current = null;
      };
    }
  }, [multiple]);

  return (
    <div id="fileUpload"></div>
  );
}

关键处理细节:

  • 用useRef持久化实例:useRef的current属性不会随组件重渲染重置,能保证实例只被创建一次。
  • 添加清理逻辑:调用实例的destroy()方法(该库内置的销毁API),同时移除事件监听,避免内存泄漏和残留控件。
  • 实例存在性判断:防止StrictMode双重执行、HMR热更新时重复创建实例。

另外要确保页面中id="fileUpload"的容器唯一,避免多个组件实例冲突。

内容的提问来源于stack exchange,提问作者Ali Radan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:40:27