vue.js 整理(一)

105 阅读1分钟

内容均来自深入浅出vue.js 作为笔记使用

1 对象变化检测

  function detectChange(obj,key,val){                                                                 
   Object.defineProperty(obj,key,function(){
     enumerable:true,
     configurable:true,
     get(){
       return val
     },
     set(newVal){
       if(val==newVal){
         return 
       }else{
       val = newVal
     }
   })
  }

2依赖收集

数据发生变化时,怎么通知使用它的地方
假设依赖收集为window.target
依赖收集的逻辑大概如下:

 export default class Dep {
      constructor() {
        this.subs = []
      }
      addSub(sub) {
        this.subs.push(sub)
      }
      removeSub(sub) {
        remove(this.subs, sub)
      }
      depend() {
        if (window.target) {
          this.addSub(window.target)
        }
      }
      notify() {
        const subs = this.subs.slice()
        for (let i = 0, l = subs.length; i < l; i++) {
          subs[i].update()
        }
      }
    }
    //  删除数组中某个值
    function remove(arr, item) {
      if (arr.length) {
        const index = arr.indexOf(item)
        if (index != -1) {
          return arr.splice(index, 1)
        }
      }
    }

之前对象监测改造一下

  function detectChange(obj,key,val){    
     let dep = new Dep()//新增
     Object.defineProperty(obj,key,function(){
       enumerable:true,
       configurable:true,
       get(){
           dep.depend()//新增
           return val
        },
       set(newVal){
         if(val==newVal){
           return 
         }else{
           val = newVal
           dep.notify()//新增
        }
     })
  }

3 依赖 window.target

它类似一个watcher 的角色,当有数据变化时,只需要通知它一个,再由它去通知其他地方 eg:

   vm.$watch('a.b.c',function(newVal,oldVal){
    //当data.a.b.c发生变化时会触发第二个参数中的函数。
   })