vue2响应式的实现
vue2响应式
响应式:
1.数据必须联动(双向绑定),使用发布订阅模式。
2.需要捕获到数据修改(数据劫持),使用Object.defineProperty
实现:
// vue2响应式的实现
// 订阅器模型
let Dep = {
  clientKist: {},//容器
  // 订阅
  listen: function (key, fn) {
    (this.clientKist[key] || (this.clientKist[key] = [])).push(fn);
  },
  // 发布
  trigger: function () {
    let key = Array.prototype.shift.call(arguments),
      fns = this.clientKist[key]
    if (!fns || fns.length === 0) {
      return false
    }
    for (let i = 0, fn; fn = fns[i++];) {
      fn.apply(this, arguments)
    }
  }
}
// 数据劫持
let dataHi = function ({ data, tag, datakey, selector }) {
  let value = '',
    el = document.querySelector(selector);
  Object.defineProperty(data, datakey, {
    // 取值
    get: function () {
      console.log('取值')
      return value
    },
    // 设置值
    set: function (val) {
      console.log('设置值')
      value = val
      Dep.trigger(tag, val)
    }
  })
  Dep.listen(tag, function (text) {
    el.innerHTML = text
  })
}
使用:
<div>
视图一:<span class='box-1'></span>
</div>
let obj = {}
dataHi({
  data: obj,
  tag: 'view-1',
  datakey: 'one',
  selector:'.box-1'
})
obj.one='初始化视图一'
本文来自博客园,🐱🚀作者:FAIGEL,打字创作不易,如转载请注明原文链接:https://www.cnblogs.com/FAIGEL/articles/17337321.html。谢谢✨

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号