# vue 的插槽

1. 概念:

Vue 实现了一套内容分发的 API,slot 相当于是组件当中的一个占位符,可以用来在组件中显示一块 HTML 代码(HTML 模板)。也是组件通信的一种方式。

注意:插槽的显示位置由子组件说了算。将 slot 写在子组件哪,父组件传过来的模板将来就显示在哪

2. 插槽 VS 自定义属性

插槽: 将数据写在组件标签内

1
2
3
<my-div>
<p>这里是传给子元素的数据</p>
</my-div>

自定义属性: 写在组件标签的属性上

1
2
<my-div pp="这里是传给子元素的数据">
</my-div>

3. 插槽的分类

  1. 单个插槽(默认插槽)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    父组件:
    <custom-div>
    <p class="red">
    p标签最终会在子组件的slot中显示
    </p>
    </custom-div>
    子组件:
    <script>
    ...
    customDiv:{
    template:`<div>
    <h1>hello-子组件</h1>
    <slot></slot>
    <p>这里是子组件的描述</p>
    </div>`
    }
    </script>
  2. 具名插槽
    命名插槽只能使用在 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
    35
    36
    父组件:
    <custom-div>
    <!-- 在这里有很多个插槽,会分别使用进去 -->
    <div>
    这是第1个插槽:默认插槽
    </div>
    <!-- 注意:命名插槽只能使用在template标签上
    https://cn.vuejs.org/v2/guide/components-slots.html#%E5%85%B7%E5%90%8D%E6%8F%92%E6%A7%BD
    语法:
    <template v-slot:名字>
    包含的任意插槽内容
    </template>
    //在定义处写:
    <slot name='名字'></slot>
    -->
    <template v-slot:one>
    <div>
    这是第2个插槽: 命名插槽
    </div>
    </template>
    </custom-div>

    子组件:
    <script>
    ...
    "custom-h3":{
    template:`<div>
    <h3>hello-子组件</h3>
    <!-- 第1个插槽:默认插槽,没有命名 -->
    <slot></slot>
    <!-- 第2个插槽:命名插槽 -->
    <slot name="one"></slot>
    <p>这里是描述3</p>
    </div>`
    }
    </script>

    以上两种插槽相当于是实现了:父 -> 子的数据传递

  3. 作用域插槽

    即在 slot 上绑定数据,传递给父级作用域使用。(类似于子到父)

    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
    35
    36
    37
    38
    39
    父级:
    <custom-h3>
    <!--
    此处为父级作用域
    用法:
    v-slot:default="getWord"
    含义:使用带值的 v-slot 来定义我们提供的插槽 prop 的名字
    其中default可以省略
    注意:默认插槽的缩写语法不能和具名插槽混用,因为它会导致作用域不明确。

    -->
    <template v-slot:default="getWord" >
    <div>
    这是第3个插槽: 作用域插槽
    <!-- 使用数据:
    插槽prop名字.slot属性props
    -->
    <span style="color: red">{{getWord.word}}</span>
    </div>
    </template>

    </custom-h3>

    子级:
    <script>
    ...
    "custom-h3":{
    data(){
    return{
    tofather:"给父级用"
    }
    },
    template:`<div>
    <h3>hello-vue3</h3>
    <!--绑定在 <slot> 元素上的 attribute 被称为插槽 prop-->
    <slot :word="tofather"></slot>
    </div>`
    }
    </script>
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

tz 微信支付

微信支付

tz 支付宝

支付宝