问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Vue组件列表渲染详解

创作时间:
作者:
@小白创作中心

Vue组件列表渲染详解

引用
1
来源
1.
https://developer.mozilla.org/zh-CN/docs/Learn_web_development/Core/Frameworks_libraries/Vue_rendering_lists

在进行数据传递之前,我们要了解下 key 属性,它和 v-for 一起使用,用来帮助 Vue 标识列表中的元素,这样 Vue 就不需要在列表变化时重新创建它们。为了确保它适当地重新使用列表元素,它需要在你附加 v-for 的同一个元素上有一个独特的“key”。

为了确保 Vue 能够准确地比较 key 属性,它们需要是字符串或数字值。虽然使用名字字段很好,但这个字段最终将由用户输入控制,这意味着我们不能保证名字是唯一的。然而,我们可以使用 lodash.uniqueid(),就像我们在上一篇文章中做的那样。

导入 lodash.uniqueid

使用导入 ToDoItem 组件相同的方法导入 lodash.uniqueidApp 组件。

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 组件中的对象。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号