Vue插槽

官网地址:https://cn.vuejs.org/v2/guide/components-slots.html

基本使用

创建一个带插槽的组件
SlotDemo.vue

<template>
  <div>
    <h2>我是SlotDemo组件</h2>
    <!-- 插槽 -->
    <slot></slot>
  </div>
</template>

<script>
export default {}
</script>

<style lang="less" scoped>
</style>

使用
Demo.vue

<template>
  <div>
    <slot-demo>
      <!-- 插槽内容 -->
      <el-button type="success">成功</el-button>
    </slot-demo>
  </div>
</template>

<script>
import SlotDemo from './SlotDemo.vue'

export default {
  components: {
    'slot-demo': SlotDemo
  }
}
</script>

<style lang="less" scoped>
</style>

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

带默认内容的插槽

SlotDemo.vue

<template>
  <div>
    <h2>我是SlotDemo组件</h2>
    <slot>插槽默认内容</slot>
  </div>
</template>

<script>
export default {}
</script>

<style lang="less" scoped>
</style>

Demo.vue

<template>
  <div>
    <slot-demo></slot-demo>

    <slot-demo>
      <el-button type="success">成功</el-button>
    </slot-demo>
  </div>
</template>

<script>
import SlotDemo from './SlotDemo.vue'

export default {
  components: {
    'slot-demo': SlotDemo
  }
}
</script>

<style lang="less" scoped>
</style>

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

具名插槽

SlotDemo.vue

<template>
  <div>
    <h2>我是SlotDemo组件</h2>
    <!-- 一个不带 name 的 <slot> 出口会带有隐含的名字“default-->
    <slot></slot>
    <slot name="left"></slot>
    <slot name="center"></slot>
    <slot name="right"></slot>
  </div>
</template>

<script>
export default {}
</script>

<style lang="less" scoped>
</style>

Demo.vue

<template>
  <div>
    <slot-demo>
      <template v-slot:default>
        <el-button type="info">default</el-button>
      </template>
      <template v-slot:left>
        <el-button type="primary">left</el-button>
      </template>
      <template v-slot:center>
        <el-button type="success">center</el-button>
      </template>
      <template v-slot:right>
        <el-button type="warning">right</el-button>
      </template>
    </slot-demo>

	<!-- 缩写 # -->
    <slot-demo>
      <template #default>
        <el-button type="info">default</el-button>
      </template>
      <template #left>
        <el-button type="primary">left</el-button>
      </template>
      <template #center>
        <el-button type="success">center</el-button>
      </template>
      <template #right>
        <el-button type="warning">right</el-button>
      </template>
    </slot-demo>
  </div>
</template>

<script>
import SlotDemo from './SlotDemo.vue'

export default {
  components: {
    'slot-demo': SlotDemo
  }
}
</script>

<style lang="less" scoped>
</style>

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

编译作用域

父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

作用域插槽

SlotDemo.vue

<template>
  <div>
    <h2>我是SlotDemo组件</h2>
    <slot :user="user">{{user.name}}</slot>
    <br />
    <slot name="center" :user="user">{{user.name}}</slot>
  </div>
</template>

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

<style lang="less" scoped>
</style>

Demo.vue

<template>
  <div>
    <!-- 作用域插槽 -->
    <slot-demo>
      <template #default="slotProps">{{ slotProps.user.age}}</template>
    </slot-demo>

    <!-- 独占默认插槽的缩写语法 -->
    <!-- 不能这么写 <slot-demo #="slotProps">{{ slotProps.user.age}}</slot-demo> -->
    <slot-demo #default="slotProps">{{ slotProps.user.age}}</slot-demo>
    <slot-demo v-slot="slotProps">{{ slotProps.user.age}}</slot-demo>

    <!-- 注意默认插槽的缩写语法不能和具名插槽混用,因为它会导致作用域不明确: -->
    <!-- 只要出现多个插槽,请始终为所有的插槽使用完整的基于 <template> 的语法 -->
    <slot-demo>
      <template #default="slotProps">{{ slotProps.user.age}}</template>
      <template #center="slotProps">{{ slotProps.user.age}}</template>
    </slot-demo>
  </div>
</template>

<script>
import SlotDemo from './SlotDemo.vue'

export default {
  components: {
    'slot-demo': SlotDemo
  }
}
</script>

<style lang="less" scoped>
</style>

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值