Vue 插槽slot 常用整理

update: 2021/1

v-slot 指令版本

1. 普通插槽

  • 父组件:
<template>
    <base-layout>
      abc
    </base-layout>
 </template>
  • 子组件BaseLayout.vue
<template>
  <div>
      <slot></slot>
  </div>
</template>

运行结果:
在这里插入图片描述

2. 具名插槽

父组件:使用<template v-slot:**>绑定插槽。
子组件:使用<slot name="**">接收插槽传递的内容。
  • 父组件:
<template>
    <base-layout>
      <template v-slot:title>
        title
      </template>
      <template v-slot:content>
        content
      </template>
    </base-layout>
 </template>
  • 子组件:
<template>
  <div>
    <h2 class="title">
      <slot name="title"></slot>
    </h2>
    <div class="content">
      <slot name="content"></slot>
    </div>
  </div>
</template>

注意 v-slot 只能添加在 <template> (只有一种例外情况),这一点和已经废弃的 slot attribute 不同。

运行结果:
在这里插入图片描述

3. 作用域插槽

简单来说,作用域插槽是让父组件可以访问子组件插槽里的值的方式。

3.1 独占默认插槽的缩写语法方式:

  • 父组件:
<template>
    <base-layout>
        <template v-slot="slotProps">
        {{slotProps.user.age}}
        </template>
    </base-layout>
</template>
  • 子组件:
<template>
  <div>
    <slot v-bind:user="user">
      {{user.name}}
    </slot>
  </div>
</template>

<script>
export default {
  data () {
    return {
      user: {
        name: 'abc',
        age: 18
      }
    }
  }
}
</script>

若父组件插槽不写,则默认显示子组件的user.name的值。

运行结果:
在这里插入图片描述

3.2 多个作用域插槽的写法:

  • 父组件:
<template>
    <base-layout>
      <template v-slot:default="slotProps">
        {{slotProps.user.age}}
      </template>
      <template v-slot:other="otherSlotProps">
        {{otherSlotProps.city.loc}}
      </template>
      <template v-slot:other2="otherSlotProps2">
        {{otherSlotProps2.sport.time}}
      </template>
    </base-layout>
</template>
  • 子组件:
<template>
  <div>
    <slot name="default" v-bind:user="user">
      {{user.name}}
    </slot>
    <slot name="other" :city="city"></slot>
    <slot name="other2" :sport="sport"></slot>
  </div>
</template>

<script>
export default {
  data () {
    return {
      user: {
        name: 'abc',
        age: 18
      },
      city: {
        name: 'shandong',
        loc: 'east'
      },
      sport: {
        name: 'tennis',
        time: 'eleven'
      }
    }
  }
}
</script>

注意默认插槽的缩写语法不能和具名插槽混用,因为它会导致作用域不明确

运行结果:
在这里插入图片描述

3.3 多组件插槽嵌套的写法

  • 父组件:
<template>
	<base-info-template>
        <template v-slot:title="slotProps" >
            业务父组件页面 {{slotProps.titleData}}
        </template>
	<base-info-template>
</template>
  • 子组件BaseLayout.vue
<template>
    <base-layout>
      <template v-slot:middleware="{user}">
        <span style="color: pink;">{{user.age}}</span>
        <slot name="title" :titleData="titleData"></slot>
      </template>
    </base-layout>
</template>

<script>
import BaseLayout from './BaseLayout'
export default {
  data () {
    return {
		titleData: '**默认标题**'
    }
  }
}
</script>
  • 子组件BaseInfoTemplate.vue再引用子组件``BaseLayout.vue`:
<template>
    <div>
      <slot name="middleware" :user="user">
        {{user.name}}
      </slot>
    </div>
</template>

<script>
export default {
  data () {
    return {
	  user: {
        name: 'abc',
        age: 18
      }
    }
  }
}
</script>

运行结果:
在这里插入图片描述

解构插槽 Prop:官方文档

这个算是个语法糖~

eg.(同3.3的父组件代码)

<template>
    <base-info-template>
      <template v-slot:title="{titleData}" >
        业务父组件页面{{titleData}}
      </template>
    </base-info-template>
</template>

具名插槽的缩写官方文档

eg.(同3.3的父组件代码)

<template>
    <base-info-template>
      <template #title="slotProps" >
        业务父组件页面 {{slotProps.titleData}}
      </template>
    </base-info-template>
</template>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值