Vue插槽详解

简介

Vue实现了一套内容分发的API这套API的设计灵感来源自WebComponents规范草案,将<slot>元素作为承载分发内容的出口,什么是内容分发呢?就是说这个模块的内容我们可以后续在填充进来

使用插槽我们咳哟实现组件内容由调用时传入,可以实现更灵活的组件

插槽类型

匿名插槽

子组件用slot标签来确定渲染的位置,标签里面放上DOM结构,当父组件使用的时候没有向slot内部传入内容,标签内的DOM结构就会显示出来

// 子组件Child.vue
<template>
    <slot>
        后备内容
    </slot>
</template>
// 父组件Parent.vue
<Child>
  <div>默认插槽</div>  
</Child>
    

具名插槽

子组件有name属性来表示插槽的名字,如果不传则是匿名插槽,父组件使用时在默认插槽的基础上添加slot属性

// 子组件
<template>
    <slot>插槽后备的内容</slot>
  <slot name="content">插槽后备的内容</slot>
</template>
// 父组件
<child>
    <template v-slot:default>具名插槽</template>
    <!-- 具名插槽⽤插槽名做参数 -->
    <template v-slot:content>内容...</template>
</child>

作用域插槽

作用域插槽时Vue.js中的一个高级特性,它允许组件的插槽内容访问子组件的数据,通过作用域插槽,可以创建更为灵活和可复用的组件,在vue2.x中作用域插槽的工作方式是这样的

1.在子组件模板中,你可以将数据作为属性传递给插槽,这些属性将被包裹在一个对象中,这个对象可以通过v-slot指令(在Vue2.6.0+中引入,之前的版本使用slot-scope)再父组件的插槽内容中访问。

2. 父组件:在父组件中你可以使用v-slot指令定义一个模板来接受子组件传递的数据,v-slot可以指定一个名称,该名称对应子组件插槽的名称

<!-- 子组件 ChildComponent.vue -->
<template>
  <div>
    <slot :user="user">
      <!-- 插槽的默认内容 -->
      Default content
    </slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      user: {
        name: 'Alice',
        age: 25
      }
    }
  }
}
</script>

在子组件中我们定义了一个名为user的插槽,并将user对象作为属性传递给了插槽

<!-- 父组件 ParentComponent.vue -->
<template>
  <ChildComponent>
    <template v-slot:default="slotProps">
      <!-- 使用子组件传递的数据 -->
      User name: {{ slotProps.user.name }}, Age: {{ slotProps.user.age }}
    </template>
  </ChildComponent>
</template>

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

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

在父组件中我们使用v-slot指令定义了一个模板来接收子组件传递的user数据。slotProps是自定义的名称,它包含了子组件传递给插槽的所有属性。在Vue3.x中,作用域插槽的工作方式略有不同,但基本概念是相同的,vue3中推荐使用v-slot,并且可以在没有默认插槽的情况下直接使用#符号作用域插槽是一个强大的特性,它允许父组件以声明式的方式访问子组件的数据,从而创建更加动态和可以配置的组件。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值