解决Vue中把某些实例对象存到状态管理中后,被转成代理对象的问题

233 阅读1分钟

错误示范

class FormDraft 中有一个函数

QQ图片20230628101253.png

实例化的时候把实例化对象存到状态管理的某个地方

QQ图片20230628101310.png

在状态管理中调用之前存的实例化的对象时报错 【未捕获的类型错误:无法从类未声明的对象中读取私有成员#isAutoSaveEnabled

QQ图片20230628101313.png

QQ图片20230628101316.png

debugger可以看到报错的属性是有的,但是实例变成了一个代理对象

QQ图片20230628101326.png

解决方法

使用vue的toRaw()方法,获取代理的原始对象,使用原始对象才能正确调用

import { toRaw } from 'vue'

// 清除自动草稿保存
const formDraftInstances = this.getCurrentTab(rmTargetName)?.formDraftInstances
if (formDraftInstances) {
    for (const formDraft of [...formDraftInstances.values()]) {
        // formDraft.disableAutoSave()
        // 拿到代理的原始对象才能正确调用
        toRaw(formDraft).disableAutoSave()
    }
}

参考自

获取proxy对象中属性的值