• Vue32 插槽


    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 效果

  • 相关阅读:
    android 设置状态栏与标题背景颜色一致
    Android 无标题、全屏设置
    android Activity绑定Service
    lua入门之四元表
    lua入门之三module
    lua入门之二table
    lua入门之一函数
    Cocos2dx 3.10版编译安卓报卷标错误
    js 创建、添加、删除元素节点 添加文本节点
    正则表达式
  • 原文地址:https://www.cnblogs.com/jthr/p/16518008.html
Copyright © 2020-2023  润新知