【Vue3】slot 插槽全家桶

插槽(Slots)是 Vue.js 框架中的一个功能,允许在组件内部预留一些可替换的内容。通过插槽,可以给父组件填充模板代码,让父组件向子组件传递自定义的内容,以便在子组件中进行展示或处理。

1. 匿名插槽

匿名(默认)插槽是指在子组件中没有具名插槽时使用的插槽。如果子组件没有定义具名插槽,那么父组件中的内容将自动插入子组件的默认插槽中。

Son.vue

<template>
  <div>
    <header class="header"></header>
    <main class="main">
      <!-- 这里用于占位(父组件传内容,子组件接收) -->
      <slot></slot>
    </main>
    <footer class="footer"></footer>
  </div>
</template>

<script setup lang="ts">

</script>

<style scoped>
.header {
  height: 200px;
  background-color: red;
  color: white;
}

.main {
  height: 300px;
  background-color: blue;
  color: white;
}

.footer {
  height: 200px;
  background-color: green;
  color: white;
}
</style>

App.vue

<template>
  <div class="content">
    <Son>
      <template v-slot>
          <div>插入中间</div>
      </template>
    </Son>
  </div>
</template>

<script setup lang="ts">
import Son from './components/Son.vue'
</script>

<style scoped>

</style>

在这里插入图片描述

2. 具名插槽

具名插槽允许定义多个插槽,并且为每个插槽起一个名字。这样,父组件在使用子组件时可以选择性地往不同的插槽中传递内容。

Son.vue

<template>
  <div>
    <header class="header">
      <slot name="header"></slot>
    </header>
    <main class="main">
      <slot></slot>
    </main>
    <footer class="footer">
      <slot name="footer"></slot>
    </footer>
  </div>
</template>

<script setup lang="ts">

</script>

<style scoped>
.header {
  height: 200px;
  background-color: red;
  color: white;
}

.main {
  height: 300px;
  background-color: blue;
  color: white;
}

.footer {
  height: 200px;
  background-color: green;
  color: white;
}
</style>

App.vue

<template>
  <div class="content">
    <Son>
      <template v-slot:header>
          <div>插入上面</div>
      </template>
      <template v-slot>
          <div>插入中间</div>
      </template>
      <template v-slot:footer>
          <div>插入下面</div>
      </template>
    </Son>
  </div>
</template>

<script setup lang="ts">
import Son from './components/Son.vue'
</script>

<style scoped>

</style>

在这里插入图片描述

3. 插槽作用域

作用域插槽是Vue中另一种强大的插槽类型,它允许子组件向父组件传递数据,并且在父组件中使用该数据进行渲染。这种机制可以让父组件更加灵活地控制子组件的渲染逻辑。

可以理解为数据在子那边,但根据数据生成的结构,却由父亲决定。压岁钱在孩子那,但根据压岁钱买的东西,却由父亲决定。

Son.vue

<template>
  <div>
    <header class="header">
      <slot name="header"></slot>
    </header>
    <main class="main">
      <div v-for="(item,index) in data">
        <slot :index="index" :data="item"></slot>
      </div>
    </main>
    <footer class="footer">
      <slot name="footer"></slot>
    </footer>
  </div>
  
</template>

<script setup lang="ts">
import { reactive } from 'vue';
type names = {
  name: string,
  age: number
}
const data = reactive<names[]>([
  {
    name: '张三', 
    age: 18
  },
  {
    name: '李四',
    age: 19
  },
  {
    name: '王五',
    age: 20
  }
])

</script>

<style scoped>
.header {
  height: 200px;
  background-color: red;
  color: white;
}

.main {
  height: 300px;
  background-color: blue;
  color: white;
}

.footer {
  height: 200px;
  background-color: green;
  color: white;
}
</style>

App.vue

<template>
  <div class="content">
    <Son>
      <template v-slot:header>
      <!-- 简写为:#header -->
        <div>插入上面</div>
      </template>
      <!-- 直接解构出 data index -->
      <template v-slot="{ data, index }">
      <!-- 匿名插槽简写为:#default="{ data, index }" -->
        <div>{{ data.name }}--{{ data.age }}--{{ index }}</div>
      </template>
      <template v-slot:footer>
        <div>插入下面</div>
      </template>
    </Son>
  </div>
</template>

<script setup lang="ts">
import Son from './components/Son.vue'
</script>

<style scoped></style>

在这里插入图片描述

4. 动态插槽

App.vue

<template>
  <div class="content">
    <Son>
      <template v-slot:[name]>
      <!-- 或者简写为:#[name] -->
        <div>
          我在哪儿?
        </div>
      </template>
    </Son>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'
import Son from './components/Son.vue'
let name = ref('footer')
// let name = ref('deault') // 插入中间的匿名插槽
</script>

<style scoped></style>

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小秀_heo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值