Vue Array 转换为 Proxy 对象

Edu*_*les 8 javascript vue.js axios vuejs3

我是 Vue 的新手。在制作这个组件时,我卡在这里了。

我正在向使用以下代码返回数组的 API 发出 AJAX 请求:

<script>
import axios from 'axios';
export default {
  data() {
    return {
      tickets: [],
    };
  },
  methods: {
    getTickets() {
      axios.get(url)
        .then((response) => {
            console.log(response.data) //[{}, {}, {}]
            this.tickets = [...response.data]
            console.log(this.tickets) //proxy object
          })
    },
  },
  created() {
    this.getTickets();
  }
};
</script>
Run Code Online (Sandbox Code Playgroud)

问题是,this.tickets被设置为一个Proxy对象,而不是Array我从 API 获得的。

我在这里做错了什么?

Jos*_*lly 14

数据中的项目(例如您的门票)被制作成可观察的对象。这是为了允许反应性(自动重新渲染 UI 和其他功能)。这是预期的,并且返回的对象的行为应该与数组一样。

查看反应性文档,因为您需要以特定模式与数组交互,否则它将不会在 ui 上更新: https: //v3.vuejs.org/guide/reactivity-fundamentals.html

如果您不想具有反应性 - 也许您从不更新客户端上的票证而只想显示它们 - 您可以在 response.data 上使用 Object.freeze() ;

  • 这是100%真实的吗?我试图检查数组 .includes() 是否是一个值,并且它不断与索引而不是实际值进行比较。我必须对照 Object.values(array) 检查它。 (3认同)
  • 我刚刚意识到我可以像使用数组一样使用它。使用 console.logs 进行调试有点困难,无论如何,这对我来说是这样。感谢您的回复! (2认同)
  • OP 询问新的 Vue 3,文档适用于旧的 2.x 版本。如果我没记错的话,新版本中的反应性发生了很大变化,而旧文档不再正确 (2认同)

小智 7

如果您想要反应性信息,请使用 toRaw https://vuejs.org/api/reactivity-advanced.html#toraw

    const foo = {}
    const reactiveFoo = reactive(foo)
    
    console.log(toRaw(reactiveFoo) === foo) // true
Run Code Online (Sandbox Code Playgroud)

或者如果您不希望 ref 包装器围绕您的信息,请使用 unref

https://vuejs.org/api/reactivity-utilities.html#unref


mik*_*ike 6

您可以从返回的代理中检索数组响应对象,方法是将其转换为 JSON 字符串,然后再转换回数组,如下所示:

console.log(JSON.parse(JSON.stringify(this.tickets)));
Run Code Online (Sandbox Code Playgroud)


小智 5

import { isProxy, toRaw } from 'vue';

let rawData = someData;

if (isProxy(someData)){
    rawData = toRaw(someData)
}
Run Code Online (Sandbox Code Playgroud)