简单实现Vue

本文通过简化实现,解释了Vue如何使用Object.defineProperty实现数据响应式,包括依赖收集、派发更新,并讨论了其在处理数组和对象新增属性时的局限性及Vue的解决策略。
摘要由CSDN通过智能技术生成

Vue 内部使用了 Object.defineProperty() 来实现数据响应式,通过这个函数可以监听到 set 和 get 的事件。

var data = { name: 'yck' }

observe(data)

let name = data.name // -> get value

data.name = 'yyy' // -> change value

 

function observe(obj) {

  // 判断类型

  if (!obj || typeof obj !== 'object') {

    return

  }

  Object.keys(obj).forEach(key => {

    defineReactive(obj, key, obj[key])

  })

}

 

function defineReactive(obj, key, val) {

  // 递归子属性

  observe(val)

  Object.defineProperty(obj, key, {

    // 可枚举

    enumerable: true,

    // 可配置

    configurable: true,

    // 自定义函数

    get: function reactiveGetter() {

      console.log('get value')

      return val

    },

    set: function reactiveSetter(newVal) {

      console.log('change value')

      val = newVal

    }

  })

}

以上代码简单的实现了如何监听数据的 set 和 get 的事件,但是仅仅如此是不够的,因为自定义的函数一开始是不会执行的。只有先执行了依赖收集,才能在属性更新的时候派发更新,所以接下来我们需要先触发依赖收集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值