1 简介

  是一种组件间通信的方式,让父组件可以向子组件指定位置插入 html 结构。子组件中的提供给父组件使用的一个占位标签,用<slot></slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签。简单理解就是子组件中留下个“坑”,父组件可以使用指定内容来补“坑”。

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

 

2 匿名插槽

2.1 子组件 StudentComp.vue

  在子组件StudentComp.vue中,<h1>小学生</h1>这个标签下面的结构是不确定的,希望在父组件使用该组件的时候传入结构。所以在这里添加一个slot标签。并且可以填写默认结构,当父组件不传时显示默认结构

<template>
    <div>
       
        <h1>小学生</h1>

        <slot>默认内容(父组件不传结构时显示)</slot>
       
    </div>
    
</template>

<script>


    export default {
        name:'StudentComp',
        data(){
            return {
              
            }
        }
    }
</script>

 

2.2 父组件SchoolComp.vue

  如下,在使用StudentComp标签时,可以传入结构。在传入的结果上面需要加上一个属性slot,一般都用一个template标签来包裹要传入的结果

<template>
    <div>
        <h1 >实验小学</h1>
        <StudentComp >
            <template slot>
                <h1 >父组件传入的结构</h1>
                <button>父组件传入的结构</button>
            </template>
            
        </StudentComp>
        
    </div>
</template>

<script>
import StudentComp from './StudentComp'


    export default {
        name:'SchoolComp',
        data(){
            return {
               
            }
        },
        components:{
            StudentComp
        }
        
    }
</script>

 

2.3 效果

 

3 具名插槽

  具名插槽是匿名插槽的扩展。就是在slot标签加了一个name属性,这个样子可以区分多个slot标签

 

3.1 子组件StudentComp.vue

  这里有两个插槽,设置name属性

<template>
    <div>
       
        <h1>小学生</h1>

        <slot name="slot1">默认内容1(父组件不传结构时显示)</slot>

        <h1>中学生</h1>
        <slot name="slot2">默认内容2(父组件不传结构时显示)</slot>
       
    </div>
    
</template>

<script>


    export default {
        name:'StudentComp',
        data(){
            return {
              
            }
        }
    }
</script>

 

3.2 父组件SchoolComp.vue

  这里要传入的结果slot属性的值要设置为要插入的插槽的name属性值

<template>
    <div>
        <h1 >实验小学</h1>
        <StudentComp >
            <template slot="slot1">
                <h1 >父组件传入的结构</h1>
                <button>父组件传入的结构</button>
            </template>

            <template slot="slot2">
                <h1 >父组件传入的结构2</h1>
                <button>父组件传入的结构2</button>
            </template>
            
        </StudentComp>
        
    </div>
</template>

<script>
import StudentComp from './StudentComp'


    export default {
        name:'SchoolComp',
        data(){
            return {
               
            }
        },
        components:{
            StudentComp
        }
        
    }
</script>

 

3.3 效果

 

4 作用域插槽

  作用域插槽扩展了一个功能,可以把子组件的数据传到父组件

 

4.1 子组件StudentComp.vue

  在插槽,可以传入数据到父组件那里。

  在slot标签填写任意属性名,传入数据(可以填写多个属性名)

  这里传入了两个数据,名字分别为datalist和count

<template>
    <div>
       
        <h1>小学生</h1>

        <slot name="slot1" :datalist="datalist" :count="count">默认内容1(父组件不传结构时显示)</slot>

    </div>
    
</template>

<script>


    export default {
        name:'StudentComp',
        data(){
            return {
              datalist:['a','b','c'],
              count:1
            }
        }
    }
</script>

 

4.2 父组件SchoolComp.vue

  使用scope属性接收数据,接收到的是一个key-value对象

  如下面,通过data.datalist和data.count可以获取到两个数据

<template>
    <div>
        <h1 >实验小学</h1>
        <StudentComp >
            <template slot="slot1" scope="data">
                <ul>
                    <li v-for="(g,index) in data.datalist" :key="index">{{g + '-' + data.count}}</li>
                </ul>
            </template>

            
        </StudentComp>
        
    </div>
</template>

<script>
import StudentComp from './StudentComp'


    export default {
        name:'SchoolComp',
        data(){
            return {
               
            }
        },
        components:{
            StudentComp
        }
        
    }
</script>

 

4.3 效果