Part3-5-3 Vue.js 3.0 响应式系统原理

Posted 沿着路走到底

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Part3-5-3 Vue.js 3.0 响应式系统原理相关的知识,希望对你有一定的参考价值。

Vue.js 3.0 响应式

Proxy 对象实现属性监听

多层属性嵌套,在访问属性过程中处理下一级属性

默认监听动态添加的属性

默认监听属性的删除操作

默认监听数组索引和 length 属性

可以作为单独的模块使用

核心方法

reactive / ref / toRefs / computed

effect

track

trigger

Proxy 使用的两个问题

Reflect.set 和 Reflect.deleteProperty 设置成功后返回 true,设置失败后返回 false

// 使用 type="module" 也会开启严格模式
<script>
    'use strict'
    // 问题1: set 和 deleteProperty 中需要返回布尔类型的值
    // 在严格模式下,如果返回 false 的话会出现 Type Error 的异常
    const target = {
      foo: 'xxx',
      bar: 'yyy'
    }
    // Reflect.getPrototypeOf()
    // Object.getPrototypeOf()
    const proxy = new Proxy(target, {
      get (target, key, receiver) {
        // return target[key]
        return Reflect.get(target, key, receiver)
      },
      set (target, key, value, receiver) {
        // target[key] = value
        return Reflect.set(target, key, value, receiver)
      },
      deleteProperty (target, key) {
        // delete target[key]
        return Reflect.deleteProperty(target, key)
      }
    })

    proxy.foo = 'zzz'
    // delete proxy.foo


    // 问题2:Proxy 和 Reflect 中使用的 receiver

    // Proxy 中 receiver:Proxy 或者继承 Proxy 的对象
    // Reflect 中 receiver:如果 target 对象中设置了 getter,getter 中的 this 指向 receiver

    const obj = {
      get foo() {
        console.log(this)
        return this.bar
      }
    }

    const proxy = new Proxy(obj, {
      get (target, key, receiver) {
        if (key === 'bar') { 
          return 'value - bar' 
        }
        return Reflect.get(target, key, receiver)
      }
    })
    console.log(proxy.foo)
  </script>

reactive

接收一个参数,判断这参数是否是对象

创建拦截器对象 handler ,设置 get / set / deleteProperty

返回 Proxy 对象

1

以上是关于Part3-5-3 Vue.js 3.0 响应式系统原理的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 3.0官方文档

Vue.js 3.0官方文档

Vue.js 3.0 新特性预览

尤雨溪:Vue.js 3.0 计划

Vue.js 3.0 新特性预览

Vue.js 3.0 组件是如何渲染为 DOM 的?