vue中三种插槽(默认插槽、具名插槽、作用域插槽)的使用方法

目录

1.插槽(slot)是什么?

2.默认插槽(匿名插槽) 

使用默认插槽最常见的情况:父组件把内容插入到子组件留下的一个插槽中

如果子组件中有多个默认插槽,父组件中插入一个/多个内容会怎样? 

3.具名插槽 

使用具名插槽的正常情况示例: 

使用具名插槽的时候父组件并未插入任何内容结果会怎样?

​4.作用域插槽


1.插槽(slot)是什么?

插槽:简单来说就是在组件的内部留一个或多个空白的位置,可供其他使用它的组件传对应的模板代码进去。插槽让组件复用变的更加灵活了。
在Vue3中,插槽被称为<slot>元素。你可以在组件的模板中使用<slot>元素来声明一个插槽。

2.默认插槽(匿名插槽) 

使用默认插槽最常见的情况:父组件把内容插入到子组件留下的一个插槽中

父组件示例:

// parent.vue

<template>
  <div class="home">
    <son>
    	<p>我是会被插入子组件插槽位置的默认插槽内容</p>
    </son>
  </div>
</template>

<script>
import son from '@/components/son.vue'
export default {
  components: {
    son,
  }
}
</script>

 子组件示例:

// son.vue

<template>
  <div>
  	<h1>子组件</h1>
    <slot></slot>	//这里就是子组件插槽的位置,会被替换为父组件的 <p>我是会...内容</p>
  </div>
</template>

结果示例:

修改主入口文件:

如果子组件中有多个默认插槽,父组件中插入一个/多个内容会怎样? 

父组件示例:

子组件示例:

结果示例:
子组件中每个默认插槽的位置都会被插入父组件插入的所有内容!!! 

3.具名插槽 

实际上,我们希望达到的效果是插槽对应的内容插入显示,这个时候我们就可以使用具名插槽

  • 具名插槽:顾名思义就是给插槽起一个名字,<slot> 元素有一个特殊的属性name

  • 一个不带 name 的插槽slot,会有一个隐含的名字:default
  •  具名插槽在使用时的缩写实际上,具名插槽在使用时也可以缩写,即v-slot也有缩写,就是把参数之前的所有内容 (即将v-slot:) 替换为字符

    例如:v-slot:header 可以被写为 #header

使用具名插槽的正常情况示例: 

父组件示例:

子组件示例:

 结果示例:

使用具名插槽的时候父组件并未插入任何内容结果会怎样?

父组件示例:

子组件不变,结果示例:
如果父组件并未插入内容,则显示子组件中插槽自身的默认内容,否则父组件插入的插槽内容覆盖子组件中插槽自身的默认内容。


 4.作用域插槽

 父组件示例:

子组件示例:

 结果示例:

这里是使用vue3组合式写的作用域插槽代码,选项式代码后续有空了再补(可能吧......),如想使用选项式可以自行更改代码变为选项式写法。

附:本文参考文档(作用域插槽有选项式写法)


<think>嗯,用户想了解Vue2的作用域插槽。首先,我需要回忆一下Vue2中的插槽机制,尤其是作用域插槽的相关知识。作用域插槽Vue中是一个比较高级的功能,可能对于新手来说有点难理解,所以得用简单明了的例子来说明。 首先,应该从基本概念入手。插槽(slot)本身是Vue组件间内容分发的一种方式,允许父组件向子组件传递模板内容。而作用域插槽的特殊之处在于,子组件可以将数据传递给插槽,让父组件能够访问这些数据,从而更灵活地定制子组件的渲染方式。 接下来,可能需要比较普通插槽作用域插槽的区别。普通插槽中,父组件只能使用子组件提供的数据,而作用域插槽允许子组件传递数据给父组件,父组件可以基于这些数据决定如何渲染内容。这时候,需要举一个例子,比如子组件有一个列表,父组件通过作用域插槽可以自定义每个列表项的显示方式,同时访问子组件中的数据项。 然后,要解释作用域插槽的语法。在Vue2中,作用域插槽通过slot-scope属性来实现,或者在较新的版本中可以使用v-slot指令。需要注意的是,Vue2主要使用slot-scope,而Vue3则用v-slot,但用户问的是Vue2,所以重点放在slot-scope上。 可能需要分步骤讲解如何使用作用域插槽。首先在子组件中定义插槽,并使用v-bind将数据绑定到插槽上。例如,在子组件里写<slot :item="item"></slot>,这里的item是子组件内部的数据。然后在父组件中,用<template slot-scope="props">来接收这个数据,props就是包含子组件传递数据的对象,可以通过props.item访问。 需要举一个具体的例子,比如一个列表组件,子组件负责遍历数据,父组件决定每个列表项如何展示。这样用户可以看到作用域插槽的实际应用场景,比如不同的样式或结构。 另外,可能还需要提到具名作用域插槽,即当有多个插槽时,如何为每个插槽分配不同的作用域数据。这时候需要结合name属性和slot-scope,确保数据正确传递到对应的插槽位置。 还要注意可能的常见问题,比如作用域数据的解构赋值,如何在接收时直接解构item,使得代码更简洁。例如,slot-scope="{item}",这样可以直接使用item而不需要props.item。 最后,总结作用域插槽的优势,比如提高组件的复用性,允许父组件控制子组件内部内容的渲染,同时保持数据流的清晰。同时,提醒用户在使用时注意Vue2的语法,避免与Vue3的v-slot混淆。</think>在 Vue2 中,作用域插槽(Scoped Slots)是一种**允许子组件向父组件传递数据**的特殊插槽机制。以下是分步详解: --- ### 一、核心概念 作用域插槽解决了以下问题: - 子组件需要**内部数据**控制插槽内容 - 父组件需要**定制渲染逻辑**但需访问子组件数据 - 实现**数据与 UI 解耦** --- ### 二、基本语法 #### 子组件定义 通过 `v-bind` 暴露数据 ```html <!-- ChildComponent.vue --> <template> <div> <slot :item="childData" :index="currentIndex"></slot> </div> </template> <script> export default { data() { return { childData: { name: 'Vue2' }, currentIndex: 1 } } } </script> ``` #### 父组件使用 通过 `slot-scope` 接收数据(Vue2 语法) ```html <!-- ParentComponent.vue --> <template> <child-component> <template slot-scope="props"> <span>{{ props.item.name }}</span> <span>Index: {{ props.index }}</span> </template> </child-component> </template> ``` --- ### 三、典型使用场景 #### 1. 列表渲染定制 子组件: ```html <template> <ul> <li v-for="(item, index) in items" :key="index"> <slot :item="item" :idx="index"></slot> </li> </ul> </template> ``` 父组件: ```html <data-list> <template slot-scope="{ item, idx }"> <span class="red-text">{{ idx+1 }}. {{ item }}</span> </template> </data-list> ``` #### 2. 表格列自定义 子组件: ```html <template> <table> <tr v-for="row in rows"> <slot name="column" :rowData="row"></slot> </tr> </table> </template> ``` 父组件: ```html <data-table> <template slot="column" slot-scope="{ rowData }"> <td>{{ rowData.name }}</td> <td>{{ rowData.age | formatAge }}</td> </template> </data-table> ``` --- ### 四、进阶用法 #### 解构赋值 ```html <template slot-scope="{ item, index: idx }"> {{ idx }} - {{ item }} </template> ``` #### 具名插槽结合 子组件: ```html <template> <div> <slot name="header" :title="title"></slot> <slot :content="mainContent"></slot> </div> </template> ``` 父组件: ```html <child-component> <template slot="header" slot-scope="{ title }"> <h1>{{ title }}</h1> </template> <template slot-scope="{ content }"> <p>{{ content }}</p> </template> </child-component> ``` --- ### 五、注意事项 1. `slot-scope` 是 Vue2 的语法,Vue3 使用 `v-slot` 2. 作用域插槽数据是**单向传递**(子 → 父) 3. 可在插槽使用所有父组件作用域的数据和方法 4. 性能优化:避免在插槽内进行复杂计算 --- ### 六、原理示意图 ``` 子组件 ┌──────────────┐ │ 内部数据 │ │ ↓ │ │ <slot :data="value"> └──────┬───────┘ │ 父组件 │ ┌──────▼───────┐ │ 接收slot-scope│ │ 使用子组件数据│ └──────────────┘ ``` 通过作用域插槽Vue2 实现了强大的组件抽象能力,使得组件设计更加灵活且易于维护。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值