设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

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

发布时间:2019-02-20 20:16 所属栏目:21 来源:佚名
导读:set : 派发更新 Dep.notify() watcher.update() queenWatcher() nextTick flushScheduleQueue watcher.run() updateComponent() 大家可以先看下面的数据相应的代码实现后,理解后就比较容易看懂上面的简单脉络了。

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. function observe(obj) { 
  15.      // 遍历对象,使用 get/set 重新定义对象的每个属性值 
  16.     Object.keys(obj).map(key => { 
  17.         defineReactive(obj, key, obj[key]) 
  18.     }) 
  19.  
  20. function defineReactive(obj, k, v) { 
  21.     // 递归子属性 
  22.     if (type(v) == 'object') observe(v) 
  23.      
  24.     // 新建依赖收集器 
  25.     let dep = new Dep() 
  26.     // 定义get/set 
  27.     Object.defineProperty(obj, k, { 
  28.         enumerable: true, 
  29.         configurable: true, 
  30.         get: function reactiveGetter() { 
  31.               // 当有获取该属性时,证明依赖于该对象,因此被添加进收集器中 
  32.             if (Dep.target) { 
  33.                 dep.addSub(Dep.target) 
  34.             } 
  35.             return v 
  36.         }, 
  37.         // 重新设置值时,触发收集器的通知机制 
  38.         set: function reactiveSetter(nV) { 
  39.             v = nV 
  40.             dep.nofify() 
  41.         }, 
  42.     }) 
  43.  
  44. // 依赖收集器 
  45. class Dep { 
  46.     constructor() { 
  47.         this.subs = [] 
  48.     } 
  49.     addSub(sub) { 
  50.         this.subs.push(sub) 
  51.     } 
  52.     notify() { 
  53.         this.subs.map(sub => { 
  54.             sub.update() 
  55.         }) 
  56.     } 
  57.  
  58. Dep.target = null 
  59.  
  60. // 观察者 
  61. class Watcher { 
  62.     constructor(obj, key, cb) { 
  63.         Dep.target = this 
  64.         this.cb = cb 
  65.         this.obj = obj 
  66.         this.key = key 
  67.         this.value = obj[key] 
  68.         Dep.target = null 
  69.     } 
  70.     addDep(Dep) { 
  71.         Dep.addSub(this) 
  72.     } 
  73.     update() { 
  74.         this.value = this.obj[this.key] 
  75.         this.cb(this.value) 
  76.     } 
  77.     before() { 
  78.         callHook('beforeUpdate') 
  79.     } 

4. virtual dom 原理实现

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

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

      • (编辑:ASP站长网)

网友评论
推荐文章
    热点阅读