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

使用import()动态导入实例化类对象时返回undefined问题

动态导入实例化类对象后属性返回undefined的问题解决

在React组件中使用import()动态导入实例化类对象后,读取其属性时返回undefined。组件通过useEffect动态导入../../core/models下的模型文件,模型文件以export default导出实例化的类对象,但执行console.log(model?.name)时输出undefined,控制台无报错说明模块解析正常。

组件代码

import { IModel } from '@/core/types'

// 省略部分代码

const [model, setModel] = useState<IModel | null>(null)

useEffect(() => {
    ;(async () => {
        const data: IModel = await import(`../../core/models/${instance.component.name}Model.ts`)
        setModel(_ => data)
    })()
}, [instance.component.name])

模型代码

import { IModel } from '@/core/types'

class ToDoListModel implements IModel {
    public name: string
    public isDropContainer: boolean
    public requiredProps: string[]

    private _dropBlacklist: string[]

    constructor() {
        this.name = 'ToDoList'
        this.isDropContainer = false
        this.requiredProps = []
        this._dropBlacklist = ['Test']
    }

    public isDragAllowed = (): boolean => {
        return true
    }

    public isDropAllowed = (component: IModel): boolean => {
        return this.isDropContainer && !this._dropBlacklist.includes(component.name)
    }
}

const model = new ToDoListModel()

export default model

问题原因与解决方法

问题出在动态导入的结果处理上:import()函数返回的是一个模块对象,默认导出的内容挂载在该对象的.default属性上,而非直接返回导出的实例对象。之前的代码直接将整个模块对象赋值给了model,所以访问model.name实际是在读取模块对象的name属性,自然返回undefined。

修改组件中的动态导入逻辑,取出模块对象的.default属性即可:

useEffect(() => {
    ;(async () => {
        // 先获取模块对象
        const module = await import(`../../core/models/${instance.component.name}Model.ts`)
        // 取出默认导出的实例对象
        const data: IModel = module.default
        setModel(_ => data)
    })()
}, [instance.component.name])

这样修改后,model就会指向正确的实例化类对象,访问model.name就能得到预期的'ToDoList'值。

内容的提问来源于stack exchange,提问作者Jason Ayer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:25:55