海边的小溪鱼

vuePress-theme-reco 海边的小溪鱼    2017 - 2023
海边的小溪鱼 海边的小溪鱼

Choose mode

  • dark
  • auto
  • light
首页
分类
  • CSS
  • HTTP
  • Axios
  • jQuery
  • NodeJS
  • JavaScript
  • Vue2
  • Server
  • Vue3
标签
时间轴
更多
  • Gitee (opens new window)
Getee (opens new window)
author-avatar

海边的小溪鱼

28

文章

14

标签

首页
分类
  • CSS
  • HTTP
  • Axios
  • jQuery
  • NodeJS
  • JavaScript
  • Vue2
  • Server
  • Vue3
标签
时间轴
更多
  • Gitee (opens new window)
Getee (opens new window)

插槽(slot)

vuePress-theme-reco 海边的小溪鱼    2017 - 2023

插槽(slot)

海边的小溪鱼 2022-07-14 Vue2

默认插槽、具名插槽、作用域插槽 的基本使用与传值

插槽:使用 slot 标签,预留一个不确定内容的区域,将来会把自定义的内容填充到预留的区域

作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式

# 1. 默认插槽

默认插槽:没有 name 属性的插槽,插槽的默认名称为 default

image-20211106182255045

# 2. 具名插槽

具名插槽:声明多个插槽时,应该为每一个插槽起一个名称

子组件:声明具名插槽 <slot name="插槽名称"></slot>
父组件:定义内容 <template v-slot:left>自定义内容</template>
image-20211106182255045

v-slot(插槽指令)的作用:把内容填充到指定名称的插槽中
注意:v-slot 插槽指令,只能用在 template 身上,template 只是起到包裹的作用
简写:v-slot: 可以简写为 #(如:v-slot:left 简写为 #left)

# 3. 作用域插槽

作用域插槽:带有数据/自定义属性的插槽,称为"作用域插槽"

子组件:通过 插槽绑定数据 传递给父组件,传递的数据是一个对象(子向父传值)
父组件:接收 具名插槽 传递过来的数据(是一个对象),我们可以直接使用这个对象
image-20211106182255045 注意:子组件在给插槽绑定数据的时候,既可以写固定的值,也可以用 v-bind 动态的绑定值

# 总结

子组件:声明一个插槽,预留一个不确定内容的区域(将来自定义的内容会填充到这个区域)

<template>
    <div class="box-right">
        <h3>Right 组件</h3>
        <!-- 1. 默认插槽:没有 name 属性的插槽,插槽的默认名称为 default -->
        <slot>将来自定义的内容会填充到这个区域</slot>
        
        <!-- 2. 具名插槽:带 name 属性的插槽,称为"具名插槽",name属性的值,也就是插槽名称 -->
        <slot name="title">标题</slot>
        <slot name="content">内容</slot>
        
        <!-- 3. 作用域插槽:带有数据/自定义属性的插槽,称为"作用域插槽" -->
        <slot name="foot" uname="纳兰性德" :years="userinfo">作者信息</slot>
        <!--
		作用域插槽的作用:
        	子组件 可以通过 插槽绑定数据 传递给父组件,传递的数据是一个对象(子向父传值)
        	在给插槽绑定数据的时候,既可以写固定的值,也可以用 v-bind 动态的绑定值
		-->
</template>

<script>
export default {
    data() {
        return {
            // 作者信息对象
            userinfo: {
                age: "清"
            }
        }
    }
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

父组件:把内容填充到指定名称的插槽中

<template>
    <div class="app-conuainer">
        <div class="box">
            <!--
                v-slot 插槽指令:把内容填充到指定名称的插槽中
                    (1). v-slot: 简写为 #
                    (2). 只能用在 template 身上,template只是起到包裹的作用
                    (3). v-slot:后面的值对应的是 <slot name="">标签中 name属性的值,也就是插槽名称
            -->
            <Right>
                <template v-slot:title>
                    <h3>木兰花·拟古决绝词柬友</h3>
                </template>
                <template #content>
                    <p>人生若只如初见,</p>
                    <p>何事秋风悲画扇。</p>
                    <p>等闲变却故人心,</p>
                    <p>却道故人心易变。</p>
                </template>
                <!--  
                    作用域插槽:v-slot:插槽名称="对象名"(对象名是任意的,相当于形参,建议取名为scope)
                        用于接收 具名插槽 传递过来的数据(是一个对象),我们可以直接使用这个对象
                -->
                <template v-slot:foot="scope">
                    <span>作者:{{ scope.uname }} ----- 朝代:{{ scope.years.age }}</span>
                </template>
                <!-- 作用域插槽的解构赋值 -->
                <!-- <template #foot="{uname, years}">
                    <span>作者:{{ uname }} ----- 朝代:{{ years.age }}</span>
                </template> -->
            </Right>
        </div>
    </div>
</template>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
帮助我们改善此页面! (opens new window)