我正在对数组进行洗牌,并在控制台中收到一条奇怪的消息。
我的 JSON 文件如下所示:
[
{
"id": 1,
"name": "Sushi",
"image": "https://images.pexels.com/photos/1640777/pexels-photo-1640777.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500",
"price": 7.99,
"restaurant": "Sushi Garden",
"city": "Burnaby",
"googleMap": "https://www.google.com",
"keywords": "Lorem ipsum",
"onlineOrders": {
"foodly": "https://www.google.com",
"doorDash": "https://www.daum.net",
"skipTheDish": "https://www.naver.com"
}
},
{
"id": 2,
"name": "Noodle",
"image": "https://images.pexels.com/photos/1640777/pexels-photo-1640777.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500",
"price": 7.99,
"restaurant": "Restaurant Name",
"city": "Burnaby",
"googleMap": "https://www.google.com",
"keywords": "Lorem ipsum",
"onlineOrders": {
"foodly": "https://www.google.com"
}
},
...
这是我的组件,用于打乱食物对象数组。
import foods from "/json/foods.json";
import _ from "lodash";
...
created: function () {
this.retrievedFoods = foods;
this.randomizeFoodsOrder();
},
data() {
return {
retrievedFoods: [],
};
},
methods: {
randomizeFoodsOrder() {
let temp = foods;
console.log(temp); // Array
this.retrievedFoods = _.shuffle(temp);
console.log(this.retrievedFoods); // Proxy????
},
...
但是,洗牌后我在控制台日志上得到了这个
Proxy
的东西。
这可能是什么问题?是什么将其更改为代理?
TLDR:控制台仍然显示预期值,并且您仍然与变量交互,就像它没有说 Proxy 一样。
A proxy 是一个强大的 JavaScript ES6 功能,它允许您拦截与目标对象的任何交互并执行自定义行为。 如果您熟悉事件侦听器,您可以将代理视为一种用于对象交互的事件侦听器。
Vue 3 反应性指南 解释了这样的代理:
代理是一个封装另一个对象或函数并允许您拦截它的对象。
代理是隐秘的“包装”对象,它不仅可以拦截目标的write事件(即对象突变/更改),甚至还可以拦截read事件(即仅读取属性值)。 此功能是 Vue 3 通过使用代理来跟踪数据更改并触发更新来实现
reactive
变量的反应性的方式。 (在 Vue 2 中,这是通过 getters 和 setters 完成的。)
所有代理在控制台中都有 Proxy 标签,让您知道记录的对象有代理拦截它。 然后,您可以在控制台中单击以展开代理以查看其正在执行的操作。 目标对象可以在代理的
[[Target]]
属性中找到。
那么这对 Vue 3 中与响应式对象交互的方式有何影响? 不多。 您仍然以与没有代理一样的方式与目标对象交互,没有特殊的语法。
检查一下,Vue3 中有一个内置函数 toRaw,您可以使用它来解构代理。我刚刚发现了这个,它帮助我访问了我的 pinia 商店中的一个对象中的功能,该对象无法通过它自动包装的代理工作。
import { isProxy, toRaw } from 'vue';
const editor = toRaw(myStore.editor)
我从这里
学到了这个您可以使用下面的 ES6 语法或使用 Vue 的 toRaw 来解构代理。
import { reactive, toRaw } from 'vue'
const state = reactive({msg:'hello world'});
console.log({...state});
console.log(toRaw(state));