You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nuxt 3中useFetch返回Proxy对象,如何获取普通数组/对象?

Nuxt 3 中 useFetch 返回 Proxy 对象的正确处理方式

为什么会出现 Proxy 对象?

Nuxt 3 的 useFetch 会自动把响应数据包装成 Vue 3 的响应式 Proxy 对象,目的是让数据能在模板或组件逻辑中自动响应变化,这和 Nuxt 2 里 Axios 直接返回普通对象/数组的行为不同。

正确处理方式

你不需要反复调用 toRaw,以下几种方式可以高效处理:

1. 非响应式场景:用 transform 钩子转换数据

如果不需要数据保持响应式,或者想直接拿到普通对象/数组,可以在 useFetch 里通过 transform 钩子做深拷贝转换:

const { data: myData } = await useFetch("/api/items", {
  query: { location: destination.value, radius: searchRadius.value },
  // 用 JSON 序列化反序列化实现深拷贝
  transform: (res) => JSON.parse(JSON.stringify(res))
})

也可以用更现代的 structuredClone:

transform: (res) => structuredClone(res)

2. 响应式场景:直接使用无需手动转换

如果是在模板里渲染数据,Vue 会自动解包 Proxy,直接写 {{ myData }} 就能正常显示数组/对象内容。

在 <script setup> 的响应式逻辑(比如计算属性、watch)里,也能直接访问 myData.value 的属性,Vue 会自动处理解包:

const filteredItems = computed(() => {
  return myData.value?.filter(item => item.price < 100)
})

3. 一次性获取普通数据

如果确实需要拿到完全普通的数组/对象,调用一次 toRaw 后做深拷贝即可:

const rawItems = structuredClone(toRaw(myData.value))
// 此时 rawItems 是彻底的普通数组,不会再是 Proxy

为什么 [...toRaw(myData.value)] 还是 Proxy?

toRaw(myData.value) 返回的数组本身是普通数组,但数组里的每一项元素可能还是响应式 Proxy。扩展运算符只是浅拷贝数组,内部元素依然是 Proxy,所以需要深拷贝才能彻底转为普通值。


内容的提问来源于stack exchange,提问作者Family

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:05:18