【发布时间】:2020-10-20 20:24:14
【问题描述】:
考虑以下示例:
<template>
<div>
<button @click="addItem">Add Item</button>
<h1>Fruits</h1>
<ul>
<li
v-for="(item, index) in items"
ref="items"
v-bind:key="item.id"
@click="logIndex(index)"
>
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
export default {
name: "Fruits",
data() {
return {
items: [
{ name: "apple", id: 1 },
{ name: "banana", id: 2 },
],
};
},
methods: {
addItem() {
const nextNumber = Math.max(...this.items.map((x) => x.id)) + 1;
this.items.unshift({
name: "peach " + nextNumber,
id: nextNumber,
});
console.log(this.$refs);
console.log(this.items);
},
logIndex(index) {
console.log(index);
console.log(this.items[index]);
console.log(this.$refs.items[index]); //this seems reasonable to assume
//using the index here would return
//the correct reference, but maybe not
},
},
};
</script>
如果您查看控制台输出,您会注意到 refs 和 item 的顺序不同。单击水果项目将记录该特定项目。您会注意到这些项目是不同的。为什么会这样?裁判的顺序不同是有原因的吗?
这里有一个 CodeSandbox 来测试它View example
一些背景知识:
我今天遇到了这种情况。例如,假设您有一个带有一组子组件的组件。如果您需要访问兄弟组件,您可以从原始组件发出,处理父组件上的事件,然后从父组件访问另一个兄弟组件。我发现如果已添加原始数组,则传递索引并使用它根本不起作用。我能够通过对组件数据使用 .find 和匹配来解决它。
我确实意识到在上述情况下使用 Vuex 或类似方法可能是理想的,但我仍然想知道 this.$refs 是否不会反映基础数据的排序顺序以及为什么会这样所以。
任何解决方法的代码示例都会很有帮助。
【问题讨论】:
标签: javascript vue.js