在渲染之前,会取setup的返回结果,挂到VNode上,具体看下代码:
function handleSetupResult(instance, setupResult, isSSR) {
if (isFunction(setupResult)) {
{
instance.render = setupResult;
}
} else if (isObject(setupResult)) {
if (isVNode(setupResult)) {
warn(
`setup() should not return VNodes directly - return a render function instead.`
);
}
instance.setupState = proxyRefs(setupResult);
} else if (setupResult !== void 0) {
warn(
`setup() should return an object. Received: ${
setupResult === null ? "null" : typeof setupResult
}`
);
}
finishComponentSetup(instance, isSSR);
}
proxyRefs(setupResult)结果用proxyRefs进行了处理,看下proxyRefs函数:
function proxyRefs(objectWithRefs) {
return isReactive(objectWithRefs)
? objectWithRefs
: new Proxy(objectWithRefs, shallowUnwrapHandlers);
}
const shallowUnwrapHandlers = {
get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),
set: (target, key, value, receiver) => {
const oldValue = target[key];
if (isRef(oldValue) && !isRef(value)) {
oldValue.value = value;
return true;
} else {
return Reflect.set(target, key, value, receiver);
}
},
};
unref里面代码
function unref(ref2) {
return isRef(ref2) ? ref2.value : ref2;
}
function isRef(r) {
return !!(r && r.__v_isRef === true);
}
结论
- 模版里面数据,来自setup函数返回的结果
- setup返回结果,通过proxyRefs进行了拦截代理
- 最终,取值会走拦截器get,通过unref自动取value的值