Vue slot原理分析一

Vue中插槽可以分为两种

  • 普通插槽,就是不给名字的默认插槽和具名插槽
  • 作用域插槽,就是使用子作用域数据的插槽

1.普通插槽

<!-- 场景设置 -->
<!-- 父组件 -->
<div>
    <test>我是slot中的内容</test>
</div>
<!-- 子组件:test -->
<main>
    我在子组件中
    <slot></slot>
</main>

普通插槽解析流程,父组件先解析,将test作为子组件处理,生成这样的节点

{
    tag: 'div',
    children: [{
        tag: 'test',
        children: ['插入slot中']
    }]
}

子组件解析,slot作为一个占位符,会被解析成一个函数

// 子组件被解析成这样
{
    tag: 'main',
    children: [
        '我在子组件里面',
        // 不传递插槽的名称默认就是default, 如果传了就是传入的名称
        _t('default')
    ]
}

2.作用域插槽

<!-- 场景设置 -->
<!-- 父组件 -->
<div>
    <test>
        <template slot-scope="slotProps">
            插入slot中{{slotProps}}
        </template>
    </test>
</div>
<!-- 子组件:test -->
<main>
    我在子组件中
    <slot :child="child"></slot>
</main>

data() {
    return { child: 111 }
}

主要的解析流程如下:

  1. 父组件先解析
{
    tag: 'div',
    children: [{
        tag: 'test',
        scopeSlots: {
            default(slotProps) {
                return ['插入slot中' + slotProps]
            }
        }
    }]
}
  1. 子组件解析,slot作为一个占位符,会被解析成一个函数
{
    tag: 'main',
    children: [
        '我在子组件中',
        // 这里的{ child: 111 }就是传递给插槽中的数据
        _t('default', { child: 111 })
    ]
}

最终会解析成

{
    tag: 'main',
    children: [
        '我在子组件里面', 
        '插入slot 中 {child:11}'
    ]
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值