前端开发

 首页 > 前端开发 > javascript > 模拟vue数据劫持实现发布订阅核心代码最新评论添加评论

模拟vue数据劫持实现发布订阅核心代码最新评论添加评论

分享到:
【字体:
导读:
         [导读] 模拟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网。

分享到:
js中中文输入判断compositionstart和comp...
js中中文输入判断compositionstart和compositionend事件 需求 最近有个需求,根据input输入的文字进行列表过滤。这是个很常见的需求。于是大致的代码如下:                             {{ item }}                export default {   name: "app",   data...
js如何获取当前操作系统的字体列表最新评...
有一个需求是JS如何获得当前操作系统的字体列表?貌似JS没有这方面API,有一个思路给到大家,我们可以先初始化当前系统对应所有字体列表,然后创建canvas去渲染字体,如果不成功则不是,成功则是,然后构造成一个数组。 代码如下:      JS获取当前系统字体                // 系统支持的所有...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……