我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue开发实例探究key的作用详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue开发实例探究key的作用详解

前言

一提到 vue 中的 key,你会想到什么?使用v-for时需要使用 key ?key 不能重复?建议不要使用 index 来做key的值?这究竟是为什么呢?就下来我们就一起来通过实例来一探究竟。

为什么不推荐使用 index 作为 key?

我们先来看两个例子 为了能够监听元素的创建与销毁,我们需要将一个div元素封装为一个组件,取名为Test

 <template>
   <div>
     {{ Math.floor(Math.random() * 100) }}
   </div>
 </template>
 <script>
 export default {
   props: ["mark"],
   mounted() {
     console.log("create", this.mark)
   },
   beforeDestroy() {
     console.log("destroy", this.mark)
   }
 }
 </script>

使用 index 作为 key

 <template>
   <div>
     <Test v-for="(item,index) in arr" :key="index" :mark="item"></Test>
     <button @click="changeArr">change</button>
   </div>
 </template>
 <script>
 import Test from './Test'
 export default {
   data() {
     return {
       arr: [1,2,3,4,5]
     }
   },
   components: {
     Test
   },
   methods: {
     changeArr() {
       this.arr = [6,7,8,9]
     }
   }
 };
 </script>

通过点击按钮改变数组我们可以发现因为数组的改变有一个组件(item 为5的组件)被销毁,但并没有新的 Test 组件创建。由此我们可以得出一个结论:如果元素 key 的值未发生变化,那么该元素就不会进行销毁与重建。 我们再来看下另外一个例子

 <template>
   <div>
     <Test v-for="item in arr" :key="item" :mark="item"></Test>
     <button @click="changeArr">change</button>
   </div>
 </template>
 <script>
 import Test from './Test'
 export default {
   data() {
     return {
       arr: [1,2,3,4,5]
     }
   },
   components: {
     Test
   },
   methods: {
     changeArr() {
       this.arr = [5,4,3,2,6]
     }
   }
 };
 </script>

上述两个例子的代码区别是:绑定的 key 不同 通过点击按钮改变数组,每个元素的 key 都会发生变化,所以元素都会被销毁,然后重新创建,但事实并非如此

实验结果是:只有key为1的元素被销毁,key为6的元素被创建 其实这也是合理的,我最初的key为2,改变之后的key为3,但是key为3这个元素之前就存在,这就意味着我可以直接使用key为3的这个元素,无需销毁再创建。 所以我们之前的结论还需要进一步的完善:如果元素 key 的值发生改变但未产生新的key,那么Vue就会复用之前key的那个元素。 所以为什么不推荐 index 作为 key? 虽然上述的两个例子都会复用 key,但他们最大的区别在于,使用index作为key会产生一个副作用,若使用数据本身则不会产生副作用。 通过第一个例子我们可以发现,即使我们的数据发生了翻天覆地的变化,但因为我们使用index作为key,所以元素不会被销毁与重建,这就会导致我们在mounted、created等钩子中做的一些操作无法生效,若这些钩子中有依赖父组件传来的值,那造成的影响将是致命的。 我们再看一个使用 index 引起更新错误的例子

 <template>
   <div>
     <div v-for="(item, index) in arr" :key="index">
       <Test></Test>
       <button @click="deleteItem(index)">delete</button>
     </div>
   </div>
 </template>
 <script>
 import Test from './Test'
 export default {
   name: 'App',
   data() {
     return {
       arr: [1,2,3,4,5]
     }
   },
   components: {
     Test
   },
   methods: {
     deleteItem(i) {
       this.arr.splice(i, 1)
     }
   }
 }
 </script>

无论我们点击哪一个数字后的删除按钮,删除的都是最后一个数字。 如果使用数组的值作为 key 则不会出现该错误

如果 key 重复会导致什么样的错误?

想必这个错大家应该都遇见过Duplicate keys detected: 'xx'. This may cause an update error.那么它到底会导致什么样的更新错误呢?
和使用 index 作为 key 所造成的错误类似,我们将上述例子的 key 更改为一个固定的值即可复现该错误
不过,在 Vue3 中并不会在控制台中主动抛出 key 重复的错误。

使用 key 和不使用 key 有什么差别?

复用上的差别,如果使用 key,只要 key 发生变化,那么这个元素就必定会被销毁然后重建,若没有key,则Vue会尽可能的复用元素,以获取性能上的提升。(这应该就是Vue文档中所提到的默认行为) 我们可以使用上面的例子,通过添加和删除key来验证这一结论

key的实际应用

  • v-for语句中使用,一是为了令 Vue 能够正确的复用元素,二是因为编辑器会报错~~~~
  • 利用 key 一旦更改就会销毁重新创建的特性,实现强制替换元素来完整的触发生命周期钩子

上述结论在Vue3中也成立吗?

成立。 已知的不同之处在于 Vue3 不会在控制台中主动抛出 key 重复的错误。

总结

相同父元素下的子元素

使用key

  • 如果元素 key 的值未发生变化,那么该元素就不会进行销毁与重建。
  • 如果元素 key 的值发生改变但未产生新的key,那么Vue就会复用之前key的那个元素。
  • 如果元素 key 的值为一个全新的值,那么该元素就会被销毁与重建,如果是组件,则会触发完整的生命周期钩子

不使用key

尽可能的复用节点

以上就是Vue开发实例探究key的作用详解的详细内容,更多关于Vue key作用的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue开发实例探究key的作用详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Vue开发实例探究key的作用详解

这篇文章主要为大家介绍了Vue开发实例探究key的作用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-10

实例探究Android开发中Fragment状态的保存与恢复方法

我们都知道,类似 Activity, Fragment 有 onSaveInstanceState() 回调用来保存状态。 在Fragment里面,利用onSaveInstanceState保存数据,并可在onActivityCreated
2022-06-06

python开发之for循环操作实例详解

本文实例讲述了python开发之for循环操作。分享给大家供大家参考,具体如下: 下面是我做的一些学习记录供大家参考:#基本的for循环语句 test_list = [2,"Jone",3,6,7,'hongten','hanyuan','
2022-06-04

探索 Vue 与 TypeScript 的交互作用:实现更好的前端开发

Vue.js 和 TypeScript 携手为前端开发带来了无穷可能。本文将深入探讨它们之间的交互,指导开发者充分利用其优势,打造更高效、更健壮的应用程序。
探索 Vue 与 TypeScript 的交互作用:实现更好的前端开发
2024-03-08

Android开发之TabActivity用法实例详解

本文实例讲述了Android开发之TabActivity用法。分享给大家供大家参考,具体如下: 一.简介 TabActivity继承自Activity,目的是让同一界面容纳更多的内容。TabActivity实现标签页的功能,通过导航栏对各个
2022-06-06

vue require.context()的用法实例详解

require.context是webpack提供的一个api,通常用于批量注册组件,下面这篇文章主要给大家介绍了关于vue require.context()用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-05-14

Android 开发中使用Linux Shell实例详解

Android 开发中使用Linux Shell实例详解 引言 Android系统是基于Linux内核运行的,而做为一名Linux粉,不在Android上面运行一下Linux Shell怎么行呢? 最近发现了一个很好的Android She
2022-06-06

PHP缓存机制详解:深入探究其工作原理和实际应用

PHP缓存机制全解析:深入理解其原理与应用引言:在开发Web应用程序中,缓存是一种重要的技术手段,能够显著提升应用程序的性能和用户体验。而PHP作为一种常用的服务器端编程语言,也提供了丰富的缓存机制供开发者使用。本文将深入探讨PHP缓存机
PHP缓存机制详解:深入探究其工作原理和实际应用
2024-01-23

Vue3 setup 的作用实例详解

setup 用来写组合式 API,从生命周期的角度,相当于取代了 beforeCreate(),这篇文章主要介绍了Vue3 setup 的作用,需要的朋友可以参考下
2022-12-29

Android样式的开发:layer-list实例详解

上图Tab的背景效果,和带阴影的圆角矩形,是怎么实现的呢?大部分的人会让美工切图,用点九图做背景。但是,如果只提供一张图,会怎么样呢?比如,中间的Tab背景红色底线的像素高度为4px,那么,在mdpi设备上显示会符合预期,在hdpi设备上显
2022-06-06

python开发之字符串string操作方法实例详解

本文实例讲述了python开发之字符串string操作方法。分享给大家供大家参考,具体如下: 在python中,对于字符串string的操作,我们有必要了解一下,这样在我们的以后的开发中会给我们带来很多方便 下面是我学习的笔记:#pytho
2022-06-04

利用MongoDB技术开发中遇到的并发控制问题的解决方案探究

利用MongoDB技术开发中遇到的并发控制问题的解决方案探究摘要:随着互联网技术的快速发展,数据量的不断增大和用户数的不断增加,对于大型应用程序而言,并发控制变得愈发重要。并发控制问题是指在多个用户同时对同一个数据进行读写操作时,可能导致数
2023-10-22

Android开发之TimePicker控件用法实例详解

本文实例分析了Android开发之TimePicker控件用法。分享给大家供大家参考,具体如下: 新建项目: New Android Project-> Project name:HelloSpinner Build Target:Andr
2022-06-06

编程热搜

目录