vue的slot--插槽

插槽

1. 插槽的作用

在组件模板中定义slot插槽,允许在使用组件时,在组件标签内部定义要渲染在插槽位置的内容

2. 插槽的分类

  • 匿名插槽
  • 具名插槽
  • 作用域插槽

3. 匿名插槽

父组件template

<div id="app">
    <!-- 子组件panel: 正在进行 -->
    <panel :list="pending">
        <h1>正在进行</h1>
    </panel>
    <!-- 子组件panel: 已经完成 -->
    <panel :list="resolve">
        <template>
            <h4>已经完成</h4>
        </template>
    </panel>
</div>

子组件panel的template

<div class="box">
    <!-- 匿名插槽-->
    <slot></slot>
    <ul>
        <li v-for="(item,index) in list">{{item}}</li>
    </ul>
</div>

4. 具名插槽

父组件template

<div id="app">
    <!-- 正在进行 -->
    <panel :list="pending">
        <template v-slot:header>
            header的内容
        </template>
        <template v-slot:footer>
            footer的内容
        </template>
        
        <!-- 任何没有被包裹在带有 v-slot 的 <template> 中的内容都会被视为默认插槽的内容。-->
        <h1>我是默认的</h1>
    </panel>
    
</div>

子组件template

<div class="box">
    <!-- 有名字的插槽-->
    <slot name="header"></slot>
    <hr>
    <!-- 默认插槽-->
    <slot></slot>
    <ul>
        <li v-for="(item,index) in list">{{item}}</li>
    </ul>
    <!-- 有名字的插槽-->
    <slot name="footer"></slot>
</div>

5. 作用域插槽

作用域插槽: 可以把组件内部数据传递给对应模板的插槽

作用域插槽的作用: 在插槽对应的模板中可访问组件内部的数据

示例:

<slot name="header" :msg="msg" :num="num"></slot>

模板接收数据:

<template v-slot:header="data">
 *** data是所有数据组成的集合
  • 案例

    父组件的template

        <div id="app">
            <!-- 正在进行 -->
            <panel :list="pending">
                <template v-slot:header="data">
                    header的内容---{{data.msg}}-----{{data.num}}
                </template>
                <template v-slot:footer>
                    footer的内容
                </template>
                <h1>我是默认的</h1>
            </panel>
            
        </div>
    

    子组件

    Vue.component("panel", {
        props: {
            list: Array
        },
        data(){
            return {
                msg: '我是子组件的数据',
                num: 9
            }
        },
        template: `
            <div class="box">
                <slot name="header" :msg="msg" :num="num"></slot>
                <hr>
                <slot></slot>
                <ul>
                    <li v-for="(item,index) in list">{{item}}</li>
                </ul>
                <slot name="footer"></slot>
            </div>
        `
    })
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值