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

Vue3中v-for遍历props数据时模板refs为null的解决办法

Vue 3.5.13中v-for内模板refs返回null的解决方法

问题原因

onMounted钩子执行时,父组件传入的data props可能尚未完成传递或更新(比如父组件异步获取数据后才传入),此时子组件的v-for还未渲染出DOM元素,因此useTemplateRef返回的refs数组为null。

解决方案

1. 监听props数据变化,就绪后获取refs

通过watch监听data props的变化,确保数据存在且有效时再访问refs:

<template>
  <div ref="items" v-for="(item, index) in data" :key="index">{{ item }}</div>
</template>

<script setup>
import { defineProps, watch, useTemplateRef } from 'vue'

const props = defineProps({ data: Array })
const items = useTemplateRef('items')

// 监听data变化,数据就绪时打印refs
watch(() => props.data, (newData) => {
  if (newData?.length) {
    console.log(items.value)
  }
}, { immediate: true }) // 立即执行一次,处理初始传入的同步数据
</script>

2. 用nextTick等待DOM更新完成

如果父组件是同步传递数据,可在onMounted中通过nextTick等待DOM渲染完成后再访问refs:

<template>
  <div ref="items" v-for="(item, index) in data" :key="index">{{ item }}</div>
</template>

<script setup>
import { defineProps, useTemplateRef, onMounted, nextTick } from 'vue'

const props = defineProps({ data: Array })
const items = useTemplateRef('items')

onMounted(async () => {
  await nextTick() // 等待v-for渲染的DOM更新完成
  console.log(items.value)
})
</script>

3. 手动收集refs(兼容式方案)

若useTemplateRef仍有问题,可手动创建ref数组,通过ref回调函数收集DOM元素:

<template>
  <div 
    v-for="(item, index) in data" 
    :key="index" 
    :ref="el => el && (items[index] = el)"
  >{{ item }}</div>
</template>

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

const props = defineProps({ data: Array })
const items = ref([])

// 数据更新时重置refs数组
watch(() => props.data, () => {
  items.value = []
}, { immediate: true })

onMounted(async () => {
  await nextTick()
  console.log(items.value)
})
</script>

核心总结

本质是要确保v-for依赖的数据源已就绪且对应的DOM元素已渲染完成,再去访问模板refs。根据父组件数据传递的时机(同步/异步),选择对应的等待方式即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 02:21:16