当前位置: 首页 > news >正文

【前端框架与库】「深入理解 Vue 插槽」:类型、用法与实际场景解析,增强组件复用性的利器

深入理解 Vue 插槽

    • @[TOC](深入理解 Vue 插槽)
  • 前言
  • 一、插槽的几种类型
    • 1. 默认插槽(Default Slot)
    • 2. 具名插槽(Named Slot)
    • 3. 作用域插槽(Scoped Slot)
  • 二、插槽的作用与实际使用场景
  • 三、延伸知识
  • 总结

前言

在 Vue 中,插槽(Slots)提供了一种非常灵活的方式,可以让父组件向子组件传递 HTML 内容、模板、甚至是组件。插槽本质上就是子组件中的占位符,父组件可以在使用子组件时提供不同的内容。插槽让子组件的内容可定制,从而实现组件的高复用性。


一、插槽的几种类型

Vue 中的插槽主要有以下几种类型:

  1. 默认插槽(Default Slot)
  2. 具名插槽(Named Slot)
  3. 作用域插槽(Scoped Slot)

接下来,我会通过详细的代码示例来逐一讲解它们的使用方法和场景。


1. 默认插槽(Default Slot)

默认插槽是最常见的一种插槽类型,父组件可以通过子组件的默认插槽传递内容。若父组件没有传递内容,则使用子组件中插槽的默认内容(如果有)。

代码示例:

<!-- ParentComponent.vue -->
<template><ChildComponent><p>这是父组件传递的内容!</p></ChildComponent>
</template><script>
import ChildComponent from './ChildComponent.vue'export default {components: {ChildComponent}
}
</script><!-- ChildComponent.vue -->
<template><div><slot></slot> <!-- 默认插槽 --></div>
</template>

解释:

  • ChildComponent.vue 中,我们通过 <slot></slot> 标签定义了一个默认插槽。
  • ParentComponent.vue 中,<ChildComponent> 标签内的内容(即 <p>这是父组件传递的内容!</p>)会被插入到默认插槽的位置。
    使用场景:
    适用于父组件需要动态插入不同内容的情况,且插入的内容没有特定的标识。

2. 具名插槽(Named Slot)

具名插槽可以让父组件在多个位置插入不同的内容,通过插槽的名称来区分。

代码示例:

<!-- ParentComponent.vue -->
<template><ChildComponent><template v-slot:header><h1>这是页面的标题</h1></template><template v-slot:footer><footer>这是页脚</footer></template></ChildComponent>
</template><script>
import ChildComponent from './ChildComponent.vue'export default {components: {ChildComponent}
}
</script><!-- ChildComponent.vue -->
<template><div><header><slot name="header"></slot> <!-- 具名插槽 header --></header><main><p>主内容区</p></main><footer><slot name="footer"></slot> <!-- 具名插槽 footer --></footer></div>
</template>

解释:

  • ChildComponent.vue 中,我们使用了两个具名插槽,分别是 <slot name="header"></slot><slot name="footer"></slot>
  • ParentComponent.vue 中,<template v-slot:header><template v-slot:footer> 分别提供了 headerfooter 插槽的内容。
    使用场景:
    适用于父组件需要在多个位置插入不同内容的场景,能够通过插槽的名称来区分。

3. 作用域插槽(Scoped Slot)

作用域插槽允许父组件不仅传递内容,还能向子组件传递数据。子组件通过插槽向父组件暴露数据,父组件可以使用这些数据来动态渲染内容。

代码示例:

<!-- ParentComponent.vue -->
<template><ChildComponent><template v-slot:default="slotProps"><p>用户名:{{ slotProps.username }}</p><p>年龄:{{ slotProps.age }}</p></template></ChildComponent>
</template><script>
import ChildComponent from './ChildComponent.vue'export default {components: {ChildComponent}
}
</script><!-- ChildComponent.vue -->
<template><div><slot :username="user.name" :age="user.age"></slot> <!-- 作用域插槽 --></div>
</template><script>
export default {data() {return {user: {name: '张三',age: 30}}}
}
</script>

解释:

  • ChildComponent.vue 中,子组件通过 slot :username="user.name" :age="user.age" 向父组件暴露了 user.nameuser.age 的数据。
  • ParentComponent.vue 中,父组件通过 v-slot:default="slotProps" 获取了 slotProps,并通过 slotProps.usernameslotProps.age 渲染了传递的数据。
    使用场景:
    作用域插槽非常适合需要从子组件获取动态数据并根据这些数据渲染内容的场景。例如,在列表渲染、表格组件、动态内容展示等场景中,父组件可以根据子组件传递的数据来调整显示的内容。

二、插槽的作用与实际使用场景

作用:

  • 提升组件的复用性和灵活性:插槽让父组件能够根据需求动态控制子组件的内容,从而使得子组件更加灵活和可复用。
  • 组件解耦:插槽使得子组件和父组件之间的耦合度较低,父组件不需要知道子组件的具体内容,子组件也无需关心父组件的具体实现。
    实际使用场景
  1. 布局组件:比如常见的布局框架、卡片组件等,通常会包含头部、主体、底部等区域,使用具名插槽可以让父组件灵活传入不同的内容。

示例:一个 Card 组件,父组件传入标题和内容:

<Card><template v-slot:header><h2>卡片标题</h2></template><template v-slot:default><p>这里是卡片的内容</p></template>
</Card>
  1. 表单组件:在表单中,使用作用域插槽可以让父组件获取表单字段的状态或数据,并根据这些数据做动态处理。

示例:一个 FormField 组件,父组件根据字段的验证状态来展示不同的内容:

<FormField><template v-slot:default="field"><input v-model="field.value" /><span v-if="field.error">错误:{{ field.error }}</span></template>
</FormField>
  1. 动态列表:通过作用域插槽,可以在列表中传递数据,并根据数据动态生成内容,适用于动态渲染的场景。

示例:一个 ItemList 组件,父组件控制渲染的每一项:

<ItemList :items="items"><template v-slot:item="slotProps"><div>{{ slotProps.item.name }}</div></template>
</ItemList>

三、延伸知识

  • 插槽的默认内容:如果父组件没有传递内容给插槽,子组件可以设置默认内容。例如:
<slot>默认内容</slot>
  • 多个插槽:子组件可以有多个插槽,可以使用具名插槽来控制每个插槽的内容。多个插槽使用不同的 v-slot 名称。

总结

Vue 插槽通过提供灵活的内容传递机制,使得子组件和父组件之间的耦合度降低,同时提升了组件的复用性和可维护性。插槽的几种类型——默认插槽、具名插槽和作用域插槽——在不同的场景中各具优势,帮助我们处理各种动态内容渲染需求。在实际开发中,合理使用插槽,可以大大提升开发效率和应用的可扩展性。

相关文章:

【前端框架与库】「深入理解 Vue 插槽」:类型、用法与实际场景解析,增强组件复用性的利器

深入理解 Vue 插槽 [TOC](深入理解 Vue 插槽) 前言一、插槽的几种类型1. 默认插槽&#xff08;Default Slot&#xff09;2. 具名插槽&#xff08;Named Slot&#xff09;3. 作用域插槽&#xff08;Scoped Slot&#xff09; 二、插槽的作用与实际使用场景三、延伸知识总结 前言 …...

对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 与基于 openEuler 构建 LVS-DR 群集

一、 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式&#xff0c;比较其各自的优势 NAT 模式 部署简单&#xff1a;NAT 模式下&#xff0c;所有的服务器节点只需要连接到同一个局域网内&#xff0c;通过负载均衡器进行网络地址转换&#xff0c;就可以实现负载均衡功能。不需要对…...

matplotlib绘制频率分布直方图

1.给了数据,让统计这些数据的分布 from matplotlib import pyplot as plt from matplotlib import rcParams import random as r# 直方图用来统计每个区间数量多少rcParams[font.sans-serif] [SimHei] rcParams[axes.unicode_minus] Falseplt.figure(figsize(20,8), dpi80)#…...

相得益彰,Mendix AI connector 秒连DeepSeek ,实现研发制造域场景

在当今快速发展的科技领域&#xff0c;低代码一体化平台已成为企业数字化转型的关键工具&#xff0c;同时&#xff0c;大型语言模型&#xff08;LLM&#xff09;如 DeepSeek 在自动生成代码和提供智能建议方面表现出色。 Mendix 于近期发布的 GenAI 万能连接器&#xff0c;目前…...

shell脚本自动安装MySQL8

环境&#xff1a;centos7版本&#xff1a;8.0.28安装包&#xff1a;mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz 二进制包要求&#xff1a;安装包和shell脚本在同一目录下执行方式&#xff1a;sudo ./install_mysql8.sh #!/bin/bash# 定义MySQL安装目录和压缩包名称MYSQL_DIR…...

Git | 相关命令

相关资料 官网Git 学习教程Git 入门指南Git 的奇技淫巧Git Extras git 命令行扩展工具配置 Git 处理行结束符Git 配置多个 SSH-Key下载相关 Windows 版下载镜像使用 jsdelivr 加速 Github 仓库资源 commit 常用的 type 常用 Git 命令 [xxx] 均为可选参数 git clone # 拷贝一…...

RealClip正式发布:重新定义轻量化数字内容交互体验

在移动互联网流量红利逐渐见顶的当下&#xff0c;用户对即时性、碎片化娱乐与交互体验的需求持续攀升。轻量化小游戏、VR互动、数字孪生、工业仿真等内容形态迅速崛起&#xff0c;但开发者却面临两大核心矛盾&#xff1a;如何将高性能互动内容轻量化嵌入现有应用中&#xff1f;…...

Linux内核 - 非仿生机器人之感知主控系统(协议栈)

Linux内核 - 非仿生机器人之感知主控系统&#xff08;协议栈&#xff09; 注&#xff1a;该项目为18年实习期间&#xff0c;参与非仿生六足机器人&#xff08;Linux方案&#xff09;的个人理解和积累。时至今日&#xff0c;再看其实仅为一套系统编程相关框架&#xff0c;一直为…...

CZML 格式详解,javascript加载导出CZML文件示例

示例地址&#xff1a;https://dajianshi.blog.csdn.net/article/details/145573994 CZML 格式详解 1. 什么是 CZML&#xff1f; CZML&#xff08;Cesium Zipped Markup Language&#xff09;是一种基于 JSON 的文件格式&#xff0c;用于描述地理空间数据和时间动态场景。它专…...

【gRPC-gateway】auth-通过拦截器从上下文中提取元数据用于认证,与从http header转发待认证数据到上下文进行验证,go案例

从grpc上下文中提取元数据用于认证 案例 interceptor.go package serverimport ("context""errors""google.golang.org/grpc""google.golang.org/grpc/metadata""strings" )// UnaryInterceptor 是一个 unary RPC 的拦截器…...

Sass基础知识以及常用知识整理

Sass基础知识以及常用知识整理 一、CSS 功能拓展 注意&#xff1a;>、 、和~的区分 1.1 嵌套规则 Sass 允许将一套 CSS 样式嵌套进另一套样式中&#xff0c;内层的样式将它外层的选择器作为父选择器&#xff0c;例如&#xff1a; #main p {color: #00ff00;width: 97%;…...

Redis 内存回收机制

Redis 是一个基于内存的键值存储系统&#xff0c;为了避免内存耗尽&#xff0c;Redis 提供了多种内存回收机制。以下是 Redis 内存回收的主要方式&#xff1a; 1. 过期键删除 Redis 支持为键设置过期时间&#xff0c;过期后会自动删除键以释放内存。 1.1 设置过期时间 SET key…...

docker安装mongo,导入、导出数据

1、docker安装mongo docker pull mongo docker run -d -p 27017:27017 --name mongodb mongodocker update mongodb --restartalways ## 开机自启动-d&#xff1a;表示以后台模式运行容器。 -p 27017:27017&#xff1a;将容器内部的 MongoDB 默认端口 27017 映射到宿主机的 27…...

Excel常用操作

Excel常用操作 学习资源 37_电子表格处理考点精讲_设置数据格式_哔哩哔哩_bilibili 快速输入数据与编辑数据 一个工作簿可以包含多个工作表 特殊数据的添加格式 输入负数, 例如-3、-5 常规输入, 直接输入-3、-5;使用(), 例如在单元格中输入(3)回车即可变为-3;上述括号不区分中…...

嵌入式EasyRTC实时通话支持海思hi3516cv610,编译器arm-v01c02-linux-musleabi-gcc

EasyRTC已经完美支持海思hi3516cv610&#xff0c;编译器arm-v01c02-linux-musleabi-gcc&#xff0c;总体SDK大小控制在680K以内&#xff08;预计还能压缩100K上下&#xff09;&#xff1a; EasyRTC在hi3516cv610芯片上能双向通话、发送文字以及二进制指令&#xff0c;总体运行…...

在freertos中,中断优先级和任务优先级之间的关系和使用方法

中断优先级和任务优先级如何匹配&#xff1f;任务优先级不同任务之间该用多高的优先级&#xff1f;中断优先级不同中断中该用多高的优先级&#xff1f;中断优先级和任务优先级设置时&#xff0c;怎样设置可以让任务在调度时屏蔽中断&#xff1f;怎样设置可以让任务在调度时&…...

设置ollama接口能外部访问

为了配置Ollama以允许外网访问&#xff0c;你可以按照以下步骤进行操作&#xff1a; ‌确认Ollama服务已正确安装并运行‌&#xff1a; 使用以下命令检查Ollama服务的状态&#xff1a; bash Copy Code systemctl status ollama如果服务未运行&#xff0c;使用以下命令启动它&…...

Go GUI 框架, energy many-browser 示例解读

CEF 在 Go 中的应用实现 示例链接 1. 初始化和配置 在使用 CEF 创建基于浏览器的应用时&#xff0c;首先需要初始化并配置应用实例。 1.1 创建应用实例 // 创建CEF应用实例 app : cef.NewApplication()1.2 配置应用参数 // 设置缓存路径 rootCache : filepath.Join(const…...

Docker 部署 MongoDB | 国内阿里镜像

一、简易单机版 1、镜像拉取 docker pull registry.cn-hangzhou.aliyuncs.com/farerboy/mongo:8.0.5-rc1 2、运行镜像 docker run -it --name mongodb \ -e MONGO_INITDB_ROOT_USERNAMEmongoroot \ -e MONGO_INITDB_ROOT_PASSWORDmongoroot \ -v /wwwroot/opt/docker/mong…...

软件工程-软件设计

包括 从管理的观点看包括&#xff1a; 详细设计 概要设计 从技术的观点看包括&#xff1a; 数据设计&#xff08;详细设计&#xff09; 系统结构设计&#xff08;概要设计&#xff09; 过程设计&#xff08;详细设计&#xff09; 任务 分析模型——》设计模型——》设…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...