基于vue–key值的特殊用处详解

yizhihongxing

基于vue--key值的特殊用处详解

什么是key值?

Vue.js中,当使用v-for循环一个列表时,每个被循环的DOM元素都需要一个唯一标识,用于Vue的虚拟DOM算法中进行节点的识别和优化。这个唯一标识就是key值。

key值的作用

1. 提高渲染效率

通过key值,Vue可以追踪所有列表中对象的身份,在新旧节点对比时可以精确判断每个节点对应的对象是否发生了变化。这样可以有效减少DOM操作次数,提高渲染效率。

2. 避免数据错乱

在某些情况下,如果没有为每个节点指定key值,在使用v-for更新列表时,Vue可能会出现数据错乱的问题。例如:

<li v-for="item in items">
  {{ item.text }}
</li>

如果items中有以下三个对象:

[ 
  { id: 1, text: 'Apple' }, 
  { id: 2, text: 'Banana' }, 
  { id: 3, text: 'Orange' } 
]

若我们想要将第二个对象Banana删除,items就会变成:

[ 
  { id: 1, text: 'Apple' }, 
  { id: 3, text: 'Orange' } 
]

此时,如果我们没有为每个节点指定key值,Vue会使用节点的索引作为key值,即:

<li>Apple</li>
<li>Orange</li>

在重新渲染时,Vue会认为Banana节点的key值为1,与Apple节点重复,导致Apple节点的数据被渲染到Banana节点上,Banana节点被误判为已删除,从而出现数据错乱的问题。而如果我们为每个节点指定唯一的key值,就能够避免这个问题。

key值的示例

1. 列表排序与更新

假设我们有一个列表,里面存放的是一些人的姓名和年龄。我们需要通过点击按钮来实现按照姓名或年龄来进行排序。示例代码如下:

<ul>
  <li v-for="person in sortedPersons" :key="person.id">
    {{ person.name }},{{ person.age }}岁
  </li>
</ul>

<button @click="sortBy('name')">按姓名排序</button>
<button @click="sortBy('age')">按年龄排序</button>

在Vue组件中,我们通过computed计算属性来获取按指定规则排序后的列表。

data() {
  return {
    persons: [
      { id: 1, name: 'Amy', age: 22 },
      { id: 2, name: 'Bob', age: 20 },
      { id: 3, name: 'Charlie', age: 25 }
    ],
    sortRule: null
  }
},
computed: {
  sortedPersons() {
    if (this.sortRule === 'name') {
      return this.persons.sort((a, b) => a.name.localeCompare(b.name))
    } else if (this.sortRule === 'age') {
      return this.persons.sort((a, b) => a.age - b.age)
    } else {
      return this.persons
    }
  }
},
methods: {
  sortBy(rule) {
    this.sortRule = rule
  }
}

在每次更新列表时,我们为每个节点指定唯一的key值(例如这里使用了person的id),以便Vue能够准确判断每个节点的身份并进行优化和更新。

2. 动态列表的新增和删除

假设我们有一个动态列表,可以通过点击按钮来新增或删除列表项。示例代码如下:

<ul>
  <li v-for="(item, index) in items" :key="item.id">
    {{ item.name }}
    <button @click="deleteItem(index)">删除</button>
  </li>
</ul>

<input type="text" v-model="inputValue">
<button @click="addItem">新增</button>

我们在Vue组件中定义一个数组items,用于存放列表项对象。当用户点击新增按钮时,我们通过addItem方法向items数组中添加一个包含输入框中内容的新对象,并为这个对象指定一个唯一的id。同理,当用户点击列表项旁边的删除按钮时,我们通过deleteItem方法找到要删除的对象的索引,通过数组的splice()方法从items数组中删除该对象。

data() {
  return {
    items: [
      { id: 1, name: 'Apple' },
      { id: 2, name: 'Banana' },
      { id: 3, name: 'Cherry' }
    ],
    idCounter: 3,
    inputValue: ''
  }
},
methods: {
  addItem() {
    this.idCounter++
    this.items.push({
      id: this.idCounter,
      name: this.inputValue
    })
    this.inputValue = ''
  },
  deleteItem(index) {
    this.items.splice(index, 1)
  }
}

同样的,在每次更新列表时,我们为每个节点指定唯一的key值(这里使用了item的id),以便Vue能够准确判断每个节点的身份并进行优化和更新。

总结

在使用v-for循环列表时,给每个节点指定唯一的key值是非常必要的。只有通过key值,Vue才能精确追踪每个节点的身份,确保渲染效率和数据正确。在实际开发中,我们应该根据实际需求,为每个节点选取合适的key值,避免出现key相同或无效的情况。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于vue–key值的特殊用处详解 - Python技术站

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

相关文章

  • 如何利用vue3实现一个俄罗斯方块

    让我们来详细讲解如何利用Vue3实现一个俄罗斯方块。 准备工作 在开始实现之前,你需要安装好最新版本的Node.js和Vue CLI。你可以在终端中使用以下命令进行安装: # 安装Node.js brew install node # 安装Vue CLI npm install -g @vue/cli 创建工程 使用Vue CLI创建一个新的Vue工程: v…

    Vue 2023年5月29日
    00
  • Vue使用electron转换项目成桌面应用方法介绍

    Vue使用Electron转换项目成桌面应用方法介绍 Electron是基于Chromium和Node.js开发的流行桌面应用开发框架,它可以让你使用前端技术(如HTML、CSS和JavaScript)开发出桌面应用。而Vue是一款易用、高效的前端框架,它可以让我们快速构建响应式、可维护的Web应用程序。将二者结合起来,可以让我们更加高效地开发出高质量的桌面…

    Vue 2023年5月28日
    00
  • js中getter和setter用法实例分析

    当我们需要在 JavaScript 中对一个对象的某个属性进行访问控制时,可以使用 getter 和 setter 方法。getter 方法用于获取属性的值,setter 方法用于设置属性的值。本文将详细介绍如何使用 getter 和 setter 方法。 语法 var obj = { get 属性名() { // 代码块 }, set 属性名(value)…

    Vue 2023年5月28日
    00
  • Vue学习笔记进阶篇之函数化组件解析

    Vue学习笔记进阶篇之函数化组件解析,主要涉及Vue中的函数化组件,对于Vue的一些高级使用场景有很大的帮助作用。在本篇攻略中,我将为大家详细介绍函数化组件的概念、特点以及使用方法,并且会给出一些实际的使用示例。 什么是函数化组件 函数化组件,简称函数组件,是Vue中一种新的组件书写方式。与传统的Vue组件相比,函数组件去掉了<template>…

    Vue 2023年5月27日
    00
  • Vue中fragment.js使用方法详解

    Vue中fragment.js使用方法详解 在前端开发中,我们经常需要在一个组件内部返回多个连续节点,并将它们包装在一个 DOM 元素中。在 Vue 中,我们可以使用 Fragment 实现这一操作。但是在 Vue 2.x 中,Fragment API 并没有提供支持,为了解决这个问题,我们可以使用 fragment.js 这个第三方库来帮助我们使用 Fra…

    Vue 2023年5月27日
    00
  • vue配置文件自动生成路由和菜单实例代码

    Vue项目中,通常需要配置路由和菜单,但手动编写路由配置和菜单项信息可能会比较繁琐和易错。因此,利用一些插件或工具可以自动生成路由和菜单是非常方便的。 下面是一份“vue配置文件自动生成路由和菜单实例代码”的完整攻略: 1. 准备工作 首先,我们需要在项目中安装必要的依赖: npm i vue-router routify –save 其中,vue-rou…

    Vue 2023年5月28日
    00
  • vue3中的watch和watchEffect实例详解

    Vue3中的watch和watchEffect实例详解 在Vue3中,watch和watchEffect可以定义响应式数据的副作用。本文会详细讲解两者的区别和使用方式,并给出几个实例示例说明。 watch watch的基本用法是:当数据发生变化时执行一个函数。可以用来监听单个数据的变化,也可以监听多个数据。 监听单个数据 监听单个数据可以通过$watch函数…

    Vue 2023年5月27日
    00
  • VueJS 组件参数名命名与组件属性转化问题

    VueJS 组件能够让我们用单个组件来定义特定状态下的 UI。在组件内部,通常会存在着 props 对象,用于指定组件的外部属性。然而,在指名组件属性的时候,一些参数名可能会被转化成别的名称,这给开发者造成了很多困扰。下面就是完整的攻略,涵盖了参数名命名和属性转换两个方面。 组件参数名命名 Vue 组件参数名的使用一般分为 kebab-case、camelC…

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