8. Vue插槽的使用

本文详细介绍了Vue.js中的插槽概念,包括插槽的基本使用,如何通过v-slot指令将内容填充到默认插槽和具名插槽,以及如何利用作用域插槽在组件间传递数据。示例代码展示了如何声明和使用这些插槽,帮助读者深入理解Vue组件的可复用性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、什么是插槽

二、插槽的基本使用

三、具名插槽

四、作用域插槽


一、什么是插槽

Vue插槽(slot):是Vue为组件的封装者提供的能力。允许开发者在封装组件的时候,把不确定的、希望由用户指定的部分定义为插槽


二、插槽的基本使用

vue官方规定:

1. 每一个插槽都有一个默认的name名称,如果省略了slot的name属性,则默认名称叫做default

2. 如果用户没有指定内容,则可以显示插槽里面的默认内容,vue官方叫做后备内容

看下方代码:

<template>

  <div class="left-container">

    <h3>Left 组件</h3>

    <!-- 声明一个插槽 -->

    <!-- vue官方规定,每一个插槽都有一个默认的name 名称

    如果省略了slot的name属性,则默认名称叫做default

    同时如果用户没有指定内容,则可以显示插槽里的默认内容,vue官方叫做后备内容 -->

    <slot name="default">这里面是插槽的默认内容</slot>

  </div>

</template>

默认情况下在使用组件的时候,提供的内容都会被填充到名字为default插槽之中

1.如果要把内容填充到指定名称的插槽中,需要使用v-slot: 这个指令

2. v-slot: 后面要跟上插槽的名字

3. v-slot: 指令不能直接用在元素身上必须使用在template 标签上

4. template标签,是一个虚拟的标签,只起到了包裹的作用,不会被渲染为任何实质性的html元素

5. v-slot: 简写是 # -->

看下方代码:

<template>

  <div class="app-container">

    <h1>App 根组件</h1>

    <hr />

    <div class="box">

      <!-- 渲染 Left 组件和 Right 组件 -->

      <left>

        <!-- 默认情况下在使用组件的时候,提供的内容都会被填充到名字为default的插槽之中 -->

        <!-- 1.如果要把内容填充到指定名称的插槽中,需要使用v-slot: 这个指令

        2. v-slot: 后面要跟上插槽的名字

        3. v-slot: 指令不能直接用在元素身上,必须使用在template 标签上

        4. template标签,是一个虚拟的标签,只起到了包裹的作用,不会被渲染为任何实质性的html元素

        5. v-slot: 简写是 # -->

        <template v-slot:default>

          <p>这是在Left组件的内容区域,声明的p标签</p>

        </template>

      </left>

    </div>

  </div>

</template>


三、具名插槽

简单来说就是带名字的插槽就叫做具名插槽

<template>

    <div class="artical-container">

        <!-- 文章标题 -->

        <div class="header-box">

// 放置一个插槽,名字叫做 title

            <slot name="title"></slot>

        </div>

        <!-- 文章内容 -->

        <div class="content-box">

// 放置一个插槽,名字叫做 content

            <slot name="content"></slot>

        </div>

        <!-- 文章作者 -->

        <div class="footer-box">

// 放置一个插槽,名字叫做 autor

            <slot name="autor"></slot>

        </div>

    </div>

</template>

<Artical>

      <template #title>

        <h2>静夜思</h2>

      </template>

      <template #content>

        <p>床前明月光</p>

        <p>疑是地上霜</p>

        <p>举头望明月</p>

        <p>低头思故乡</p>

      </template>

      <template #autor>

        <div>

          作者:李白

        </div>

      </template>

    </Artical>


四、作用域插槽

作用域插槽的定义:在封装组件的时候,为预留slot 插槽提供属性对应的值,这种用法叫做:作用域插槽

看下方代码:

export default {

    data() {

        return {

            info: {

                username: 'liupeng',

                age: 19

            }

        }

    }

}

<slot name="content" msg="hello vue.js" :user="info"></slot>

使用形参来接收 作用域插槽传递的值,默认是一个空对象

scope 接收过来的是一个对象,可以通过解构赋值,来拿到自己想要的数据-->

 <template #content="{ msg, user}">

        <p>床前明月光</p>

        <p>疑是地上霜</p>

        <p>举头望明月</p>

        <p>低头思故乡</p>

        <p>{{ user.username }}</p>

        <p>{{ msg }}</p>

</template>

<think>好的,我现在要帮用户了解Vue.js中的插槽概念,包括具名插槽和作用域插槽的用法。首先,我需要回忆一下Vue插槽相关知识,并结合用户提供的引用内容来组织回答。 用户提供的引用里提到了Vue2和Vue3的插槽使用,特别是默认插槽、具名插槽和作用域插槽。我需要确保回答覆盖这些类型,并且给出清晰的示例。 首先,插槽的基本概念是什么?根据引用3,插槽允许在组件内部预留位置,让父组件传递模板代码进去,增加组件的灵活性。Vue3中使用<slot>元素声明插槽。默认插槽没有name属性,作为备用内容的位置。 接下来是具名插槽,引用3和4提到具名插槽使用name属性来区分不同的插槽位置。父组件需要使用v-slot指令或者简写的#来指定插槽名称。比如在子组件中有多个具名插槽,父组件可以分别插入内容到对应的位置。 然后是作用域插槽,引用5提到作用域插槽可以让子组件向父组件传递数据。这在需要根据子组件的数据动态渲染不同内容时非常有用。子组件通过v-bind绑定数据,父组件通过v-slot接收这些数据,并在模板中使用。 用户可能需要具体的示例来理解这些概念。我需要分别编写默认插槽、具名插槽和作用域插槽的代码示例,确保语法正确,并且符合Vue2或Vue3的规范。根据引用2和3,Vue3中使用<template #slotName>的语法,而Vue2可能使用slot-scope,但用户的问题可能更关注Vue3,所以示例应基于Vue3的语法。 同时,要注意用户提供的引用中有Vue3的具体用法,比如作用域插槽Vue3中使用v-slot:name="props"的方式。需要确保示例中的语法正确,比如使用#简写,以及作用域变量的传递。 可能还需要对比默认插槽和具名插槽的区别,说明作用域插槽的应用场景,比如列表渲染的不同样式需求,如引用5中的案例,子组件提供数据,父组件决定如何展示。 最后,生成相关问题时要覆盖插槽的类型、用法、应用场景以及常见问题,比如如何传递多个数据、动态插槽名等。确保问题能够帮助用户进一步深入学习。 检查是否有遗漏点,比如匿名插槽作为默认备用,具名插槽的多个插槽使用,作用域插槽的数据传递机制。确保回答结构清晰,分点说明,示例代码正确,并且引用标记正确。</think>### Vue.js 插槽的概念及使用方法 #### 一、插槽的基本概念 插槽Slot)是 Vue.js 中用于组件化开发的核心特性,允许父组件向子组件传递模板内容,增强组件的灵活性和复用性。通过插槽,子组件可以预留一个或多个“占位区域”,父组件根据需求填充不同的内容[^3]。 #### 二、默认插槽(匿名插槽) **定义**:未使用 `name` 属性的插槽称为默认插槽,用于接收父组件未指定名称的内容。 **示例**: 子组件 `ChildComponent.vue`: ```html <template> <div> <slot>默认内容(当父组件未提供内容时显示)</slot> </div> </template> ``` 父组件使用: ```html <ChildComponent> <p>父组件传递的内容</p> </ChildComponent> ``` 若父组件未填充内容,子组件将显示默认内容[^4]。 --- #### 三、具名插槽 **定义**:通过 `name` 属性命名的插槽,用于区分多个插槽位置。 **示例**: 子组件 `LayoutComponent.vue`: ```html <template> <div> <slot name="header"></slot> <slot></slot> <!-- 默认插槽 --> <slot name="footer"></slot> </div> </template> ``` 父组件使用Vue3 语法): ```html <LayoutComponent> <template #header> <h1>标题内容</h1> </template> <p>默认插槽内容</p> <template #footer> <p>页脚内容</p> </template> </LayoutComponent> ``` 父组件通过 `#插槽名` 指定内容插入位置。 --- #### 四、作用域插槽 **定义**:允许子组件向父组件传递数据,父组件基于数据动态渲染内容。 **应用场景**:如列表组件需要支持多种渲染方式(水平排列、列表、网格等)[^5]。 **示例**: 子组件 `ListComponent.vue`: ```html <template> <ul> <li v-for="item in items" :key="item.id"> <slot :item="item"></slot> </li> </ul> </template> <script> export default { props: ['items'] } </script> ``` 父组件使用: ```html <ListComponent :items="pLanguages"> <template #default="{ item }"> <span>{{ item }}</span> <!-- 自定义渲染逻辑 --> </template> </ListComponent> ``` 子组件通过 `v-bind` 绑定数据 `item`,父组件通过 `#default="{ item }"` 接收并使用数据[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr_LiuP

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

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

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

打赏作者

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

抵扣说明:

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

余额充值