vue 3.0的components.ts

export function createComponentInstance(vnode){
    const instance={
        vnode,
        type:vnode.type,
        props:{},
        attrs:{},
        slots:{},
        setupState:{},    //如果setup返回一个对象,这个对象会作为setUpstate
        ctx:{},
        isMounted:false,   //表示这个组件是否挂载过
        render:null
    }

    instance.ctx={_:instance}

    // props 和attrs 有什么区别?vnode.props中是包含props和attrs
    // webcomponent 组件需要有属性,插槽
    return instance;
}

export function setupComponent(instance){
    //
    const {props,children}=instance.vnode;   //type,props,children

    //根据props解析出props和attrs 将其放到instance上
    instance.props=props;    //initProps()
    instance.children=children;  //插槽的解析  initSlot()

    //需要先看一下  当前组件是不是有状态的组件,函数组件
    let isStateful=instance.vnode.shapeFlag & ShapeFlags.STATEFUL_COMPONEENT

    if (isStateful){   //表示现在是一个带状态的组件
        //调用当前实例的setup方法,用setup的返回值 填充setupState和对应的render方法
        setupStatefulComponent(instance);
    }

}

function setupStatefulComponent(instance){
    //代理  传递给render函数的参数

    //2.获取组件的类型,拿到组件setup方法
    let {Component}=instance.type;
    let {setup}=Component;

    let setupContext=createContext(instance);
    setup(instance.props,setupContext);
}

function createContext(instance){
    return {
        attrs:instance.attrs,
        slots:instance.slots,
        props:instance.props,
        emit:()=>{},
        expose:()=>{}
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vues

刚好遇见你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值