vue3如何实现响应式

使用Proxy和Reflect实现响应式

优点:

  • 深度监听,性能高。只有在访问时候才会递归深度监听
  • 可监听属性新增和删除
  • 可监听数组

缺点:

  • 无法兼容所有浏览器
function reactive (target = {}) {
  if (typeof target !== 'object' || target === null) {
    return target
  }
  const proxyConf = {
    get (target, key, receiver) {
      const result = Reflect.get(target, key, receiver)
      return reactive(result)
    },
    set (target, key, val, receiver) {
      const oldVal = target[key]
      const result = Reflect.set(target, key, val, receiver)
      const keys = Reflect.ownKeys(target)
      if (oldVal === val) {
        return true
      }
      if (keys.includes(key)) {
        console.log('已有的属性');
      } else {
        console.log('新增的属性');
      }
      return result
    },
    deleteProperty (target, key, receiver) {
      return Reflect.deleteProperty(target, key, receiver)
    }
  }
  const proxyData = new Proxy(target, proxyConf)
  return proxyData
}

results matching ""

    No results matching ""