Vue-唯一key

wujiawen 发布于

关于Vue的key

在理解key之前,需要先理解Vue的diff算法

通过订阅-观察模式,在数据发生变化时,会调用Dep.notify通知所有订阅者Watcher,订阅者就会调用patch方法给真实的DOM打补丁,更新相应的视图。

而patch方法则是通过diff算法进行新旧虚拟DOM的比较,发现有不一样的地方就直接修改在真实的DOM上,然后使oldVnode的值为Vnode。

回到key上,当diff算法进行新旧虚拟DOM对比时,若带了key, 则会根据key对新旧节点进行比对,相同就复用,不相同,就删除旧的创建新的

是否使用唯一key

  • 无状态列表渲染

    官网推荐的,使用key,应该要理解为“使用唯一key”。

    因为对于列表渲染,若是使用index作为key,那么其实和不使用key的效果是一样的

    若不带key,在判断samVnode时,由于key都是undefined,所以会判断为相同节点,那么该节点就会进行复用

    若index作为key,由于每个列表项的index在变更前后都是一样的,所以也会判断为相同节点

    若判断为相同节点,那么只需修改节点的文本内容,而不需要删除、创建节点,可以提高渲染性能

    所以,在这种情况下,不带唯一key的性能会更好

  • 带状态的组件渲染

    对于无状态列表渲染,可以使用index作为key,复用节点,提高性能

    但是,对于有状态的组件,则需要使用唯一key,进行标识,以确保组件状态的正确

    比如:列表1和列表2,可通过tab进行切换

    在列表1下,勾选了第二项,切换到列表2,若不带唯一key,那么列表2的第二项也会是勾选状态,因为组件复用了,保留了之前的状态

    此时,需要为列表项带上唯一key,每次渲染都会替换节点,保证状态的正确

总结

key的作用就是更新节点时,判断新旧节点是否相同,相同则复用,不同则删除旧节点,创建新节点

当渲染无状态列表时,使用index作为key,与不使用key,效果相同,节点都会进行复用,只修改文本内容

当渲染带状态列表时,需要带上唯一key,确保状态正确