vue中slot插槽的使用(默认插槽,具名插槽,作用域插槽)

在 Vue.js 中,<slot> 元素用于分发内容(也称为插槽或内容分发),它允许你在封装组件时留出一个位置,使得使用该组件的地方可以插入自定义的内容。这非常适用于像对话框、卡片等需要灵活内容的组件。

#默认插槽和具名插槽

假设封装一个aa-dialog的对话框组件。

下面是一个简单的例子,展示如何在封装的 aa-dialog 组件中使用 <slot>:

aa-dialog.vue (封装的对话框组件)

javascript 复制代码
<template>
  <div class="dialog-container">
    <div class="dialog-content">
      <!-- 默认插槽 -->
      <slot></slot>
    </div>
    <div class="dialog-footer">
      <!-- 可选:命名插槽,例如放置按钮 -->
      <!-- 如果使用 <aa-dialog> 组件的地方没有提供 v-slot:footer 或者 <template #footer> 内容的话,那么该位置将显示这个默认的"关闭"按钮。反之该区域会被覆盖。 -->
      <slot name="footer">
        <button @click="close">关闭</button>
      </slot>
    </div>
  </div>
</template>

<script>
export default {
  name: 'AaDialog',
  methods: {
    close() {
      // 关闭对话框逻辑
    }
  }
}
</script>

<style scoped>
/* 对话框样式 */
</style>

使用 aa-dialog 的地方

javascript 复制代码
<template>
  <div>
    <aa-dialog>
      <!-- 这里的内容会填充到 aa-dialog 的默认插槽 -->
      <p>这里是对话框内的内容。</p>
      <p>你可以在这里添加任意多的内容。</p>
      
      <!-- 命名插槽用法 -->
      <template v-slot:footer>
        <button @click="confirmAction">确认</button>
        <button @click="cancelAction">取消</button>
      </template>
    </aa-dialog>
  </div>
</template>

<script>
import AaDialog from './components/aa-dialog.vue';

export default {
  components: {
    AaDialog
  },
  methods: {
    confirmAction() {
      // 确认操作逻辑
    },
    cancelAction() {
      // 取消操作逻辑
    }
  }
}
</script>

在这个例子中:

  • 默认插槽 (<slot></slot>) 让你可以在 <aa-dialog> 标签之间插入任何内容,这些内容将被渲染到对话框主体部分。
  • 命名插槽 (<slot name="footer">) 允许你指定特定位置的内容,如对话框底部的操作按钮。

通过这种方式,可以创建高度可复用和灵活的组件,满足不同的需求。如果想要更多的控制,比如根据条件显示不同的内容,还可以结合作用域插槽(Scoped Slots)来实现。

#作用域插槽

作用域插槽(Scoped Slots)允许父组件在使用子组件时,不仅能够自定义子组件内部的结构和内容,还能访问子组件的数据。这对于创建高度可复用且灵活的组件非常有用。

下面是一个简单的例子,展示如何使用作用域插槽来传递数据给父组件:

子组件:aa-dialog.vue

javascript 复制代码
<template>
  <div class="dialog-container">
    <div class="dialog-content">
      <!-- 作用域插槽 -->
      <slot name="content" :message="message"></slot>
    </div>
    <div class="dialog-footer">
      <slot name="footer">
        <button @click="close">关闭</button>
      </slot>
    </div>
  </div>
</template>

<script>
export default {
  name: 'AaDialog',
  data() {
    return {
      message: '这是来自子组件的消息'
    }
  },
  methods: {
    close() {
      // 关闭对话框逻辑
    }
  }
}
</script>

<style scoped>
/* 对话框样式 */
</style>

父组件

javascript 复制代码
<template>
  <div>
    <aa-dialog>
      <!-- 使用作用域插槽,并接收来自子组件的数据 -->
      <template v-slot:content="{ message }">
        <p>{{ message }}</p>
        <p>这里是额外的内容。</p>
      </template>

      <!-- 命名插槽用法,没有使用作用域 -->
      <template v-slot:footer>
        <button @click="confirmAction">确认</button>
        <button @click="cancelAction">取消</button>
      </template>
    </aa-dialog>
  </div>
</template>

<script>
import AaDialog from './components/aa-dialog.vue';

export default {
  components: {
    AaDialog
  },
  methods: {
    confirmAction() {
      // 确认操作逻辑
    },
    cancelAction() {
      // 取消操作逻辑
    }
  }
}
</script>

在这个例子中:

  • 在 aa-dialog.vue 中,我们为 content 插槽指定了一个属性 message,它来自于子组件的数据。
  • 在父组件中,当我们使用 v-slot:content 或 <template #content> 时,我们通过解构的方式获取了子组件传递过来的 message 属性,并将其显示出来。
  • 如果不使用作用域插槽,父组件将无法直接访问子组件的局部状态或数据。

这种方式让父组件可以根据子组件提供的数据动态地改变内容,同时保持了组件之间的松耦合。作用域插槽是 Vue.js 提供的一种强大的工具,用于增强组件的灵活性和复用性。

相关推荐
FungLeo8 小时前
成为全栈·React 管理后台篇·总复盘:从“接口能调通”到“后台值得使用”
前端·react.js·前端框架·项目复盘·成为全栈
Csvn9 小时前
并发模式:让渲染学会排队、插队和让路
前端
可乐鸡翅yeah_9 小时前
新手梳理:M3U8 线上问题,哪些是前端锅,哪些是后端锅
前端·ios·音视频·实时音视频·m3u8·音视频在线播放
Flynt9 小时前
Linear 用 1000 个 PR 换掉 styled-components,我写了 200 个按钮,把这笔账复现了一遍
前端·css·preact
JavaGuide10 小时前
NVIDIA 又开源了!这次给 AI Agent 加上权限管控
前端·后端
excel10 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
莪_幻尘12 小时前
Skill 体检:30 个 Skill 全凭感觉?体检器先自曝了 8 个“假 0 分
前端·人工智能·llm
风骏时光牛马12 小时前
AI模型综合能力评测:性能、指令遵循与多场景实测对比
前端
Frag0ut12 小时前
Chrome与Chromium内核浏览器在Windows 11上的新特性全景解析
前端·chrome·windows·web安全·chromium·gemini ai·playready drm
hiahiahia12312 小时前
实现完整 Tool Dispatcher
开发语言·前端