除了用户可以使用reactive、shallowReactive、readonly、shallowReadonly创建代理外,Vue3内部也创建了若干代理。
一 渲染代理
创建组件实例时,会创建组件的渲染代理。
function setupStatefulComponent(instance,isSSR) {
// ...
instance.proxy = markRaw( // 标记为不可代理
new Proxy(instance.ctx, PublicInstanceProxyHandlers) // 创建代理
)
// ...
}
二 输入属性代理
浏览器端渲染类组件时,会创建输入属性代理。
if (isStateful) {
instance.props = isSSR ? props : shallowReactive(props)
}
三 透传属性代理
创建setup函数的上下文时,会创建透传属性代理。
export function createSetupContext(instance){
// ...
return {
get attrs() {
return attrs || (attrs = createAttrsProxy(instance))
},
slots: instance.slots,
emit: instance.emit,
expose
}
}
四 暴露代理
子组件若有expose,父组件中访问子组件时使用的是暴露代理。
export function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount) {
// ...
const refValue =
vnode.shapeFlag & ShapeFlags.STATEFUL_COMPONENT
? getExposeProxy(vnode.component) || vnode.component.proxy
: vnode.el;
// ...
}