我想在我的 Vue 应用程序中使用StructuredClone()函数。我想用它来创建深度克隆(而不是使用字符串化和解析或外部库等解决方法)。在我的设置函数中,以下代码很好
const a = {
  foo: {
    bar: "+"
  }
};
const b = structuredClone(a);
console.log(b);但我不可能将它用于 ref 变量的值。这个示例代码
import { ref } from "vue";
const a = ref({ foo: { bar: "+" } });
const b = structuredClone(a.value);
抛出错误
未捕获的 DOMException:无法在“窗口”上执行“structedClone”:# 无法克隆。
对于 ref 数组中的项目也是如此
import { ref } from "vue";
const a = ref([{ foo: { bar: "+" } }]);
for (const b of a.value) {
  const c = structuredClone(b);
}
如何解决这个问题?
I\xc2\xa0 有一个 pinia 商店,其中有一个用户对象。
\nexport const useStore = defineStore('store', {\n  state: () => ({\n    currentSlide: 1,\n    user: {},\n    data,\n  }),\n})\nvote  I\xc2\xa0am 然后更新它以在用户对象内有一个数组
然后投票数组有多个对象作为投票..所以 I\xc2\xa0 将数组作为 a ,user.vote然后采用这种格式[{vote:01},{vote:02}.{vote:3}]
我\xc2\xa0需要将此数组推送到mongodb..但是当我\xc2\xa0尝试访问此数组时,因为它是反应数据,所以它是一个代理对象,其中包含多个代理对象。
\n所以我尝试了toRaw(user.vote)(不确定这是否是正确的方法)并且数组不再是代理而是常规数组..但是它内部的对象(投票)仍然是代理对象..
我如何\xc2\xa0从这个 pinia 结构中获取包含常规对象的常规数组以发送到 mongodb?
\n我有一个从构造函数返回Proxy的类。当我尝试将此类的实例存储在IndexedDB中或使用发送对象时window.postMessage(),收到一条错误消息,指出无法克隆该对象。看来结构化克隆算法无法处理代理对象。
以下代码演示了该错误:
class MyClass {
  constructor() {
    return new Proxy(this, {
      set(target, prop, val, receiver) {
        console.log(`"${prop}" was set to "${val}"`);
        return Reflect.set(target, prop, val, receiver);
      }
    });
  }
}
const obj = new MyClass;
try {
  window.postMessage(obj,'*');
} catch(err) {
  console.error(err);
}谁能建议解决此问题的方法?我看到了两个潜在的解决方案,但是我不知道如何实现它们:
不要从构造函数返回Proxy,而是以某种方式在类声明中维护Proxy功能。
更改代理实例,使其与结构化克隆算法一起使用。
编辑:以下更简单的代码也演示了结构化克隆错误:
const p = new Proxy({}, {});
window.postMessage(p, '*');