列表渲染
Vue 2
使用Virtual DOM
(虚拟DOM
)来提高渲染效率, 其核心是高效的diff
算法(也称为patch
算法)
diff
算法算法用于比较新旧虚拟DOM
树的差异, 并最小化对实际DOM
的操作
基本概念
Virtual DOM
:轻量级的JavaScript
对象, 表示真实DOM
的结构Diff
算法: 比较新旧Virtual DOM
的差异, 找出需要更新的部分Patch
: 将差异应用到真实 DOM 上
Diff 算法核心策略
Vue 2
的diff
算法采用以下策略来优化性能:
- 同级比较: 只比较同一层次的节点, 不跨层级比较
- 双端比较: 同时从新旧节点的两端向中间比较
key
的重要性: 使用key
来识别节点身份, 提高复用效率
虚拟 DOM 中 key 的作用
key
是虚拟DOM
对象的标识, 当状态中的数据发生变化时, Vue
会根据新数据生成新的虚拟DOM
随后Vue
将**新虚拟DOM
与旧虚拟DOM
**进行差异比较
对比规则
旧虚拟DOM
中找到了与新虚拟DOM
相同的key
:
- 若虚拟
DOM
中内容没变, 为了节省性能会直接使用之前的真实DOM
, 不会重新渲染 - 若虚拟
DOM
中内部变了, 则生成新的真实DOM
, 随后替换掉页面中之前的真实DOM
旧虚拟DOM
中未找到与新虚拟DOM
相同的key
:
- 创建新的真实
DOM
, 随后渲染到页面中
为什么不要使用下标作为 key
若对数据进行逆向添加、逆向删除等破坏顺序的操作时:
- 会产生没有毕要的真实
DOM
更新, 页面效果没问题但效率低
若结构中包含输入类的DOM
时:
- 会产生错误的
DOM
更新, 页面会出问题
如何渲染 key
最好使用每条数据的唯一标识作为key
, 比如id
、手机号、身份证号、学号等唯一值
如果不存在对数据的逆向添加、逆向删除等破坏顺序的操作, 仅用于渲染列表展示, 使用下标index
作为key
是没有问题的
示例图
- 将下标
index
作为key
时
- 将唯一
id
作为key
时