iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Vuejs中key值的作用是什么
  • 357
分享到

Vuejs中key值的作用是什么

2023-06-15 08:06:20 357人浏览 独家记忆
摘要

这篇文章给大家介绍Vuejs中key值的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。key 的一个错误使用——使用 index 作为 key不知道你在写 v-for 的时候,会不会直接使用 index 作为

这篇文章给大家介绍Vuejs中key值的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

key 的一个错误使用——使用 index 作为 key

不知道你在写 v-for 的时候,会不会直接使用 index 作为它的 key 值,是的,我承认我会,不得不说,这真的不是一个好习惯。

根据上篇文章,我们还是用 sortable.js 作为例子讨论。以下是核心代码,其中 arrData 的值为 [1,2,3,4]

<div id="sort">  <div v-for="(item,index) in arrData" :key="index" >    <div>{{item}}</div>  </div></div>
  mounted () {    let el = document.getElementById('sort')    var sortable = new Sortable(el, {      onEnd: (e) => {        const tempItem = this.arrData.splice(e.oldIndex, 1)[0]        this.arrData.splice(e.newIndex, 0, tempItem)      }    })  }

当然一开始的时候,数据渲染肯定是没有问题的

Vuejs中key值的作用是什么

好了,我们来看下以下的操作:

Vuejs中key值的作用是什么

可以看到,我将3拖到2上面的时候,下面的数据变成了 1342,但是上面视图的还是1234。然后我第四位置拖到第三位置的时候,下面的数据也是生效的,但是上面的数据似乎全部错乱了。很好,我们重现了案发现场。

接着我改了绑定的 key 值,因为这里的例子比较特殊,我们就认为 item 的值都不相同

<div id="sort">  <div v-for="(item,index) in arrData" :key="item" >    <div>{{item}}</div>  </div></div>

再看效果:

Vuejs中key值的作用是什么

是的,这个时候数据就完全跟视图同步了。

为什么?

先看官方文档中 key 的一句介绍

有相同父元素的子元素必须有独特的 key。重复的 key 会造成渲染错误。

之所以会造成上面渲染错误的情况,是因为我们的 key 值不是独特的,比如上面的 key 值,在调整数组顺序后就每一项原来的  key 值都变了,所以导致了渲染错误。

我们先来得出一个结论,index 作为 key 值是有隐患的,除非你能保证 index 始终能够能够作为一个唯一的标识

key 值到底有什么用

vue2.0 之后,我们不写 key 的话,就会报 warning,那也就是说官方是希望我们写 key 值的,那么 key 到底在 vue 中扮演了什么样的角色?

不使用 key 可以提高性能么答案是,是的!可以!

先看官方解释:

如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试修复/再利用相同类型元素的算法。使用 key,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。

比如现在有一个数组 [1,2,3,4]变成了[2,1,3,4],那么没有 key 的值会采取一种“就地更新策略”,见下图。它不会移动元素节点的位置,而是直接修改元素本身,这样就节省了一部分性能

Vuejs中key值的作用是什么

而对于有 key 值的元素,它的更新方式如下图所示。可以看到,这里它对 DOM 是移除/添加的操作,这是比较耗性能的。

Vuejs中key值的作用是什么

竟然不带 key 性能更优,为何还要带 key先来看一个例子,核心代码如下,这里模仿一个切换 tab 的功能,也就是切换的tab1 是1,2,3,4。tab2 是 5,6,7,8。其中有设置了一个点击设置第一项字体色为红色的功能。

那么当我们点击tab1将字体色设置成红色之后,再切换到 tab2,我们预期的结果是我们第一项字体的初始颜色而不是红色,但是结果却还是红色。

<div id="sort">  <button @click="trunToTab1">tab1</button>  <button @click="trunToTab2">tab2</button>  <div v-for="(item, index) in arrData">    <div @click="clickItem(index)" class="item">{{item}}</div>  </div></div>
      trunToTab1 () {        this.arrData = [1,2,3,4]      },      trunToTab2 () {        this.arrData = [5,6,7,8]      },      clickItem () {        document.getElementsByClassName('item')[0].style.color = 'red'      }

Vuejs中key值的作用是什么

这就超出了我们的预期了,也就是官方文档所说的,默认模式指的就是不带 key 的状态,对于依赖于子组件状态或者临时 DOM 状态的,这种模式是不适用的。

这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出。

我们来看带上 key 之后的效果

Vuejs中key值的作用是什么

这就是官方文档之所以推荐我们写 key 的原因,根据文档的介绍,如下:

使用 key,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。它也可以用于强制替换元素/组件而不是重复使用它。当你遇到如下场景的时候它可能会很有用:

  • 完整地触发组件的生命周期钩子

  • 触发过渡

那么 Vue 底层 key 值到底是怎么去做到以上的功能?我们就得聊聊 diff 算法以及虚拟 DOM 了。

key 在 diff 算法中的作用

这里我们不谈 diff 算法的具体,只看 key 值在其中的作用。(diff 算法有机会我们再聊)

vue 源码src/core/vdom/patch.js

if (isUndef(oldKeyToIdx)) oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx)        idxInOld = isDef(newStartVnode.key)          ? oldKeyToIdx[newStartVnode.key]          : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx)

我们整理一下代码块:

  // 如果有带 key  if (isUndef(oldKeyToIdx)) {    // 创建 index 表    oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);  }  if (isDef(newStartVnode.key)) {    // 有 key ,直接从上面创建中获取    idxInOld = oldKeyToIdx[newStartVnode.key]  } else {    // 没有key, 调用 findIdxInOld    idxInOld = findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx);  }

那么最主要还是 createKeyToOldIdxfindIdxInOld 两个函数的比较,那么他们做了什么呢?

function createKeyToOldIdx (children, beginIdx, endIdx) {  let i, key  const map = {}  for (i = beginIdx; i <= endIdx; ++i) {    key = children[i].key    if (isDef(key)) map[key] = i  }  return map}
 function findIdxInOld (node, oldCh, start, end) {    for (let i = start; i < end; i++) {      const c = oldCh[i]      if (isDef(c) && sameVnode(node, c)) return i    }  }

我们可以看到,如果我们有 key 值,我们就可以直接在 createKeyToOldIdx 方法中创建的 map 对象中根据我们的 key 值,直接找到相应的值。没有 key 值,则需要遍历才能拿到。相比于遍历,映射的速度会更快。

key 值是每一个 vnode 的唯一标识,依靠 key,我们可以更快的拿到 oldVnode 中相对应的节点。

关于Vuejs中key值的作用是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Vuejs中key值的作用是什么

本文链接: https://www.lsjlt.com/news/278902.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Vuejs中key值的作用是什么
    这篇文章给大家介绍Vuejs中key值的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。key 的一个错误使用——使用 index 作为 key不知道你在写 v-for 的时候,会不会直接使用 index 作为...
    99+
    2023-06-15
  • vue中key的作用是什么
    这篇文章将为大家详细讲解有关vue中key的作用是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。为什么要使用VueVue是一款友好的、多用途且高性能的JavaScript框架,使用vue...
    99+
    2023-06-14
  • react中key的作用是什么
    本文小编为大家详细介绍“react中key的作用是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“react中key的作用是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2022-10-19
  • redis更新key值的方法是什么
    Redis更新key值的方法有两种:1. SET命令:使用SET命令可以更新key的值。如果key不存在,则会创建一个新的key并设...
    99+
    2023-08-23
    redis
  • Vue3中key的作用和工作原理是什么
    这篇文章主要介绍“Vue3中key的作用和工作原理是什么”,在日常操作中,相信很多人在Vue3中key的作用和工作原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue3中key的作用和工作原理是什么...
    99+
    2023-06-20
  • SQL FOREIGN KEY约束的作用是什么
    SQL FOREIGN KEY约束用于确保关系数据库中的数据完整性。它定义了表之间的关系,并防止在相关表之间产生不一致的数据。FOR...
    99+
    2023-10-12
    SQL
  • Python中空值的作用是什么
    Python中的空值通常指的是None对象。它表示一个不存在的值或者没有值的情况。空值在程序中有以下几个作用:1. 表示一个函数没有...
    99+
    2023-09-28
    python
  • vuejs中挂载指的是什么意思
    小编给大家分享一下vuejs中挂载指的是什么意思,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 虚拟...
    99+
    2022-10-19
  • vuejs调用组件的方法是什么
    这篇文章主要讲解了“vuejs调用组件的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vuejs调用组件的方法是什么”吧!vuejs调用组件的方法:1、通过v-model或者.sy...
    99+
    2023-06-25
  • 数据库中空值的作用是什么
    数据库中的空值(NULL)表示缺少值或未知值。空值的作用是用于表示某个列的值是未知的、不适用的或缺失的。它可以在数据库中的列中存储一...
    99+
    2023-09-28
    数据库
  • Vue 中为什么不推荐用index 做 key属性值
    目录前言key 的作用key 在 diff 算法中的角色同步头部节点同步尾部节点添加新的节点删除多余节点最长递增子序列为什么不要用 index性能消耗数据错位解决方案总结前言 前端开...
    99+
    2022-11-12
  • python中函数返回值的作用是什么
    python中函数返回值的作用是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Pyt...
    99+
    2023-06-14
  • vue中的key有什么用
    小编给大家分享一下vue中的key有什么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!key到底有什么用途 先来看官方解释 :key属性主要用在vue的虚拟DOM算法(diff算法), 在新旧nodes对比时辨识VNod...
    99+
    2023-06-22
  • es6解构赋值的作用是什么
    本文小编为大家详细介绍“es6解构赋值的作用是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“es6解构赋值的作用是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 ...
    99+
    2022-10-19
  • python中合赋值运算符的作用是什么
    这篇文章给大家介绍python中合赋值运算符的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。说明当解释器执行到复合赋值运算符时,先计算算数运算符的表达式,再将算数运算符执行后的结果赋值到等号左边的变量。复合赋...
    99+
    2023-06-20
  • vue v-for中key的原理是什么
    这篇文章主要介绍“vue v-for中key的原理是什么”,在日常操作中,相信很多人在vue v-for中key的原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue ...
    99+
    2023-06-30
  • 在vue中为什么不能用index作为key
    目录一、key的作用是什么?二、什么是虚拟DOM?三、什么是diff算法四、为什么不能用index作为key?(1)index不能作为key--情景一(2)index不能作为key-...
    99+
    2022-11-13
  • React中使用collections时key的重要性是什么
    这篇文章主要为大家展示了“React中使用collections时key的重要性是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“React中使用collec...
    99+
    2022-10-19
  • Vue.js条件渲染、列表渲染及Vue中key值的内部原理是什么
    这篇文章主要介绍“Vue.js条件渲染、列表渲染及Vue中key值的内部原理是什么”,在日常操作中,相信很多人在Vue.js条件渲染、列表渲染及Vue中key值的内部原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希...
    99+
    2023-07-06
  • MySQL中的KEY关键字是什么意思?
    键与索引同义。如果要为列创建索引,请使用“Key”。 正如官方文档所述: KEY 通常是 INDEX 的同义词。当在列定义中给定时,键属性 PRIMARY KEY 也可以指定为 KEY。这是为了与其他数据库系统兼容而实现的。 该密钥可以与主...
    99+
    2023-10-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作