返回
Vue3的响应式API是如何实现的——浅层响应与原型链的响应式处理
前端
2023-09-23 17:36:22
浅层响应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、代理对象作为原型和深层响应等内容,希望对您的学习有所帮助。