vue2响应式

vue2响应式,第1张

 function defineReactive(target, key, value) {
    observer(value)
    Object.defineProperty(target,key, {
      get() {
        return value
      },
      set(newValue) {
        if(newValue !== value) {
          value = newValue
          updateView()
        }
      }
    })
  }
  const oldArrayProperty = Array.prototype
  const arrProto = Object.create(oldArrayProperty)
  const larr = ['push','pop', 'unshift','shift', 'reverse','splice']
  larr.forEach(method => {
    (arrProto[method]) = function () {
      updateView()
      return oldArrayProperty[method].call(this,...arguments)
    }
  })
  function observer(target) {
    if(typeof target !== 'object' || target === null) {
      return target
    }
    if(Array.isArray(target)) {
      // 处理数组
      target.__proto__ = arrProto
      for (let i = 0; i< target.length; i++) {
        observer(target[i])
      }
    }else {
      for (let key in target) {
        defineReactive(target, key, target[key])
      }
    }
  }
  function updateView() {
    console.log('视图更新了')
  }
  const data = {
    name: '小马哥',
    age: 20,
    info: {
      address: '北京'
    },
    favs: [1,2,3,4]
  }
  observer(data)

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1320362.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-11
下一篇2022-06-11

发表评论

登录后才能评论

评论列表(0条)

    保存