掌握Vue插槽:创建灵活且可复用的组件

引言

插槽(Slots)是实现组件化的一个强大工具,它允许开发者在组件内部定义可替换的内容区域

插槽的主要作用包括:

  • 内容分发:允许开发者在组件内部定义内容的“插槽”,然后在使用组件时,通过插槽传递自定义内容。
  • 组件复用:通过插槽,开发者可以创建可复用的组件,同时允许用户自定义组件的某些部分,从而提高开发效率和组件的灵活性。
  • 动态内容展示:插槽使得组件能够根据不同的使用场景展示不同的内容,增强了组件的动态性和可配置性。

Vue插槽的定义和类型

Vue插槽主要分为两种类型:具名插槽(Named Slots)和作用域插槽(Scoped Slots)。

1.具名插槽

  • 具名插槽允许开发者为组件内的插槽指定一个名称,父组件可以通过这个名称向子组件传递内容。
  • 在子组件中,使用<slot>标签并指定一个name属性来定义具名插槽。
  • 父组件在使用子组件时,通过<template>标签的slot属性指定要插入的内容应该放在哪个具名插槽中。

2.作用域插槽

  • 作用域插槽允许子组件向父组件传递数据,使得父组件可以根据子组件提供的数据来决定如何渲染插槽内容。
  • 在子组件中,使用<slot>标签并绑定一个对象到slot-scope属性(在Vue 2.5.0+中,slot-scope属性被v-slot指令替代)。
  • 父组件在使用子组件时,通过<template>标签的v-slot指令接收子组件传递的数据,并根据这些数据来渲染插槽内容。
插槽的工作原理和使用场景

插槽的工作原理基于Vue.js的虚拟DOM和组件系统。当Vue.js渲染一个组件时,它会检查组件的模板中是否有插槽定义。如果有,Vue.js会将父组件传递的内容插入到这些插槽中。如果父组件没有提供任何内容,插槽可以显示默认内容。

使用场景包括:

  • 自定义布局:当组件需要在特定位置展示自定义内容时,可以使用具名插槽。
  • 动态内容展示:当组件需要根据传入的数据动态渲染内容时,可以使用作用域插槽。
  • 内容分发:当组件需要将内容分发到多个位置时,可以使用多个具名插槽。

示例

具名插槽示例(就是按照名字来决定内容往哪渲染)

组件一多,普通的插槽就不好用了,假如你养了十条狗,不可能条条都叫旺财吧,我们可以用

name="???" 和 v-slot=???来给这几条狗,哦不,组件起名字

假设我们有一个BaseLayout组件,它有一个头部、一个侧边栏和一个内容区域。我们希望在使用BaseLayout时,能够自定义这三个区域的内容。

<!-- BaseLayout.vue -->
<template>
  <div class="base-layout">
    <header>
      <slot name="header"></slot>
    </header>
    <aside>
      <slot name="sidebar"></slot>
    </aside>
    <main>
      <slot></slot>
    </main>
  </div>
</template>

在父组件中,我们可以这样使用BaseLayout组件,并指定不同插槽的内容:

<!-- ParentComponent.vue -->
<template>
  <BaseLayout>
    <template v-slot:header>
      <h1>我的标题</h1>
    </template>
    <template v-slot:sidebar>
      <ul>
        <li>导航项1</li>
        <li>导航项2</li>
      </ul>
    </template>
    <template v-slot:default>
      <p>这里是内容区域。</p>
    </template>
  </BaseLayout>
</template>

作用域插槽示例(其实就是通过插槽子传父)

作用域插槽允许子组件向父组件传递数据,使得父组件可以根据子组件提供的数据来定制化地渲染插槽内容

假设我们有一个ProductList组件,它展示了一个产品列表。我们希望在父组件中能够根据产品的价格来决定如何显示每个产品。

<!-- ProductList.vue -->
<template>
  <div class="product-list">
    <div v-for="product in products" :key="product.id">
      <slot :name="product.id" :product="product">
        <!-- 默认插槽内容 -->
        <p>{{ product.name }}</p>
      </slot>
    </div>
  </div>
</template>

在父组件中,我们可以这样使用ProductList组件,并根据产品的价格来定制插槽内容:

<!-- ParentComponent.vue -->
<template>
  <ProductList>
    <template v-slot:[productId]="{ product }">
      <div v-if="product.price < 100">
        <p>价格低于100元: {{ product.name }}</p>
      </div>
      <div v-else>
        <p>价格高于或等于100元: {{ product.name }}</p>
      </div>
    </template>
  </ProductList>
</template>

在这个例子中,我们使用了动态插槽名(v-slot:[productId]),它会根据productId的值来匹配对应的插槽。同时,我们通过插槽的v-slot指令接收了product对象,这样就可以在父组件中访问到子组件传递的数据,并根据这些数据来定制插槽内容。

讲人话:子组件形式是  :item = "item"  发送,父组件是  v-slot=“obj”  ,然后子组件的item就传到了父组件叫 obj

动态和条件渲染插槽

在Vue.js中,插槽的动态和条件渲染允许开发者根据特定条件来决定是否渲染某个插槽,或者渲染哪个插槽。这可以通过使用v-ifv-show指令来实现。下面是一个示例,展示如何根据条件动态渲染插槽。

示例:

子组件(ChildComponent.vue)
<template>
  <div class="child-component">
    <!-- 使用v-if指令来控制插槽的渲染 -->
    <slot v-if="showSlot" name="dynamicSlot">
      <p>这是动态插槽的默认内容</p>
    </slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      showSlot: true // 控制插槽是否显示的变量
    };
  }
};
</script>
父组件(ParentComponent.vue)
<template>
  <div class="parent-component">
    <!-- 使用子组件 -->
    <ChildComponent>
      <!-- 使用v-slot指令接收插槽内容 -->
      <template v-slot:dynamicSlot>
        <!-- 根据条件动态渲染插槽内容 -->
        <p v-if="shouldShowSlotContent">这是父组件提供的动态插槽内容</p>
      </template>
    </ChildComponent>
  </div>
</template>

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

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      shouldShowSlotContent: true // 控制是否显示插槽内容的变量
    };
  }
};
</script>

在这个例子中,ChildComponent定义了一个名为dynamicSlot的具名插槽。通过v-if指令,我们控制了这个插槽是否渲染。如果showSlot变量为true,则插槽会被渲染;否则,插槽不会显示。

高级用法和注意事项(扩展内容,按兴趣掌握就好了)

具名插槽的高级用法和注意事项

1.动态插槽名

  • Vue 2.6+ 支持动态插槽名,允许你使用表达式来绑定插槽名。
  • 例如:<template v-slot:[dynamicSlotName]>,其中dynamicSlotName是一个响应式数据。

2.默认插槽的简写

  • 在Vue 2.6+中,可以使用v-slot的简写形式#,例如:<template #default>

3.插槽的命名约定

  • 尽管插槽可以使用任何名称,但建议使用有意义的名称,以提高代码的可读性和可维护性。

4.插槽的默认内容

  • 插槽可以有默认内容,当父组件没有提供任何内容时,将显示默认内容。
  • //子组件
      <slot name="default">
          <!-- 默认内容 -->
          <p>这是默认内容,如果父组件没有提供内容,则会显示这段文字。</p>
      </slot>
    
    
    //父组件
    <template v-slot:default>
        <p>这是父组件提供的内容,将覆盖子组件的默认内容。</p>
    </template>

5.插槽的嵌套

  • 插槽可以嵌套使用,允许在父组件中对子组件的插槽进行进一步的定制。

作用域插槽的高级用法和注意事项

1.作用域插槽的解构

  • 在Vue 2.6+中,可以使用解构赋值来接收作用域插槽的属性,例如:v-slot="{ item }"

2.作用域插槽的嵌套

  • 作用域插槽可以嵌套使用,允许父组件对子组件提供的数据进行进一步的处理。

3.作用域插槽的性能考虑

  • 当使用作用域插槽时,Vue需要在父组件中渲染子组件的插槽内容。如果插槽内容非常复杂或频繁变化,可能会影响性能。

4.作用域插槽的可访问性

  • 由于作用域插槽允许父组件访问子组件的数据,因此需要确保这些数据的可访问性不会泄露敏感信息。

总结

Vue.js的插槽(Slots)是实现组件化的一个强大工具,它允许开发者在组件内部定义可替换的内容区域。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/782170.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【vue组件库搭建06】组件库构建及npm发包

一、格式化目录结构 根据以下图片搭建组件库目录 index.js作为入口文件&#xff0c;将所有组件引入&#xff0c;并注册组件名称 import { EButton } from "./Button"; export * from "./Button"; import { ECard } from "./Card"; export * fr…

网络通信总体框架

目录 网络通信 一、网络通信的定义与基本原理 二、网络通信的组成要素 三、网络通信的应用与发展 网络体系结构 一、网络体系结构的定义与功能 二、OSI七层参考模型 三、网络体系结构的重要性 网络核心与边缘 一、网络核心 1. 定义与功能 2. 组成部分 3. 技术特点 …

昇思25天学习打卡营第19天|LSTM+CRF序列标注

概述 序列标注指给定输入序列&#xff0c;给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取&#xff0c;包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。 条件随机场&#xff08…

01:spring

文章目录 一&#xff1a;常见面试题1&#xff1a;什么是Spring框架&#xff1f;1.1&#xff1a;spring官网中文1.2&#xff1a;spring官网英文 2&#xff1a;谈谈自己对于Spring IOC和AOP的理解2.1&#xff1a;IOCSpring Bean 的生命周期主要包括以下步骤&#xff1a; 2.2&…

国产化新标杆:TiDB 助力广发银行新一代总账系统投产上线

随着全球金融市场的快速发展和数字化转型的深入推进&#xff0c;金融科技已成为推动银行业创新的核心力量。特别是在当前复杂多变的经济环境下&#xff0c;银行业务的高效运作和风险管理能力显得尤为重要。总账系统作为银行会计信息系统的核心&#xff0c;承载着记录、处理和汇…

MySQL-行级锁(行锁、间隙锁、临键锁)

文章目录 1、介绍2、查看意向锁及行锁的加锁情况3、行锁的演示3.1、普通的select语句&#xff0c;执行时&#xff0c;不会加锁3.2、select * from stu where id 1 lock in share mode;3.3、共享锁与共享锁之间兼容。3.4、共享锁与排他锁之间互斥。3.5、排它锁与排他锁之间互斥3…

离线开发(VSCode、Chrome、Element)

一、VSCode 扩展 使用能联网的电脑 A&#xff0c;在VSCode官网下载安装包 使用能联网的电脑 A&#xff0c;从扩展下载vsix扩展文件 将VSCode安装包和vsix扩展文件通过手段&#xff08;u盘&#xff0c;刻盘 等&#xff09;导入到不能联网的离线电脑 B 中 在离线电脑 B 中安装…

计算机网络之无线局域网

1.无线局域网工作方式 工作方式&#xff1a;每台PC机上有一个无线收发机&#xff08;无线网卡&#xff09;&#xff0c; 它能够向网络上的其他PC机发送和接受无线电信号。 与有线以太网相似&#xff0c;无线局域网也是打包方式发送数据的。每块网卡都有一个永久的、唯一的ID号…

springboot配置扫描生效顺序

文章目录 举例分析项目结构如下noddles-user-backend 两个配置文件noddles-user-job 配置文件noddles-user-server 配置文件问题:server和Job启动时对应加载的数据库配置为哪一个&#xff1f; 总结 在微服务架构中&#xff0c;backend模块会定义一个基础的配置文件&#xff0c;…

java集合(2)

目录 一. Map接口下的实现类 1. HashMap 1.1 HashMap常用方法 2. TreeMap 2.1 TreeMap常用方法 3. Hashtable 3.1 Hashtable常用方法 4.Map集合的遍历 4.1 根据键找值 4.2 利用map中的entrySet()方法 二.Collections类 1.Collections类中的常用方法 三. 泛型 1. 为什…

运维锅总详解系统启动流程

本文详细介绍Linux及Windows系统启动流程&#xff0c;并分析了它们启动流程的异同以及造成这种异同的原因。希望本文对您理解系统的基本启动流程有所帮助&#xff01; 一、Linux系统启动流程 Linux 系统的启动流程可以分为几个主要阶段&#xff0c;从电源开启到用户登录。每个…

揭秘IP:从虚拟地址到现实世界的精准定位

1.IP地址介绍 1.内网 IP 地址&#xff08;私有 IP 地址&#xff09; 内网 IP 地址&#xff0c;即私有 IP 地址&#xff0c;是在局域网&#xff08;LAN&#xff09;内部使用的 IP 地址。这些地址不会在公共互联网中路由&#xff0c;因此可以在多个局域网中重复使用。私有 IP 地…

设计模式探索:责任链模式

1. 什么是责任链模式 责任链模式 (Chain of Responsibility Pattern) 是一种行为型设计模式。定义如下&#xff1a; 避免将一个请求的发送者与接收者耦合在一起&#xff0c;让多个对象都有机会处理请求。将接收请求的对象连接成一条链&#xff0c;并且沿着这条链传递请求&…

14-43 剑和诗人17 - ActiveRAG之主动学习

​​​​​ 大型语言模型 (LLM) 的出现开启了对话式 AI 的新时代。这些模型可以生成非常像人类的文本&#xff0c;并且比以往更好地进行对话。然而&#xff0c;它们在仅依赖预训练知识方面仍然面临限制。为了提高推理能力和准确性&#xff0c;LLM 需要能够整合外部知识。 检索…

文件存储的方法一

文章目录 概念介绍实现方法示例代码 我们在上一章回中介绍了"如何实现本地存储"相关的内容&#xff0c;本章回中将介绍如何实现文件存储.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值…

ffmpeg图片视频编辑器工具的安装与使用

title: ffmpeg图片视频编辑器工具的安装与使用 tags: [ffmpeg, 图片, 音频, 视频, 工具, 流媒体] categories: [工具, ffmpeg] FFmpeg是一个开源的命令行工具&#xff0c;广泛用于处理视频和音频文件&#xff0c;包括转换格式、剪辑、混流、解码、编码等。以下是一些基本的FFmp…

Zabbix 的部署和自定义监控内容

前言 一个完整的项目的业务架构包括 客户端 -> 防火墙 -> 负载均衡层&#xff08;四层、七层 LVS/HAProxy/nginx&#xff09; -> Web缓存/应用层&#xff08;nginx、tomcat&#xff09; -> 业务逻辑层(php/java动态应用服务) -> 数据缓存/持久层&#xff08;r…

智慧水利的变革之路:如何通过大数据、物联网和人工智能构建高效、智能、可持续的水利管理新模式

目录 一、引言&#xff1a;智慧水利的时代背景与意义 二、大数据&#xff1a;水利管理的数据基石 &#xff08;一&#xff09;数据收集与整合 &#xff08;二&#xff09;数据分析与挖掘 三、物联网&#xff1a;水利管理的感知神经 &#xff08;一&#xff09;智能感知与监…

Git 操作补充:cherry-pick、变基

1. 挑选提交合并 git cherry-pick 对于多分支的代码库&#xff0c;将代码从一个分支转移到另一个分支是一种常见的需求&#xff0c;这可以分成两种情况&#xff1a;一种情况是&#xff0c;你需要另一个分支的所有代码变动&#xff0c;那么就采用 git merge&#xff1b;另一种情…

【Unity2D 2022:UI】制作角色血条

一、创建血底UI 1. 创建画布&#xff08;Canvas&#xff09; 2. 在画布上添加血底图像&#xff08;Image&#xff09;子物体 二、编辑血底UI 1. 将血底图片拖入源图像&#xff08;Source Image&#xff09;中 2. 点击设置为图片的原大小&#xff08;Set Native Size&#x…