返回

Vue3的响应式API是如何实现的——浅层响应与原型链的响应式处理

前端

浅层响应shallowReactive

shallowReactive可以使对象变成响应式对象,与reactive不同的是,shallowReactive只响应第一层对象的变动,即对于嵌套对象,仅响应其属性的变更,而不响应嵌套对象本身。

const obj = {
  foo: 'bar',
  baz: {
    qux: 'quux'
  }
}

const shallowProxy = shallowReactive(obj)
shallowProxy.foo = 'new value' // 响应
shallowProxy.baz.qux = 'new value' // 不响应

判断响应式isReactive

isReactive用于判断一个对象是否为响应式对象,即是否被proxy代理过。

isReactive(obj) // true

代理对象作为原型

当代理对象作为原型时,子对象的变动不会触发父对象的响应。

const parent = reactive({
  foo: 'bar'
})

const child = {
  __proto__: parent,
  baz: 'qux'
}

child.foo = 'new value' // 不响应
child.baz = 'new value' // 响应

深层响应

Vue3提供了另一种响应式API——reactive,它可以使整个对象都变成响应式对象,包括嵌套对象。

const obj = {
  foo: 'bar',
  baz: {
    qux: 'quux'
  }
}

const proxy = reactive(obj)
proxy.foo = 'new value' // 响应
proxy.baz.qux = 'new value' // 响应

实现原理

Vue3的响应式系统是基于Proxy实现的。Proxy是一个JavaScript API,允许我们创建一个对象来代理另一个对象,从而拦截对该对象的访问和操作。

当我们调用reactive时,Vue3会创建一个代理对象,并将其与原始对象关联起来。当我们对代理对象进行操作时,Vue3会拦截这些操作,并更新原始对象。

总结

Vue3的响应式API提供了多种方式来创建响应式对象,从而使我们的代码更具灵活性。在本文中,我们探讨了shallowReactive、isReactive、代理对象作为原型和深层响应等内容,希望对您的学习有所帮助。