Vue组件列表渲染详解
Vue组件列表渲染详解
在进行数据传递之前,我们要了解下 key
属性,它和 v-for
一起使用,用来帮助 Vue 标识列表中的元素,这样 Vue 就不需要在列表变化时重新创建它们。为了确保它适当地重新使用列表元素,它需要在你附加 v-for
的同一个元素上有一个独特的“key”。
为了确保 Vue 能够准确地比较 key
属性,它们需要是字符串或数字值。虽然使用名字字段很好,但这个字段最终将由用户输入控制,这意味着我们不能保证名字是唯一的。然而,我们可以使用 lodash.uniqueid()
,就像我们在上一篇文章中做的那样。
导入 lodash.uniqueid
使用导入 ToDoItem
组件相同的方法导入 lodash.uniqueid
到 App
组件。
import uniqueId from "lodash.uniqueid";
添加 id 字段
添加 id
字段到 ToDoItems
数组的每一个元素中,并且将他们赋值为 uniqueId('todo-')
。
此时,App.vue
中的 <script>
元素内容应该如下:
import ToDoItem from "./components/ToDoItem.vue";
import uniqueId from "lodash.uniqueid";
export default {
name: "app",
components: {
ToDoItem,
},
data() {
return {
ToDoItems: [
{ id: uniqueId("todo-"), label: "Learn Vue", done: false },
{
id: uniqueId("todo-"),
label: "Create a Vue project with the CLI",
done: true,
},
{ id: uniqueId("todo-"), label: "Have fun", done: true },
{ id: uniqueId("todo-"), label: "Create a to-do list", done: false },
],
};
},
};
使用 v-for 和 key
在你的 App.vue
模板中添加 v-for
指令和 key
属性到 <li>
元素:
<ul>
<li v-for="item in ToDoItems" :key="item.id">
<to-do-item label="My ToDo Item" :done="true"></to-do-item>
</li>
</ul>
这样修改后,<li>
标签中的 JavaScript 表达式就可以访问 item
了,这意味着我们可以使用 v-bind
来传递 item
对象的字段给 ToDoItem
组件了。这非常有用,我们想让列表中的待办事项的 label
值展示到它的 label 中,而不是显示一个静态的“My Todo Item”。此外,我们想让它们的 checked 状态反映它们的 done
字段,而不是总设置为 done="true"
。
动态绑定数据
把 label="My ToDo Item"
改成 :label="item.label"
,:done="false"
改成 :done="item.done"
,像下面这样:
<ul>
<li v-for="item in ToDoItems" :key="item.id">
<to-do-item :label="item.label" :done="item.done"></to-do-item>
</li>
</ul>
现在当你去看运行着的 app 时,你会发现待办事项显示了它们自己正确的名字,如果你查看源码的话,你会发现输入都有了唯一的 id
,它取自 App
组件中的对象。