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

Vue中v-for的list变量使用ref的实际作用是什么?

为什么Vue文档中v-for的list要用ref包裹?

你观察到的现象没错——静态普通数组确实能让itemRefs正常收集DOM引用,但文档里给list加ref()是为了适配动态数据场景,这才是实际项目里的常见需求,具体原因如下:

1. 动态更新列表时,确保itemRefs同步更新

如果你的列表需要后续修改(比如添加、删除元素,或者从接口加载新数据),只有用ref()包裹的数组才能触发Vue的响应式更新:

  • 当list是ref时,修改list.value(比如list.value.push(4)),Vue会重新渲染v-for生成新的DOM,同时itemRefs会自动更新,包含新增/删除后的DOM元素。
  • 如果用普通数组,直接修改数组(比如list.push(4)),Vue无法检测到变化,页面不会重新渲染,itemRefs也不会同步更新,导致引用和实际DOM不一致。

举个对比例子:

带ref的list(支持动态更新)

<script setup>
import { ref, onMounted } from 'vue'

const list = ref([1, 2, 3])
const itemRefs = ref([])

onMounted(() => {
  // 模拟后续更新列表
  setTimeout(() => {
    list.value.push(4)
    console.log(itemRefs.value.length) // 输出4,和DOM数量一致
  }, 1000)
})
</script>

<template>
  <ul>
    <li v-for="item in list" ref="itemRefs">{{ item }}</li>
  </ul>
</template>

不带ref的list(无法同步更新)

<script setup>
import { ref, onMounted } from 'vue'

const list = [1, 2, 3]
const itemRefs = ref([])

onMounted(() => {
  setTimeout(() => {
    list.push(4)
    console.log(itemRefs.value.length) // 还是输出3,和实际DOM数量(4)不一致
  }, 1000)
})
</script>

<template>
  <ul>
    <li v-for="item in list" ref="itemRefs">{{ item }}</li>
  </ul>
</template>

2. 文档示例的通用性

文档的示例是为了覆盖大多数实际开发场景——项目里的列表数据几乎都是动态的:可能从后端接口获取、可能由用户操作修改,用ref()包裹是标准的响应式写法,确保开发者在扩展功能时不会踩响应式的坑。

总结

静态场景下普通数组能工作,但ref(list)是为了让列表具备响应式能力,保证数据变化时,DOM和itemRefs能同步更新,这才是实际项目中更有价值的用法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:01:27