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>
关键步骤说明:
-
子组件:子组件未做改动,只是暴露了
sayHello方法。 -
父组件中的
ref数组:我们创建了一个childRefs的ref数组,用于存储子组件的实例。 -
动态设置
ref:在v-for中,调用setChildRef函数,该函数返回一个用于处理ref的回调函数。当子组件渲染时,它会将子组件的实例存储到childRefs数组中。 -
调用子组件的方法:在
callChildMethods中,可以遍历childRefs数组,调用每个子组件的sayHello方法。
注意事项
- 确保
setChildRef函数能够正确地使用el(子组件实例)来填充childRefs数组。 - 数组的索引与
componentIds对应,因此可以直接通过 ID 减去 1 来存储和访问每个子组件的实例。
这样,你就可以通过点击按钮来依次调用每个子组件的方法,确保每个组件都被正确地引用和调用。
相信坚持的力量,日复一日的习惯.

浙公网安备 33010602011771号