相关疑难解决方法(0)

无法对 ref 变量的值使用 StructuredClone()

我想在我的 Vue 应用程序中使用StructuredClone()函数。我想用它来创建深度克隆(而不是使用字符串化和解析或外部库等解决方法)。在我的设置函数中,以下代码很好

const a = {
  foo: {
    bar: "+"
  }
};
const b = structuredClone(a);

console.log(b);
Run Code Online (Sandbox Code Playgroud)

但我不可能将它用于 ref 变量的值。这个示例代码

import { ref } from "vue";
const a = ref({ foo: { bar: "+" } });
const b = structuredClone(a.value);
Run Code Online (Sandbox Code Playgroud)

抛出错误

未捕获的 DOMException:无法在“窗口”上执行“structedClone”:# 无法克隆。

对于 ref 数组中的项目也是如此

import { ref } from "vue";
const a = ref([{ foo: { bar: "+" } }]);
for (const b of a.value) {
  const c = structuredClone(b);
}
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

javascript vue.js

32
推荐指数
1
解决办法
2万
查看次数

在Vue3中,如何将嵌套代理对象(反应式数据)转换为常规对象?

I\xc2\xa0 有一个 pinia 商店,其中有一个用户对象。

\n
export const useStore = defineStore('store', {\n  state: () => ({\n    currentSlide: 1,\n    user: {},\n    data,\n  }),\n})\n
Run Code Online (Sandbox Code Playgroud)\n

vote I\xc2\xa0am 然后更新它以在用户对象内有一个数组

\n

然后投票数组有多个对象作为投票..所以 I\xc2\xa0 将数组作为 a ,user.vote然后采用这种格式[{vote:01},{vote:02}.{vote:3}]

\n

我\xc2\xa0需要将此数组推送到mongodb..但是当我\xc2\xa0尝试访问此数组时,因为它是反应数据,所以它是一个代理对象,其中包含多个代理对象。

\n

所以我尝试了toRaw(user.vote)(不确定这是否是正确的方法)并且数组不再是代理而是常规数组..但是它内部的对象(投票)仍然是代理对象..

\n

我如何\xc2\xa0从这个 pinia 结构中获取包含常规对象的常规数组以发送到 mongodb?

\n

javascript vuejs3 pinia

7
推荐指数
1
解决办法
3357
查看次数

创建代理的结构化克隆

我有一个从构造函数返回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);

}
Run Code Online (Sandbox Code Playgroud)

谁能建议解决此问题的方法?我看到了两个潜在的解决方案,但是我不知道如何实现它们:

  1. 不要从构造函数返回Proxy,而是以某种方式在类声明中维护Proxy功能。

  2. 更改代理实例,使其与结构化克隆算法一起使用。

编辑:以下更简单的代码也演示了结构化克隆错误:

const p = new Proxy({}, {});
window.postMessage(p, '*');
Run Code Online (Sandbox Code Playgroud)

javascript es6-proxy

5
推荐指数
1
解决办法
440
查看次数

标签 统计

javascript ×3

es6-proxy ×1

pinia ×1

vue.js ×1

vuejs3 ×1