Vue中key

142 阅读2分钟

大部分面试官都会提一下,为什么要在列表组件中写key,作用是什么?

key 主要作为Vue的虚拟DOM算法提示,在比较新旧节点列表时用于识别vnode。 key是给每一个vnode的唯一id,依靠key,更准确,更快的拿到oldVnode中对应的vnode节点

Vue中,通过key管理状态

Vue默认按照“就地更新”的策略来更新通过 v-for渲染的元素列表。当数据项的顺序改变时,Vue不会随之移动DOM元素的顺序,而是就地更新每个元素,确保它们在原本指定的索引位置上渲染。

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

为了给vue一个提示,以便它可以跟踪每个节点的标识,从而重用和重新排序现有的元素,你需要为每个元素对应的块提供一个唯一的key attribute:

<div v-for="item in items" :key="item.id">
 你暂时解决不了的,时间会帮你解决
</div>

当你使用 <template v-for> 时,key 应该被放置在这个 <template> 容器上:

<template v-for="todo in todos" :key="todo.name"> 
  <li>{{ todo.name }}</li> 
</template>

推荐在任何可行的时候为v-for提供一个key,除非所迭代的 DOM 内容非常简单 (例如:不包含组件或有状态的 DOM 元素),或者你想有意采用默认行为来提高性能。

Vue中,key的重要性

key 这个特殊的 attribute 主要作为Vue的虚拟DOM算法提示,在比较新旧节点列表时用于识别vnode。

  • 预期number | string | symbol

  • 详细

    在没有key的情况下,Vue将使用一种最小化元素移动的算法,并尽可能地就地更新/复用相同类型的元素。

    如果有key,根据key的变化顺序来重新排列元素,并且将始终移除/销毁key已经不存在的元素。

    同一个父元素下的子元素必须具有唯一的key。重复的key 将会导致渲染异常。

    最常见的用例是与 v-for 结合:

    <ul> 
      <li v-for="item in items" :key="item.id">生活将不期而遇</li>
    </ul>
    

    也可以用于强制替换一个元素/组件而不是复用它。当你想这么做时它可能会很有用:

  • 在适当的时候触发组件的生命周期钩子

  • 触发过渡

<transition>
  <span :key="text">{{text}}</span>
</transtion>

当text变化时,总是会被替换而不是更新, 因此transition将会被触发。

摘录来源:cn.vuejs.org/api/built-i…