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

自定义Uppy React插件报错'TypeError: Cannot call a class as a function'求助

解决Uppy React插件开发中的TypeError: Cannot call a class as a function错误

我之前开发Uppy React插件时也踩过这个一模一样的坑!这个错误几乎都是因为对Uppy插件的实例化和集成方式理解有误导致的,结合你参考DragDrop插件的情况,给你梳理几个最可能的原因和解决办法:

1. 直接把Uppy插件类当函数调用了

Uppy的核心插件都是类,必须通过Uppy实例的.use()方法来注册,而不是直接调用类(比如MyPlugin()这种写法)。举个例子:

// ❌ 错误写法:把类当函数调用
const myPlugin = MyCustomPlugin(); 

// ✅ 正确写法:通过Uppy实例注册插件
import Uppy from '@uppy/core';
import MyCustomPlugin from './MyCustomPlugin';

const uppy = new Uppy();
uppy.use(MyCustomPlugin, { 
  // 你的插件配置项
  someOption: 'value'
});

2. 混淆了Uppy核心插件和React组件

如果你在JSX里直接渲染自定义插件类(比如<MyCustomPlugin />),但这个插件本质是继承自Uppy的Plugin类而非React组件,就会触发这个错误。React会尝试把它当作React组件实例化,但它并不符合React组件的要求。

  • 如果是Uppy核心插件:通过uppy.use()注册即可,不需要在JSX中渲染
  • 如果是React封装的插件组件:要确保它继承自React.Component/React.PureComponent,或者写成函数组件,并且能通过UppyProvider上下文或props获取Uppy实例

3. 自定义插件的继承或构造函数有误

参考DragDrop插件时,要确保你的插件正确继承了Uppy的Plugin类,并且在构造函数里调用了super(uppy, opts)。这是Uppy插件的必要初始化步骤:

import { Plugin } from '@uppy/core';

class MyCustomPlugin extends Plugin {
  constructor(uppy, opts) {
    // 必须先调用super初始化父类
    super(uppy, {
      // 插件默认配置
      id: 'MyCustomPlugin',
      ...opts
    });
    
    // 你的自定义初始化逻辑
    this.handleSomething = this.handleSomething.bind(this);
  }

  // 插件的其他方法,比如install、uninstall等
  install() {
    this.uppy.on('file-added', this.handleSomething);
  }
}

如果漏掉super调用或者继承错了类,会导致类的实例化过程异常,间接引发这个错误。

4. React组件中Uppy实例的生命周期管理问题

如果你在React组件内创建Uppy实例,要确保在组件挂载时注册插件,卸载时销毁Uppy实例,避免重复注册或内存泄漏。比如用useEffect来管理:

import { useEffect, useRef } from 'react';
import Uppy from '@uppy/core';
import MyCustomPlugin from './MyCustomPlugin';

function MyUppyComponent() {
  const uppyRef = useRef(null);

  useEffect(() => {
    // 初始化Uppy实例并注册插件
    uppyRef.current = new Uppy();
    uppyRef.current.use(MyCustomPlugin, { /* 配置 */ });

    // 组件卸载时销毁Uppy实例
    return () => {
      uppyRef.current?.close();
    };
  }, []);

  return (
    <div>
      {/* 这里渲染Uppy的React组件,比如Dashboard等 */}
    </div>
  );
}

如果排查完这些还是没解决问题,可以贴出你的自定义插件代码和使用它的React组件片段,这样能更精准地定位问题~

内容的提问来源于stack exchange,提问作者There is no spoon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:18:14