VUE v-for中的:key详解

当在 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日

相关文章

  • vuex进阶知识点巩固

    关于 “vuex进阶知识点巩固” 的完整攻略,我将按照以下几个方面进行详细讲解: Vuex的基本概念 Vuex的核心概念 Vuex的高级应用 1. Vuex的基本概念 1.1 什么是Vuex? Vuex是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,将组件的共享状态抽取出来,以一个全局单例模式管理。 1.2 V…

    Vue 2023年5月28日
    00
  • vue项目打包成桌面快捷方式(electron)的方法

    要将Vue项目打包成桌面快捷方式,我们可以使用Electron框架。 这里是一个简单的教程,演示如何使用Electron,将一个Vue应用程序打包成可执行文件并创建桌面快捷方式的命令。 步骤一:创建Vue应用程序 首先我们需要创建Vue应用程序。 如果您已经有一个Vue应用程序,请学习第二步。您可以使用Vue CLI或手动创建Vue应用程序。 示例1: 使用…

    Vue 2023年5月27日
    00
  • 详解vue 数据传递的方法

    当我们在使用Vue开发Web应用时,数据的传递是一个非常重要的概念。Vue提供了多种方法来实现数据的传递,本文将详细讲解Vue数据传递的方法。 Prop Prop是Vue提供的一种父子组件通信的方式。当子组件需要从父组件中获取数据时,我们可以使用Prop将数据传递给子组件。 Prop的使用 在父组件中,我们可以通过在子组件标签上添加属性的方式来传递数据,例如…

    Vue 2023年5月28日
    00
  • vue $refs动态拼接获取值问题

    来讲一下“Vue $refs动态拼接获取值问题”的攻略。 问题描述 Vue中提供了$refs来获取dom元素,但是如果我们需要动态拼接$refs的属性名,则会遇到一个问题:无法使用动态拼接的方式获取到$refs的值。 以下是一个例子: <div v-for="item in items" :ref="`item-${ite…

    Vue 2023年5月27日
    00
  • vue中如何给静态资源增加路由前缀

    在 Vue 中,我们通常将静态资源放在 public 目录下,这些静态资源可以是样式表、脚本、图片、字体等文件。在访问这些静态资源时,我们可以给它们增加路由前缀,以便更好地管理和部署我们的应用程序。 一种实现方式是通过修改 vue.config.js 文件,该文件是 Vue CLI 3.x 新增的配置文件,用于存放项目构建配置。我们可以在 publicPat…

    Vue 2023年5月28日
    00
  • js前端对于大量数据的展示方式及处理方法

    针对JavaScript前端对于大量数据的展示方式及处理方法,我们可以有以下攻略: 一、数据的分页处理 在面对大量的数据时,我们需要将其分页显示。这样可以减轻前端页面的压力,缩短数据的加载时间。一般情况下,我们将数据按照每页显示的个数进行分页处理,在页面中显示出分页器和分页数据。 示例 我们可以使用Vue.js和Vue-cli进行示例说明。首先,我们需要安装…

    Vue 2023年5月28日
    00
  • element-ui中页面缩放时table表格内容错位的解决

    为了解决element-ui中页面缩放时table表格内容错位的问题,我们可以采用以下措施: 1. CSS调整 在表格的父元素中添加CSS样式,使其在缩放时保持宽度不变: .parent { overflow: auto; white-space: nowrap; } 其中,overflow: auto表示在缩放时出现滚动条;white-space: now…

    Vue 2023年5月28日
    00
  • vue中使用vuex的超详细教程

    下面是关于vue中使用vuex的超详细教程,内容主要包括以下几个部分: vuex在vue中的作用及基本概念 在vue中引入vuex 构建vuex的基本结构 如何引用vuex中的数据和方法 示例说明 总结 1. vuex在vue中的作用及基本概念 vuex是一种状态管理模式,用于管理vue应用中的所有组件的状态,将数据交给vuex中心化管理,实现全局统一的数据…

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