vue3 遍历渲染组件,每个组件的ref如何用遍历的id来渲染呢

在 Vue 3 中,使用 ref 动态命名并存储子组件的实例确实需要特别注意。为了让每个组件的 ref 被正确地收集,我们应该使用一个数组或对象来存储这些引用。在动态创建 ref 的情况下,可以利用 Vue 的 ref API 来确保它们被正确管理。

下面是正确的实现方法,其中我们将使用 ref 数组来存储每个子组件的实例。

子组件(ChildComponent.vue)

定义简单的子组件:

<!-- ChildComponent.vue -->
<template>
  <div>
    <h2>子组件 {{ id }}</h2>
  </div>
</template>

<script setup>
import { defineProps } from 'vue';

const props = defineProps({
  id: {
    type: Number,
    required: true
  }
});

// 在这里可以定义其他方法
function sayHello() {
  console.log(`Hello from Child Component ${props.id}!`);
}

// 暴露方法以便父组件调用
defineExpose({ sayHello });
</script>

父组件(ParentComponent.vue)

在父组件中,使用一个数组来存储子组件的 ref 实例:

<!-- ParentComponent.vue -->
<template>
  <div>
    <h1>父组件</h1>
    
    <!-- 使用 v-for 遍历组件 ID 并赋值 ref -->
    <ChildComponent 
      v-for="id in componentIds" 
      :key="id" 
      :id="id" 
      :ref="setChildRef(id)" 
    />
    
    <button @click="callChildMethods">调用所有子组件的方法</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

// 定义组件的 ID 列表
const componentIds = [1, 2, 3, 4, 5];

// 创建一个数组来存储子组件的引用
const childRefs = ref([]);

// 函数,用于设置子组件的 ref
const setChildRef = (id) => (el) => {
  if (el) {
    childRefs.value[id - 1] = el; // 存储子组件实例
  }
};

// 定义调用所有子组件方法的函数
const callChildMethods = () => {
  childRefs.value.forEach((child) => {
    if (child) {
      child.sayHello(); // 调用子组件的方法
    }
  });
};
</script>

关键步骤说明:

  1. 子组件:子组件未做改动,只是暴露了 sayHello 方法。

  2. 父组件中的 ref 数组:我们创建了一个 childRefsref 数组,用于存储子组件的实例。

  3. 动态设置 ref:在 v-for 中,调用 setChildRef 函数,该函数返回一个用于处理 ref 的回调函数。当子组件渲染时,它会将子组件的实例存储到 childRefs 数组中。

  4. 调用子组件的方法:在 callChildMethods 中,可以遍历 childRefs 数组,调用每个子组件的 sayHello 方法。

注意事项

  • 确保 setChildRef 函数能够正确地使用 el(子组件实例)来填充 childRefs 数组。
  • 数组的索引与 componentIds 对应,因此可以直接通过 ID 减去 1 来存储和访问每个子组件的实例。

这样,你就可以通过点击按钮来依次调用每个子组件的方法,确保每个组件都被正确地引用和调用。

posted @ 2025-12-30 11:22  盘思动  阅读(28)  评论(0)    收藏  举报