VUE v-for中的:key详解

yizhihongxing

当在 Vue 的模板中使用 v-for 来循环渲染一组 DOM 元素时,每个被渲染的元素都要有一个唯一的 key 属性。这个属性在 Vue 的模板编译器中扮演着非常重要的角色,它可以帮助 Vue 跟踪每个被渲染的元素的身份和状态,从而优化渲染效果。

key 的作用

一个简单的示例,我们假设一个列表,其中有一些元素是需要从列表中删除的,那么删除时就需要更新数据源,并调用 Vue 中的 splice() 方法,在更新后, DOM 会进行重渲染。但是,由于 Vue 是采用高效的 “就地重用” 策略,并且不会每次都创建新的 DOM 元素,而是尽可能的复用已经存在的元素,然后在 JavaScript 中对其进行更新。

如果没有为 v-for 循环中的每个元素提供一个唯一的 key,那么 Vue 可能无法识别新的更新内容,并且会把之前存在的元素错误的重复使用到更新过的 DOM 中。如果你提供了一个唯一的 key,Vue 在进行 DOM 操作时就会基于 key 来决定使用已有的节点或者生成新节点。

key 的用法

v-for 模板中使用 key,只需要在被循环的元素上增加 :key 属性即可。例如:

<template>
  <ul>
    <li v-for="item in items" :key="item.id">{{ item.title }}</li>
  </ul>
</template>

在上面的例子中,我们假设数组 items 中的每个元素都有一个 id 属性。Vue 将使用 id 属性来映射每个 DOM 节点,并且当更新数组 items 时,会根据节点的 key 值来决定是否进行原地更新、添加或删除。

v-for 中的 key 详解

  1. 在使用 v-for 循环渲染列表时,key 必须保证其唯一性,最好是使用数组中的唯一标识符作为 key,比如 item.id
  2. key 属性的值必须是简单数据类型(可以是数字、字符串或布尔值),而不是对象或数组等引用类型。
  3. 如果你使用不合适的 key 值,会发生错误,比如 key 值重复等。
  4. 当在循环渲染时,如果没有为每个元素指定 key 属性,Vue 会强制要求你添加它,否则会有一个警告。
  5. 不要使用非唯一或不相关的值,如索引值,作为 key,这会导致性能变差,并可能影响到渲染结果。

示例1

以下是一个简单的示例,展示了如何将数组中的元素渲染为一个列表,并且使用 key 属性来跟踪每个元素。

<template>
  <ul>
    <li v-for="item in items" :key="item.id">{{ item.name }}</li>
  </ul>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, name: 'Apple' },
        { id: 2, name: 'Banana' },
        { id: 3, name: 'Orange' },
        { id: 4, name: 'Grape' },
      ]
    }
  }
}
</script>

在上面的代码中,我们为 li 标签增加了 :key 属性,并且使用了每个元素的 id 属性作为其值。当更新数组中的元素时,Vue 会根据 key 的值来决定是否重用已有元素或创建新的元素。

示例2

以下是另一个示例,其中演示了当列表项的数量发生更改时,渲染新元素和删除旧元素的行为。在这个例子中,我们添加了一个按钮,除了不改变列表中的示例外,它会在每个单击操作时随机添加或删除一个元素。

<template>
  <div>
    <button @click="handleClick">{{ buttonLabel }}</button>
    <ul>
      <li v-for="item in items" :key="item.id">{{ item.title }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, title: 'Apple' },
        { id: 2, title: 'Banana' },
        { id: 3, title: 'Orange' },
        { id: 4, title: 'Grape' },
      ],
      buttonLabel: 'Add/Remove',
    }
  },
  methods: {
    handleClick() {
      const index = Math.floor(Math.random() * 4);
      if (this.items.length >= 4) {
        this.items.splice(index, 1);
      } else {
        this.items.push({
          id: Math.floor(Math.random() * 1000),
          title: 'New Item'
        });
      }
    }
  }
}
</script>

在上面的代码中,我们使用 v-for 循环渲染了一个 Ul 元素,并且为每个 li 元素指定了唯一的 key 属性。当单击按钮时,代码会随机添加或删除一个元素,从而演示了 key 属性的作用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:VUE v-for中的:key详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue项目中如何通过cdn引入资源并配置详解

    当我们在使用Vue来开发项目时,我们可能需要引入一些第三方的依赖库或者一些静态资源文件,这些资源可能已经被其他网站或者CDN提供商存储并且公开的提供,因此我们可以考虑通过CDN来引入这些资源文件,这样可以提高访问效率,加快网页加载速度。 以下是引入jQuery和Bootstrap的CDN资源的两个例子。 引入jQuery的CDN资源 首先在我们的页面中引入j…

    Vue 2023年5月28日
    00
  • vue 通过绑定事件获取当前行的id操作

    下面是详细讲解“Vue 通过绑定事件获取当前行的 ID 操作”的完整攻略。 步骤一:初始化 Vue 项目 首先,在本地安装 Vue.js。这里我以 Vue CLI 为例,使用以下命令来初始化一个 Vue 项目: vue create vue-event-demo 然后进入项目目录并启动项目: cd vue-event-demo npm run serve 步…

    Vue 2023年5月28日
    00
  • 如何获取this.$store.dispatch的返回值

    获取this.$store.dispatch的返回值可以通过以下步骤实现: 1.使用Promise 在Vue中,this.$store.dispatch返回一个Promise对象,你可以通过在调用dispatch方法时添加.then()和.catch()方法来获取返回值,代码如下: methods: { async getUserInfo() { try {…

    Vue 2023年5月28日
    00
  • 移动端调试神器vConsole使用详解

    我们来详细介绍一下“移动端调试神器vConsole使用详解”的完整攻略。 一、vConsole是什么? vConsole是一款专为移动端开发者设计的前端调试工具。它可以在移动端页面中弹出一个虚拟的控制台,帮助开发者方便地查看页面的错误信息,进行调试和测试。 二、使用vConsole 2.1 引入vConsole 在head标签中引入vConsole的css,…

    Vue 2023年5月27日
    00
  • Vue中通过minio上传文件的详细步骤

    下面是Vue中通过Minio上传文件的详细步骤: 1. 安装minio-js 首先,需要安装minio-js,可以使用npm进行安装: npm install minio-js 2. 创建minio实例 在Vue组件中引入minio-js,并创建minio实例,示例代码如下: import Minio from ‘minio-js’ const minioC…

    Vue 2023年5月28日
    00
  • Vue/React子组件实例暴露方法(TypeScript)

    接下来我将为你详细讲解“Vue/React子组件实例暴露方法(TypeScript)”的完整攻略。 1. 为什么要暴露子组件实例方法? 在Vue/React组件开发中,父子之间的组件通信是很常见的一种情况。而在某些情况下,我们需要获取子组件的实例,以便使父组件调用子组件的方法或属性。这个时候就需要用到子组件实例的暴露方法。 2. 如何在Vue子组件中暴露实例…

    Vue 2023年5月28日
    00
  • vue.js 输入框输入值自动过滤特殊字符替换中问标点操作

    下面是“vue.js 输入框输入值自动过滤特殊字符替换中问标点操作”的完整攻略。 一、需求背景 在开发 Web 应用时,有些输入框需要对用户输入的特殊字符进行过滤和转换操作,例如将中文标点符号替换成英文标点符号。这样可以避免用户输入的字符对后续的数据处理、展示等造成影响,提高应用的稳定性和用户使用体验。 二、实现方法 1. Vue 指令实现输入框自动过滤 V…

    Vue 2023年5月27日
    00
  • Vue动态添加属性到data的实现

    Vue动态添加属性到data的实现可以通过Vue.set()方法或者通过直接给this.$data对象添加属性来实现。 通过Vue.set()方法实现动态添加属性: Vue.set()方法需要传入三个参数:对象、属性名、属性值。下面是示例代码: <template> <div> <p>{{ name }}</p&gt…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部