虚拟DOM原理
当Node节点的更新,虚拟DOM会比较两棵DOM树的区别,保证最小化的DOM操作,使得执行效率得到保证。
计算两棵树的常规算法是O(n^3)
级别,所以需要优化深度遍历的算法。React diff算法的时间复杂度为O(n)。
虚拟DOM图解
常见面试题
react/vue
中的key
有什么作用?(key
的内部原理是什么?)- 为什么遍历列表时,
key
最好不要用index
?
-
虚拟DOM
中key
的作用:- 简单地说:
key
是虚拟DOM
对象的标识,在更新显示时key
起着极其重要的作用 - 详细的说:当状态中的数据发生变化时,
react
会根据【新数据】
生成【新的虚拟DOM】
,随后React
进行【新虚拟DOM】
与【旧虚拟DOM】
的diff
比较,比较规则如下:旧虚拟DOM
中找到了与新虚拟DOM
相同的key
:- 若
虚拟DOM
中内容没变,直接使用之前的真实DOM
- 若
虚拟DOM
中内容变了,则生成新的真实DOM
,随后替换掉页面中之前的真实DOM
- 若
旧虚拟DOM
中未找到与新虚拟DOM
相同的key
- 根据数据创建新的
真实DOM
,随后渲染到页面
- 根据数据创建新的
- 简单地说:
-
用
index
作为key
可能引发的问题:- 若对数据进行:
逆序添加
、逆序删除
等破坏顺序操作:- 会产生没有必要的真实
DOM
更新 ==》 界面效果没问题,但效率低
- 会产生没有必要的真实
- 如果结构中还包含输入类的
DOM
:- 会产生错误
DOM
更新 ==》 界面有问题
- 会产生错误
- 注意:如果不存在对数据的
逆序添加
、逆序删除
等破坏顺序操作,仅用于渲染列表展示,使用index
作为key
是没有问题的
- 若对数据进行:
-
开发中如何选择
key
- 最好使用每条数据的
唯一标识
作为key
,比如id
、手机号
、身份证号
、学号
等唯一值 - 如果确定只是简单的展示数据,用
index
也是可以的
- 最好使用每条数据的