[关闭]
@c-Ku 2017-11-05T11:05:53.000000Z 字数 1093 阅读 655

【JS基础】虚拟DOM 及 双向数据绑定

JavaScript


参 照:
https://www.hbiger.com/index.php/archives/27/
https://github.com/DMQ/mvvm
MDN - Object.defineProperty

最 新:
https://www.zybuluo.com/c-Ku/note/940054

虚拟Dom

前端更新页面视图并渲染数据时需操作大量页面Dom,常用的方法有 appendChildinnerHTML,两个方法性能相差不大,innerHTML更好一点,使用时皆对Dom进行了大量的操作,引发浏览器的重构及重绘,影响页面性能。

虚拟Dom方案是在页面渲染 Dom Tree 时,先在内存中模拟一个Dom树,然后比较两颗Dom树的不同,再将不同的地方渲染进Dom,以控制页面重构重绘的范围。这在渲染大量数据且数据复杂不规律的情况下更具优势。

双向数据绑定

大致分为:

发布/订阅模式(backbone.js)
脏值检查模式(Angular.js)
数据劫持(Vue.js)

订阅发布模式

  1. var data = {name: 'kindeng'};
  2. observe(data);
  3. data.name = 'dmq'; // 监听到变化
  4. function observe(data) {
  5. if (!data || typeof data !== 'object') {
  6. return;
  7. }
  8. // 取出所有属性遍历
  9. Object.keys(data).forEach(function(key) {
  10. defineReactive(data, key, data[key]);
  11. });
  12. };
  13. function defineReactive(data, key, val) {
  14. observe(val); // 监听子属性
  15. Object.defineProperty(data, key, {
  16. enumerable: true, // 可枚举
  17. configurable: false, // 不能再define
  18. get: function() {
  19. return val;
  20. },
  21. set: function(newVal) {
  22. console.log('监听到变化 ', val, ' --> ', newVal);
  23. val = newVal;
  24. dep.notify(); // 通知所有订阅者
  25. }
  26. });
  27. }
  28. function Dep() {
  29. this.subs = [];
  30. }
  31. Dep.prototype = {
  32. addSub: function(sub) {
  33. this.subs.push(sub);
  34. },
  35. notify: function() {
  36. this.subs.forEach(function(sub) {
  37. sub.update();
  38. });
  39. }
  40. };
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注