Vue 3 控制台中的 Proxy 是什么意思?

问题描述 投票:0回答:3

我正在对数组进行洗牌,并在控制台中收到一条奇怪的消息。

我的 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
的东西。

enter image description here

这可能是什么问题?是什么将其更改为代理?

javascript vue.js vuejs3 lodash es6-proxy
3个回答
32
投票

TLDR:控制台仍然显示预期值,并且您仍然与变量交互,就像它没有说 Proxy 一样。


A proxy 是一个强大的 JavaScript ES6 功能,它允许您拦截与目标对象的任何交互并执行自定义行为。 如果您熟悉事件侦听器,您可以将代理视为一种用于对象交互的事件侦听器。

Vue 3 反应性指南 解释了这样的代理:

代理是一个封装另一个对象或函数并允许您拦截它的对象。

代理是隐秘的“包装”对象,它不仅可以拦截目标的write事件(即对象突变/更改),甚至还可以拦截read事件(即仅读取属性值)。 此功能是 Vue 3 通过使用代理来跟踪数据更改并触发更新来实现

reactive
变量的反应性的方式。 (在 Vue 2 中,这是通过 getterssetters 完成的。)

所有代理在控制台中都有 Proxy 标签,让您知道记录的对象有代理拦截它。 然后,您可以在控制台中单击以展开代理以查看其正在执行的操作。 目标对象可以在代理的

[[Target]]
属性中找到。

那么这对 Vue 3 中与响应式对象交互的方式有何影响? 不多。 您仍然以与没有代理一样的方式与目标对象交互,没有特殊的语法。


15
投票

检查一下,Vue3 中有一个内置函数 toRaw,您可以使用它来解构代理。我刚刚发现了这个,它帮助我访问了我的 pinia 商店中的一个对象中的功能,该对象无法通过它自动包装的代理工作。

import { isProxy, toRaw } from 'vue';

const editor = toRaw(myStore.editor)

我从这里

学到了这个

5
投票

您可以使用下面的 ES6 语法或使用 Vue 的 toRaw 来解构代理。

import { reactive, toRaw } from 'vue'
const state = reactive({msg:'hello world'});

console.log({...state});  
console.log(toRaw(state));    
© www.soinside.com 2019 - 2025. All rights reserved.