企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
当某个状态发生改变的时候,如何只更新与这个状态相关联的 dom 节点? * angular - 脏检查 * react - 虚拟dom * vue - 虚拟dom 虚拟dom 的解决方式 ![](https://img.kancloud.cn/84/cd/84cd40d48731895503e7e279a3bb4c0a_1746x796.png) ![](https://img.kancloud.cn/aa/bc/aabc0defceb9ca841fc4d6a1abe01346_966x768.png) ## 为什么要引入虚拟dom ### vue 1.0 由于 vue 有变化侦测,所以vue是知道具体哪些状态发上了变化。 Watcher 是存在 Dep 中的。 ![](https://img.kancloud.cn/b5/7e/b57e0e767b4878235e65dd5208218c03_1197x393.png) 缺点:每个数据都会有一个 Watcher 来观察状态的变化,对于内存和依赖追踪的开销是很大的。 ### vue 2.0 Watcher 不会对每个数据都进行观察,当状态发生变化时,Watcher 会通知到组件,组件内部通过 **虚拟 Dom** 进行比对,找出需要更新的节点。 疑问:vue2.0 观察对象从之前的对每个数据进行观察,调整到对组件进行观察是怎么实现的? 依赖改变时,循环调触发依赖Watcher ![](https://img.kancloud.cn/5a/8c/5a8cd763e3c8124c4dc5afb4f94ff0ed_1367x602.png) ![](https://img.kancloud.cn/98/02/980221110e550331b6266db3ed75d5e1_1407x470.png) Watcher 里有 vm ? ![](https://img.kancloud.cn/6e/92/6e92a61d29c3d116be4398182e1b82ec_980x506.png) ![](https://img.kancloud.cn/24/aa/24aad5c81f5c90ffdd29d818558201f5_1310x1307.png) ![](https://img.kancloud.cn/42/d9/42d987577b9c5f840fee7c0ff0cb1a87_1094x1362.png) ## angular的脏检查 ``` DOM.addEventListener('click', function ($scope) { $scope.$apply(() => userCode()); }); ``` 这个 onClick 的方法体对于 angular 来说是黑盒,它到底做了什么angular并不知道。 angular 通过挨个检查这些元素对应绑定表达式的值是否有被改变,去定点击后是否应该刷新 UI,应该更新哪个 DOM 元素。 ## react 更新视图 ![](https://img.kancloud.cn/12/f8/12f838245de93cb00a813b20da358a53_917x514.png) 当组件的状态改变时,React更新虚拟DOM树。虚拟DOM更新后,React然后将虚拟DOM的当前版本与虚拟DOM的先前版本进行比较