- setup函数是vue3新增组件选项,其作用为
- 配合组合式api,建立组合逻辑、创建响应式数据、创建通用函数,注册生命周期钩子的能力
- setup函数只会在被挂载时执行
- setup返回值有两种
- 在渲染组件的函数中从组件上取出setup,获取其执行的返回值,判断其是否为函数,并将其挂载到组件实例上
- 若为函数,则赋值给instance.render
- 若为对象,则将其变成响应式,并赋值给instance.setupState
export function setupComponent(instance){
let { type,props,children} = instance.vnode
let {data,render,setup} = type
initProps(instance,props);
instance.proxy = new Proxy(instance,instanceProxy);
if(data){
if(!isFunction(data)){
return console.warn('The data option must be a function.')
}
instance.data = reactive(data.call({}))
}
if(setup){
const context = {}
const setupResult = setup(instance.props,context)
if(isFunction(setupResult)){
instance.render = setupResult
}else if(isObject(setupResult)){
instance.setupState = proxyRefs(setupResult)
}
}
if(!instance.render){
if(render){
instance.render = render
}else {
}
}
}
- 同时,instance的数据代理上做出对setupState的监听
const instanceProxy = {
get(target,key){
const { data,props,setupState} = target
if(data && hasOwn(data,key)){
return data[key]
}else if(setupState && hasOwn(setupState,key)){
return setupState[key]
}
else if(props && hasOwn(props,key)){
return props[key]
}
let getter = publicProperties[key]
if(getter){
return getter(target)
}
},
set(target,key,value,receiver){
const {data,props,setupState} = target
if(data && hasOwn(data,key)){
data[key] = value
}else if( setupState && hasOwn(setupState,key)){
setupState[key] = value
}
else if(props && hasOwn(props,key)){
console.warn('props not update');
return false
}
return true
}
}