第十八节——插槽

概念

在Vue中,插槽(Slots)是一种用于组件模板中的特殊语法,用于实现组件的内容分发和复用。插槽允许父组件在子组件的模板中插入任意的内容,从而实现更灵活的组件组合和定制

默认插槽(Default Slot)

默认插槽是最常用的插槽类型。在子组件的模板中,使用<slot></slot>标签定义默认插槽的位置。父组件在使用子组件时,可以在子组件的标签内放置内容,这些内容将被插入到子组件模板中的默认插槽位置

父组件

复制代码
<template>
  <div>
    <LearnSlot2>
      任意内容
    </LearnSlot2>
  </div>
</template>

<script>
import LearnSlot2 from "./learn-slot2.vue";

export default {
  components: {
    LearnSlot2,
  },
};
</script>

子组件

复制代码
<template>
  <div>
    <slot></slot>
  </div>
</template>

具名插槽(Named Slots)

除了默认插槽,Vue还支持具名插槽。具名插槽允许在子组件中定义多个命名插槽,父组件可以根据插槽的名称来插入内容。在子组件的模板中,使用<slot name="slotName"></slot>标签定义具名插槽的位置,并为每个插槽指定一个唯一的名称。在父组件使用子组件时,使用具名插槽的语法来插入相应名称的内容。

父组件

复制代码
<template>
  <div>
    <LearnSlot2>
      <!-- <h1>一级标题</h1> -->
      <!-- 
        # 后面是插槽的名字
       -->
      <template #footer>
        <div>底部</div>
      </template>
      <template #header>
        <div>头部</div>
      </template>
      <template #content>
        <div>内容</div>
      </template>
    </LearnSlot2>
  </div>
</template>

<script>
import LearnSlot2 from "./learn-slot2.vue";

export default {
  components: {
    LearnSlot2,
  },
};
</script>

子组件

复制代码
<template>
  <div>
    一个组件
    <!-- 
      使用slot这个组件展示
      组件标签中间的内容
     -->
    <!-- 
      使用name跟上插槽的名字
      -->
    <slot name="header"></slot>
    <slot name="content"></slot>
    <slot name="footer"></slot>
  </div>
</template>

作用域插槽(Scoped Slots)

作用域插槽是一种特殊的插槽类型,它允许slot组件向子组件传递数据,并且子组件可以在插槽中使用该数据进行渲染。

父组件

复制代码
<!-- ParentComponent.vue -->
<template>
  <div>
    <h1>Parent Component</h1>
    <ListComponent>
      <!-- 使用作用域插槽来渲染列表项 -->
      <template v-slot="{ item }">
        <li>{{ item.name }}</li>
      </template>
    </ListComponent>
  </div>
</template>

<script>
import ListComponent from './ListComponent.vue';

export default {
  components: {
    ListComponent
  }
}
</script>

子组件

复制代码
<!-- ListComponent.vue -->
<template>
  <div>
    <h2>List Component</h2>
    <ul>
      <slot v-for="item in items" :item="item" :key="item.id"></slot>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' },
        { id: 3, name: 'Item 3' }
      ]
    };
  }
}
</script>
相关推荐
IT_陈寒2 小时前
SpringBoot这个自动配置坑我跳了三次
前端·人工智能·后端
kyriewen3 小时前
我用 AI 一周写完了整个项目,上线第一天就崩了——这是我踩过最贵的 5 个坑
前端·javascript·ai编程
Larcher3 小时前
AI Loop:让AI像人一样自主完成任务的核心机制
javascript·人工智能·设计模式
默_笙3 小时前
🃏 JS 只有 8 种数据类型,但我花了 2 天才搞懂 null 和 undefined 的区别
javascript
牧艺3 小时前
从零到协同:构建类飞书在线文档系统的五个技术重难点
前端·人工智能
jump_jump4 小时前
流式 HTML:从 htmx 片段装配到浏览器原生增量渲染
javascript·性能优化·前端工程化
红尘散仙4 小时前
想写一个像样的终端 App?试试把 React 的开发体验搬进 Rust TUI
前端·rust
袋鼠云数栈UED团队4 小时前
一套 Spec-First 的 AI 编程工作流
前端·人工智能
袋鼠云数栈前端5 小时前
一套 Spec-First 的 AI 编程工作流
前端·ai+
angerdream5 小时前
Android手把手编写儿童手机远程监控App之vue3 路由守卫
前端