vue-组件-插槽

一、概要

插槽是指把任意内容插入指定的位置,而这个位置使用``作为占位符
简单的来说就是在组件的某个节点内预留一个位置,当父组件调用该组件的时候可以指定该位置具体的内容子组件内插糟v-slot控制摆放位置

二、分类

**匿名插槽(也叫默认插槽): **
**具名插槽: **相对匿名插槽组件slot标签带name命名的
作用域插槽:子组件内数据可以被父页面拿到(解决了数据只能从父页面传递给子组件)

三、匿名插槽

1、说明

没有命名,有且只有一个

2、要点

  • 子组件声明 <slot></slot>
  • 父组件引入组件 ' <child-slot>'

3、栗子

DefaultSlot.vue

<template>
    <div>
        <h1>这里是父组件</h1>
        <!--匿名插槽开始-->
        <child-slot>
            <ul>
                <li>匿名插槽1</li>
                <li>匿名插槽2</li>
                <li>匿名插槽3</li>
                <li>匿名插槽4</li>
            </ul>
        </child-slot>
    </div>
</template>
<script>
    import ChildSlot from "./ChildSlot";
    export default {
        name: "DefaultSlot",
        components: {
            ChildSlot,
        }
    }
</script>

ChildSlot.vue

<template>
    <div>
        <h3>子组件</h3>
        <!-- 替换部分 -->
        <slot></slot>
    </div>
</template>
<script>
    export default {
        name: "ChildSlot"
    }
</script>
image

四、具名插槽

1、说明

主要是利用slot的name属性,可以用来定义额外的插槽 ,不带name的'slot'会默认带隐含的名字“default”

2、要点

  • 父组件
    <template v-slot="名字">
    </template>
    或者
    <template #名字>
    </template>
    
  • 子组件
    <slot name="名字"></slot>
    

3、注意

  • v-slot只能添加到template标签上
  • v-slot的简写形式#

4、栗子

NameSlot.vue

<template>
    <div>
        <h1>具名插槽</h1>
        <name-child-slot>
            <template #img>
                <span class="iconfont icon-shouye"></span>
            </template>
            <template #name>
                <span>首页</span>
            </template>
        </name-child-slot>
    </div>
</template>
<script>
    import NameChildSlot from "./NameChildSlot";
    export default {
        name: "NameSlot",
        components: {
            NameChildSlot,
        }
    }
</script>
image

五、作用域插槽

1、说明

作用域插槽 比前面的多了一个功能,父组件可以接收到子组件的数据,并且可以对数据进行操作

1、作用

用于将子组件的数据显示到父组件,但样式,由父组件决定。

23、要点

  1. template标签
  2. slot-scope接收
  3. slot定义属性传递值给template

4、应用场景

组件在只有自己的子组件会使用自己提供的数据时,通常出现在遍历渲染时

5、栗子

ScopeChildSlot.vue

<template>
    <div>
        <ul>
            <li v-for="(name,index) in names" :key="index">
                <slot name="up" :item='name'></slot>
            </li>
        </ul>
    </div>
</template>
<script>
    export default {
        data() {
            return {
                names: ['1号技师', '2号技师', '3号技师']
            }
        },
    }
</script>

image

ScopeParentSlot.vue

<template>
    <div>
        <scope-child-slot>
            <template #up="childData">
                <p v-text="childData.item"></p>
            </template>
        </scope-child-slot>
    </div>
</template>
<script>
    import ScopeChildSlot from "./ScopeChildSlot";
    export default {
        components: {
            ScopeChildSlot,
        },
    }
</script>
image

6、效果图

image
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 编译作用域 在vue组件中作用域简单的说就是: 父组件模板的内容在父组件的作用域内编译,子组件模板的内容在子组件的...
    羊烊羴阅读 1,610评论 0 1
  • 【2019-3-4更新】Vue 2.6+修改了部分语法,对插槽的使用有了较多的更新。在本文中笔者在相应位置给出了更...
    果汁凉茶丶阅读 10,312评论 2 36
  • 什么是组件? 组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装...
    youins阅读 9,536评论 0 13
  • 此文基于官方文档,里面部分例子有改动,加上了一些自己的理解 什么是组件? 组件(Component)是 Vue.j...
    陆志均阅读 3,870评论 5 14
  • 基础知识 【Vue】组件 - 插槽的基本用法 【Vue】组件 - 多个插槽 子组件里,在 里写上默认的内容。 在父...
    德育处主任阅读 3,580评论 0 1