Я попытался использовать компоненты внутри цикла v-for
и инициализировать ref
, чтобы в будущем получить доступ к некоторым методам из родительского. Вот упрощенный код моего дела:
<template>
<div class="hello">
{{ msg }}
<ul>
<list-item
v-for="item in items"
:key="item.id"
:value="item.text"
:ref="`item${item.id}`"
/>
</ul>
</div>
</template>
<script>
import ListItem from "./ListItem";
export default {
name: "HelloWorld",
components: {
ListItem
},
data() {
return {
msg: "Welcome to Your Vue.js App",
items: [
{ id: 1, text: "foo" },
{ id: 2, text: "bar" },
{ id: 3, text: "baz" },
{ id: 4, text: "foobar" }
]
};
},
mounted() {
setTimeout(() => this.$refs.item2.highlight(), 1500);
}
};
</script>
А ListItem
компонент:
<template>
<li v-bind:class="{ highlight: isHighlighted }">
{{value}}
</li>
</template>
<script>
export default {
name: "list-item",
props: ["value"],
data() {
return {
isHighlighted: false
};
},
methods: {
highlight() {
this.isHighlighted = !this.isHighlighted;
}
}
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.highlight {
color: red;
}
</style>
Он просто отображает несколько элементов списка и выделяет один из них через полторы секунды. Но я получил ошибку: Uncaught TypeError: _this.$refs.item2.highlight is not a function
После сеанса отладки я обнаружил интересный факт: ссылки, определенные внутри цикла v-for
, являются не компонентами, а массивами с одним компонентом.
В чем логика, что такое f-обертка? Кто-нибудь встречал этот случай? Может ли кто-нибудь дать объяснение этому поведению?
Код, представленный выше, отлично работает с setTimeout(() => this.$refs.item2[0].highlight(), 1500);
Должен ли я всегда передавать [0]
? Есть ли лучший способ? Помогите, пожалуйста.