加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.cn/)- 云渲染、网络安全、数据安全、数据分析、人体识别!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

中高级前端大厂面试秘籍,为你保驾护航金三银四,直通大厂

发布时间:2019-02-20 23:50:00 所属栏目:优化 来源:佚名
导读:引言 当下,正面临着近几年来的最严重的互联网寒冬,听得最多的一句话便是:相见于江湖~。缩减HC、裁员不绝于耳,大家都是人心惶惶,年前如此,年后想必肯定又是一场更为惨烈的江湖厮杀。但博主始终相信,寒冬之中,人才更是尤为珍贵。只要有过硬的操作和

set: 派发更新

  • Dep.notify()
  • watcher.update()
  • queenWatcher()
  • nextTick
  • flushScheduleQueue
  • watcher.run()
  • updateComponent()

大家可以先看下面的数据相应的代码实现后,理解后就比较容易看懂上面的简单脉络了。

  1. let data = {a: 1} 
  2. // 数据响应性 
  3. observe(data) 
  4.  
  5. // 初始化观察者 
  6. new Watcher(data, 'name', updateComponent) 
  7. data.a = 2 
  8.  
  9. // 简单表示用于数据更新后的操作 
  10. function updateComponent() { 
  11.     vm._update() // patchs 
  12. } 
  13.  
  14. // 监视对象 
  15. function observe(obj) { 
  16.      // 遍历对象,使用 get/set 重新定义对象的每个属性值 
  17.     Object.keys(obj).map(key => { 
  18.         defineReactive(obj, key, obj[key]) 
  19.     }) 
  20. } 
  21.  
  22. function defineReactive(obj, k, v) { 
  23.     // 递归子属性 
  24.     if (type(v) == 'object') observe(v) 
  25.      
  26.     // 新建依赖收集器 
  27.     let dep = new Dep() 
  28.     // 定义get/set 
  29.     Object.defineProperty(obj, k, { 
  30.         enumerable: true, 
  31.         configurable: true, 
  32.         get: function reactiveGetter() { 
  33.               // 当有获取该属性时,证明依赖于该对象,因此被添加进收集器中 
  34.             if (Dep.target) { 
  35.                 dep.addSub(Dep.target) 
  36.             } 
  37.             return v 
  38.         }, 
  39.         // 重新设置值时,触发收集器的通知机制 
  40.         set: function reactiveSetter(nV) { 
  41.             v = nV 
  42.             dep.nofify() 
  43.         }, 
  44.     }) 
  45. } 
  46.  
  47. // 依赖收集器 
  48. class Dep { 
  49.     constructor() { 
  50.         this.subs = [] 
  51.     } 
  52.     addSub(sub) { 
  53.         this.subs.push(sub) 
  54.     } 
  55.     notify() { 
  56.         this.subs.map(sub => { 
  57.             sub.update() 
  58.         }) 
  59.     } 
  60. } 
  61.  
  62. Dep.target = null 
  63.  
  64. // 观察者 
  65. class Watcher { 
  66.     constructor(obj, key, cb) { 
  67.         Dep.target = this 
  68.         this.cb = cb 
  69.         this.obj = obj 
  70.         this.key = key 
  71.         this.value = obj[key] 
  72.         Dep.target = null 
  73.     } 
  74.     addDep(Dep) { 
  75.         Dep.addSub(this) 
  76.     } 
  77.     update() { 
  78.         this.value = this.obj[this.key] 
  79.         this.cb(this.value) 
  80.     } 
  81.     before() { 
  82.         callHook('beforeUpdate') 
  83.     } 
  84. } 

4. virtual dom 原理实现

  • 创建 dom 树
  • 树的diff,同层对比,输出patchs(listDiff/diffChildren/diffProps)

    • 没有新的节点,返回
    • 新的节点tagName与key不变, 对比props,继续递归遍历子树

      • (编辑:常州站长网)

        【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读