关于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,确保状态正确