Vue插槽

1. 什么是插槽

插槽slot)是 Vue 为组件的封装者提供的能力。允许开发者在封装组件时,把不确定的,希望由用户指定的部分定义为插槽。
在这里插入图片描述

2. 插槽基本用法

  • 如果没有在组件内部声明插槽区域,则组件标签内的内容默认不显示

App.vue

<Left>
    <p>这是在 Left 组件声明的p标签</p>
</Left>

Left.vue

<div class="left-box">
    <span>Left 组件</span>
    <!-- 在 Left 组件内声明一个插槽区 -->
    <slot></slot>
</div>

3. v-slot: 将内容放在指定插槽

  • vue 官方规定:每一个 slot 插槽都要有一个 name 名称
  • 如果省略了 slot 的name 则有一个默认名称 default
  • 默认情况下,使用组件时提供的内容会被填充到 name 为 default 的插槽内

将内容放在指定的插槽内:

  • 使用 v-slot:xxx 其中 xxx为插槽 name 值,只能放在 <template> 标签内

  • 使用 <template> 标签包裹

  • <template> 是一个虚拟标签,只起到包裹性质的作用,不会被渲染为实质性的 html 元素

  • v-slot:xxx 可以简写#xxx

<Left>
    <template v-slot:mySlot>
        <p>这是在 Left 组件声明的p标签</p>
    </template>
</Left>
<slot name="mySlot"></slot>

4. 插槽后背(默认)内容

  • 当使用组件指定了插槽内容时,优先显示指定的内容
  • 当没有指定内容时,渲染 slot 标签内的默认内容
<slot name="mySlot">mySlot 默认内容</slot>

5. 具名插槽

App.vue

<Article>
    <template v-slot:title>
        <h3>一首诗</h3>
    </template>
    <template #content>
        <div>
            <p>哈哈哈</p>
            <p>哈哈哈</p>
            <p>哈哈哈</p>
        </div>
    </template>
    <template #footer>
        <p>娉婷</p>
    </template>
</Article>

Article.vue

div class="article-container">
        <div class="header-box">
            <slot name="title"></slot>
        </div>
        <div class="content-box">
            <slot name="content"></slot>
        </div>
        <div class="footer-box">
            <slot name="footer"></slot>
        </div>
    </div>

6. 作用域插槽

  • 在封装组件时,为预留的 <slot> 提供属性对应的值,叫做作用域插槽

  • 这些属性对应的值可以在父组件中访问到,默认为空对象

  • 子组件:

    <slot name="content" msg="hello vue.js"></slot>
    
  • 父组件

    obj 是形参

    <template #content="obj">
        <div>
            <p>{{obj}}</p> <!-- {"msg":"hello vue.js"} -->
            <p>{{obj.msg}}</p><!-- hello vue.js -->
        </div>
    </template>
    
    • 动态绑定

      data(){
          return{
              userInfo:{
                  name: 'pingting',
                  age: 12
              }
          }
      }
      
      <slot name="content" msg="hello vue.js" :user="userInfo"></slot>
      

      父组件可以通过解构获得需要的值

      <template #content="{msg:message , user: user}">
          <div>
              <p>{{message}}</p>
              <p>{{user.name}}</p>
              <p>{{user.age}}</p>
          </div>
      </template>
      
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值