v-for为什么要加key

简介: v-for为什么要加key
本节内容:在日常开发中,经常会使用 v-for进行遍历,但是每次使用其时,都要被强制的加上 key,那么key究竟起着什么样的作用?话不多说,我们先看一个案例

一、案例

源码:

<div>
  <input type="text" v-model='name'>
  <button @click='add'>添加</button>
</div>
<ul>
  <li v-for='(item, i) in nameList' :key='item.id'>
    <input type="checkbox"> {{item.name}}
  </li>
</ul>
</div>
<script>
const HelloVueApp = {
  components: {
    getTitleComponent,
    toDoList
  },
  data() {
    return {
      bookTitle: '',
      selectVal: '',

      nameList: [
        { id: 1, name: '张三' },
        { id: 2, name: '李四' },
        { id: 3, name: '王五' }
      ],
      name: '',
      newId: 3
    }
  },
  methods: {
    add () {
        // 注意是 unshift 添加,将在头部添加元素
      this.nameList.unshift({id: ++this.newId, name: this.name})
      this.name = ''
    }
  }
}

Vue.createApp(HelloVueApp).mount('#app')
</script>

1、不加key值时

在这里插入图片描述

2、加key值时

在这里插入图片描述

  • 通过以上两个结果我们可以看出,当我们没加key值时,没有 key 属性,状态默认绑定的是位置;加上key值有 key 时,状态根据key的值绑定到了相应的数组元素上
  • vue组件高度复用增加Key可以标识组件的唯一性,为了更好地区别各个组件 ,key的作用主要是为了高效的更新虚拟DOM。
  • 由于key的唯一性,尽量把id作为key值。index索引的话因为并不具有唯一性,不能作为key值

Vue中这样说道:维护状态,当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。
在Key的语法当中我们得知:特殊 attribute 主要用做 Vue 的虚拟 DOM 算法的提示,以在比对新旧节点组时辨识 VNodes。如果不使用 key,Vue 会使用一种算法来最小化元素的移动并且尽可能尝试就地修改/复用相同类型元素。而使用 key 时,它会基于 key 的顺序变化重新排列元素,并且那些使用了已经不存在的 key 的元素将会被移除/销毁。

  • 一张图带你更深入的理解,如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素的算法。而使用 key 时,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。

在这里插入图片描述

相关文章
|
前端开发 Java 应用服务中间件
解决跨域问题的8种方法,含网关、Nginx和SpringBoot~
解决跨域问题的8种方法,含网关、Nginx和SpringBoot~
2782 0
解决跨域问题的8种方法,含网关、Nginx和SpringBoot~
|
应用服务中间件 nginx
【报错】在nginx下启动,登录成功后页面不跳转
【报错】在nginx下启动,登录成功后页面不跳转
591 4
|
消息中间件 数据可视化 NoSQL
XXL-Job搭建(传统方式&Docker方式)与使用(Linux环境下)
XXL-Job搭建(传统方式&Docker方式)与使用(Linux环境下)
7051 0
XXL-Job搭建(传统方式&Docker方式)与使用(Linux环境下)
|
2月前
|
数据采集 传感器 缓存
《工业边缘网关进阶指南:智慧工厂设备互联中的协议适配与数据预处理》
本文以智慧工厂设备互联升级项目为背景,聚焦工业场景下边缘网关的实践与优化。针对传统集中式方案存在的布线成本高、电磁干扰导致数据丢包、云端处理延迟超标的问题,团队采用“边缘先行、云边协同”架构,将8台工业级边缘网关下沉至生产线,构建分布式网络。文章详述硬件选型(抗干扰、宽温宽压、多接口)与分层软件架构,重点突破协议适配(Modbus-MQTT映射、私有协议解析、串口通信纠错)、数据预处理(清洗、脱敏、差异化传输)、高可用设计(硬件冗余、故障转移、本地缓存)及性能优化(动态线程池、对象池、算法优化)。
110 0
|
7月前
|
JavaScript 前端开发 API
Vue 2 与 Vue 3 的区别:深度对比与迁移指南
Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架,在过去的几年里,Vue 2 一直是前端开发中的重要工具。而 Vue 3 作为其升级版本,带来了许多显著的改进和新特性。在本文中,我们将深入比较 Vue 2 和 Vue 3 的主要区别,帮助开发者更好地理解这两个版本之间的变化,并提供迁移建议。 1. Vue 3 的新特性概述 Vue 3 引入了许多新特性,使得开发体验更加流畅、灵活。以下是 Vue 3 的一些关键改进: 1.1 Composition API Composition API 是 Vue 3 的核心新特性之一。它改变了 Vue 组件的代码结构,使得逻辑组
1804 0
|
前端开发
css页面顶部底部固定,中间自适应几种方法
【10月更文挑战第22天】css页面顶部底部固定,中间自适应几种方法
|
存储 负载均衡 监控
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
这篇文章是关于Apache Dubbo框架与Zookeeper的关系,以及如何下载、安装和启动Zookeeper的教程,包括解决启动过程中可能遇到的报错问题。
565 3
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
|
负载均衡 Java API
Spring Cloud原理详解
Spring Cloud原理详解
306 0
|
JavaScript C++
使用 Vite 创建 Vue3+TS 项目并整合 ElementPlus、Axios、Pinia、Less、Vue-router 等组件或插件
本文详细介绍了如何使用Vite创建Vue3+TypeScript项目,并整合ElementPlus、Axios、Pinia、Less、Vue-router等组件或插件的步骤和配置方法。
4440 2
|
关系型数据库 MySQL Windows
mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法
本文讲解:mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

热门文章

最新文章