网站地图    收藏   

主页 > 前端 > javascript >

模拟vue数据劫持实现发布订阅核心代码

来源:未知    时间:2023-03-31 18:42 作者:小飞侠 阅读:

[导读] 模拟vue数据劫持实现发布订阅核心代码 //定义一个依赖收集器classDep{constructor(){this.subs=[]//订阅者列表}//添加订阅者addSub(sub){this.subs.push(sub)}//通知所有订阅者数据已更新notify(){this.subs....

模拟vue数据劫持实现发布订阅核心代码

// 定义一个依赖收集器
class Dep {
  constructor() {
    this.subs = [] // 订阅者列表
  }
  // 添加订阅者
  addSub(sub) {
    this.subs.push(sub)
  }
  // 通知所有订阅者数据已更新
  notify() {
    this.subs.forEach(sub => sub.update())
  }
}

// 定义一个观察者
class Watcher {
  constructor(vm, exp, cb) {
    this.vm = vm
    this.exp = exp
    this.cb = cb
    this.value = this.get() // 初始化值
  }
  // 获取当前值
  get() {
    Dep.target = this // 将当前订阅者指向该自身
    let value = this.vm[this.exp] // 获取当前值,并触发依赖收集
    Dep.target = null // 收集完毕后,将订阅者置空
    return value
  }
  // 当被依赖的数据更新时,触发更新回调
  update() {
    let value = this.vm[this.exp]
    if (value !== this.value) {
      this.cb.call(this.vm, value, this.value)
      this.value = value
    }
  }
}

// 数据劫持函数
function observe(obj, vm) {
  if (!obj || typeof obj !== 'object') {
    return
  }
  Object.keys(obj).forEach(key => {
    defineReactive(vm, key, obj[key])
  })
}

// 定义一个数据劫持函数
function defineReactive(vm, key, val) {
  let dep = new Dep() // 定义依赖收集器

  Object.defineProperty(vm, key, {
    get() {
      if (Dep.target) {
        dep.addSub(Dep.target) // 添加订阅者
      }
      return val
    },
    set(newVal) {
      if (newVal === val) {
        return
      }
      val = newVal
      dep.notify() // 数据更新,通知所有订阅者
    }
  })
}

以上代码中,Dep类是依赖收集器,Watcher类是观察者,defineReactive函数是数据劫持函数。在数据劫持过程中,会监听对象的属性的变化,一旦有变化会触发数据改变的通知,通知所有已经订阅当前值的订阅者进行数据更新。同时,也提供了添加订阅者和通知订阅者更新的接口。

以上就是模拟vue数据劫持实现发布订阅核心代码全部内容,感谢大家支持自学php网。

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论