Vue演练场基础知识(七)插槽
为学习Vue基础知识,我动手操作通关了Vue演练场,该演练场教程的目标是快速体验使用 Vue 是什么感受,设置偏好时我选的是选项式 + 单文件组件。以下是我结合深入指南写的总结笔记,希望对Vue初学者有所帮助。
文章目录
- 十五. 插槽
- 插槽内容与出口
- 渲染作用域
- 默认内容
- 具名插槽
- 条件插槽
- 动态插槽名
- 作用域插槽
- 具名作用域插槽
- 高级列表组件示例
- 无渲染组件
十五. 插槽
插槽内容与出口
父组件可以用props向子组件传递js表达式,emits向子组件传递事件,那能不能直接向子组件传递定义好的模板内容呢?
这就是插槽的作用。
<!-- Dialog.vue -->
<div class="dialog"><slot />
</div>
<Dialog><div>对话框内容</div>
</Dialog>
最终渲染出的 DOM 是这样:
<div class="dialog"><div>对话框内容</div>
</div>
渲染作用域
由于插槽内容是在父组件里定义的,所以它能访问到父组件的数据作用域,不能访问子组件的。
<!-- Dialog.vue -->
<script>
export default {data() {return {msg: '来自子组件的内容'};}
}
</script>
<template><div class="dialog"><slot /></div>
</template>
<script>
import Dialog from './Dialog.vue';
export default {components: {Dialog},data() {return {msg: '来自父组件的内容'};}
}
</script>
<template><Dialog><div>{{msg}}</div></Dialog>
</template>
最终渲染出的 DOM 是这样:
<div class="dialog"><div>来自父组件的内容</div>
</div>
默认内容
<slot> 标签之间的内容可以作为默认内容,如果父组件使用了含有插槽的子组件但没有传入插槽内容,子组件中的插槽就使用默认内容。
<!-- Dialog.vue -->
<div class="dialog"><slot>默认内容</slot>
</div>
<Dialog><div>对话框内容</div>
</Dialog>
<Dialog />
最终渲染出的 DOM 是这样:
<div class="dialog"><div>对话框内容</div>
</div>
<div class="dialog">默认内容
</div>
具名插槽
有时候我们希望子组件能接收多个插槽内容,比如希望一个对话框组件支持分别接收头部内容、主体内容、底部内容。对于这种场景, 元素可以有一个特殊的 attribute name,用来给各个插槽分配唯一的 ID。
这类带 name 的插槽被称为具名插槽 (named slots)。没有提供 name 的 <slot> 出口会被隐式地命名为“default”。
<!-- Dialog.vue -->
<div class="dialog"><!-- 对话框头部 --><header class="card-header"><slot name="header" /></header><!-- 对话框主体 --><main class="card-main"><slot></slot></main><!-- 对话框尾部 --><footer class="card-footer"><slot name="footer">默认底部</slot></footer>
</div>
与之<slot name="header">匹配的是包含模板内容的<template v-slot:header>,或简写为<template #header>:
<Dialog><!-- 对话框头部 --><template #header><div>我的标题</div></template><!-- 对话框主体 --><template #default><p>我的内容1</p><p>我的内容2</p></template><!-- 对话框尾部 --><template #footer><button>取消</button><button>确定</button></template>
</Dialog>
当一个组件同时接收默认插槽和具名插槽时,所有位于顶级的非 <template> 节点都被隐式地视为默认插槽的内容。所以也可以省略掉<template #default>,把其中内容直接作子组件的直接子元素,但不能混用,即子组件的直接子元素中不能同时出现<template #default>和非 <template> 节点。
<Dialog><!-- 对话框头部 --><template #header><div>我的标题</div></template><!-- 对话框主体 --><p>我的内容1</p><p>我的内容2</p><!-- 对话框尾部 --><template #footer><button>取消</button><button>确定</button></template>
</Dialog>
最终渲染出的 HTML 如下:
<div class="dialog"><!-- 对话框头部 --><header class="card-header"><div>我的标题</div></header><!-- 对话框主体 --><main class="card-main"><p>我的内容1</p><p>我的内容2</p></main><!-- 对话框尾部 --><footer class="card-footer"><button>取消</button><button>确定</button></footer>
</div>
推荐在使用具名插槽的时候,为默认插槽使用显式的 <template> 标签,不容易混淆,更加可读。
条件插槽
在上面的例子中,我们为对话框组件的 header、footer 或 default 等插槽设置了margin等样式:
<header class="card-header"><slot name="header" />
</header>
但如果用户希望创建一个没有头部的对话框,于是不传header插槽内容(且没有默认插槽内容),那就会出现对话框顶部渲染出一个空的<header>。
<header class="card-header"></header>
那么有没有办法在根据header插槽存在与否来决定要不要渲染<header>标签呢?
可以结合 $slots 属性与 v-if 来实现:
<header class="card-header" v-if="$slot.header"><slot name="header" />
</header>
其中的$slots表示父组件传入插槽的对象。
通常用于手写渲染函数,但也可用于检测是否存在插槽。
每一个插槽都在 this.$slots 上暴露为一个函数,返回一个 vnode 数组,同时 key 名对应着插槽名。默认插槽暴露为 this.$slots.default。
// this.$slots等于
{default: () => <div>...</div>,header: () => <div>...</div>,footer: () => <div>...</div>,
}
动态插槽名
插槽名不仅可以设置为常量,还可以设置为变量,如以下设置插槽名为变量mySlotName:
<!-- Dialog.vue -->
<div class="dialog"><slot :name="mySlotName">默认底部</slot>
</div>
<Dialog><template #[mySlotName]><button>取消</button><button>确定</button></template>
</Dialog>
作用域插槽
上文中提到,插槽是在父组件中被定义的,所以无法读取到子组件的状态。那假如插槽需要拿到子组件状态该怎么办呢?
可以像对组件传递 props 那样,向插槽出口<slot>上传入 attributes,实现把子组件的变量传递到插槽内容:
<!-- Dialog.vue -->
<div class="dialog"><slot msg="来自子组件的内容" /> <!-- 将子组件的状态传入slot -->
</div>
<Dialog v-slot="slotProps"> <!-- 设置一个slotProps变量接收来自父组件的插槽Props --><div>{{slotProps.msg}}</div>
</Dialog>
// 或
<Dialog v-slot="{msg}"><div>{{msg}}</div>
</Dialog>
最终渲染出的 DOM 是这样:
<div class="dialog"><div>来自子组件的内容</div>
</div>
具名作用域插槽
作用域插槽也可以与具名插槽混用,如下面的v-slot:header="slotProps1"(也可写作#header="slotProps1):
<!-- Dialog.vue -->
<div class="dialog"><header><slot name="header" msg="来自子组件的内容1" /></header><main><slot msg="来自子组件的内容2"/></main>
</div>
<Dialog><!-- header插槽 --><!-- v-slot设置在<template>上,而不是<Dialog>上 --><!-- v-slot:header="slotProps1" 也可以简写成 #header="slotProps1" --><template #header="slotProps1"> <div>来自父组件的内容</div><div>{{slotProps1.msg}}</div></template><!-- 默认插槽 --><!-- 支持在 v-slot 中使用解构 --><!-- 可写作 v-slot="{msg}" 或 v-slot:default="{msg}" 或 #default="{msg}" --><template #default="{msg}"><div>{{msg}}</div></template></Dialog>
最终渲染出的 DOM 是这样:
<div class="dialog"><header><div>来自父组件的内容</div><div>来自子组件的内容1</div></header><main><div>来自子组件的内容2</div></main>
</div>
再次推荐为默认插槽使用显式的 <template> 标签,不容易出错。
不允许像下面这样
同时在子组件上和template上定义v-slot,否则会编译报错。
<Dialog v-slot="slotProps2"><!-- header插槽 --><template v-slot:header="slotProps1"> <div>来自父组件的内容</div><div>{{slotProps1.msg}}</div></template><!-- 默认插槽 --><div>{{slotProps2.msg}}</div></Dialog>
高级列表组件示例
通过对具名作用域插槽的运用,我们可以实现一个高级列表组件,封装了可重用的逻辑 (如数据获取、分页、无限滚动等) 和视图输出,并将部分视图输出(如列表项的内容和样式、每页条目数)通过作用域插槽交给了消费者组件来管理。
<!-- FuncyList.vue -->
<ul><li v-for="item in list" key="item.id"><slot name="itemSlot" v-bind="item">{{item}}</slot></li>每页{{pageNum}}个
</ul>
<FuncyList :page-num="10" ><template #itemSlot="{id, title}"> <div>{{id}}-{{title}}</div></template></FuncyList>
无渲染组件
一些组件可能只包括了逻辑而不需要自己渲染内容,视图输出通过作用域插槽全权交给了消费者组件。我们将这种类型的组件称为无渲染组件。
<!-- NoRenderComponent.vue -->
<script>
export default {data() {return {pi: '3.1415926535'};},computed: {doublePi: () => this.pi *2;}
}
</script>
<template><!-- 仅包含逻辑,不包含任何视图 --><slot :text="doublePi" />
</temlate>
<NoRenderComponent ><template v-slot="{text}"><!-- 展示NoRenderComponent数据的视图写在插槽里 --><div class="uiClass">{{text}}</div></template>
</NoRenderComponent>
相关文章:
Vue演练场基础知识(七)插槽
为学习Vue基础知识,我动手操作通关了Vue演练场,该演练场教程的目标是快速体验使用 Vue 是什么感受,设置偏好时我选的是选项式 单文件组件。以下是我结合深入指南写的总结笔记,希望对Vue初学者有所帮助。 文章目录 十五. 插槽插槽…...
进程池的制作(linux进程间通信,匿名管道... ...)
目录 一、进程间通信的理解 1.为什么进程间要通信 2.如何进行通信 二、匿名管道 1.管道的理解 2.匿名管道的使用 3.管道的五种特性 4.管道的四种通信情况 5.管道缓冲区容量 三、进程池 1.进程池的理解 2.进程池的制作 四、源码 1.ProcessPool.hpp 2.Task.hpp 3…...
【Linux】Linux C比较两个 IPv6 网关地址是否相等,包括前缀
功能说明 在 Linux 环境下使用 C 语言比较两个 IPv6 网关地址是否相等,包括前缀 实现步骤 解析 IPv6 地址:使用 inet_pton 将字符串形式的 IPv6 地址转换为二进制形式。解析前缀长度:从地址字符串中提取前缀长度(如 /64…...
【uniapp】uniapp使用java线程池
标题 由于js是性能孱弱的单线程语言,只要在渲染中执行了一些其他操作,会中断渲染,导致页面卡死,卡顿,吐司不消失等问题。在安卓端可以调用java线程池,把耗时操作写入线程池里面,优化性能。 实…...
面试题-Java集合框架
前言 Java集合框架(Java Collections Framework)是Java平台提供的一套用于表示和操作集合的统一架构。它位于java.util包中,并且自Java 1.2(也称为Java 2平台,标准版,即Java SE 2)起成为Java平…...
Java基础教程(007):方法的重载与方法的练习
文章目录 6.5 方法的重载6.6 方法练习数组遍历数组最大值 6.5 方法的重载 在 Java 中,方法的重载是指在同一个类中定义多个方法,这些方法具有相同的名称,但参数列表不同。方法的重载是一种实现多态的方式,允许一个方法名以不同的…...
【ESP32】ESP-IDF开发 | WiFi开发 | TCP传输控制协议 + TCP服务器和客户端例程
1. 简介 TCP(Transmission Control Protocol),全称传输控制协议。它的特点有以下几点:面向连接,每一个TCP连接只能是点对点的(一对一);提供可靠交付服务;提供全双工通信&…...
npm cnpm pnpm npx yarn的区别
npm、cnpm、pnpm、npx、yarn 这几个工具都与 Node.js 项目的包管理和命令执行相关,它们的区别具体如下: 本质与功能定位 npm:是 Node.js 官方的包管理工具,提供了安装、卸载、更新、发布等全方位的包管理功能,还能通…...
debian12.9编译freeswitch1.10.12【默认安装】
服务器操作系统 cat /etc/os-release PRETTY_NAME"Debian GNU/Linux 12 (bookworm)" NAME"Debian GNU/Linux" VERSION_ID"12" VERSION"12 (bookworm)" VERSION_CODENAMEbookworm IDdebian HOME_URL"https://www.debian.org/&quo…...
使用 C/C++ 调用 libcurl 调试消息
在使用 C/C 调用 libcurl 进行 HTTP 请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试。libcurl 提供了多种方法来捕获和输出这些信息,本文介绍具体的使用方式。 1. libcurl 调试工具简介 libcurl 是…...
【愚公系列】《循序渐进Vue.js 3.x前端开发实践》030-自定义组件的插槽Mixin
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主&…...
大一计算机的自学总结:异或运算
前言 异或运算这个操作看上去很匪夷所思,实际上作用非常大。 一、异或运算的性质 1.异或运算就是无进位相加。 2.满足交换律、结合律。 3.0^nn,n^n0。 4.若集合B为集合A子集,集合A异或和为x,集合B异或和为y,则集…...
通过protoc工具生成proto的pb.go文件以及使用protoc-go-inject-tag工具注入自定义标签
1.ProtoBuf认识,安装以及用法 参考:[golang 微服务] 3. ProtoBuf认识,安装以及golang 中ProtoBuf使用 2. 使用protoc-go-inject-tag工具注入自定义标签 这里有一个案例: syntaxproto3; package test;option go_package ".;test";message MyMessage {int6…...
C语言练习(29)
13个人围成一圈,从第1个人开始顺序报号1、2、3。凡报到“3”者退出圈子,找出最后留在圈子中的人原来的序号。本题要求用链表实现。 #include <stdio.h> #include <stdlib.h>// 定义链表节点结构体 typedef struct Node {int num;struct Nod…...
Android实训九 数据存储和访问
实训9 数据存储和访问 一、【实训目的】 1、 SharedPreferences存储数据; 2、 借助Java的I/O体系实现文件的存储, 3、使用Android内置的轻量级数据库SQLite存储数据; 二、【实训内容】 1、实现下图所示的界面,实现以下功能: 1ÿ…...
实验一---典型环节及其阶跃响应---自动控制原理实验课
一 实验目的 1.掌握典型环节阶跃响应分析的基本原理和一般方法。 2. 掌握MATLAB编程分析阶跃响应方法。 二 实验仪器 1. 计算机 2. MATLAB软件 三 实验内容及步骤 利用MATLAB中Simulink模块构建下述典型一阶系统的模拟电路并测量其在阶跃响应。 1.比例环节的模拟电路 提…...
SOME/IP--协议英文原文讲解2
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.1 Speci…...
matlab中,fill命令用法
在 MATLAB 中,fill 命令用于创建填充多边形的图形对象。使用 fill 可以在二维坐标系中绘制填充的区域,通常用于绘制图形的背景或显示数据分布。 基本语法 fill(X, Y, C)X 和 Y 是同样长度的向量,定义了多边形的顶点坐标。C 是颜色࿰…...
【Linux】Linux C判断两个IPv6地址是否有包含关系
功能说明 要判断两个 IPv6 地址是否具有包含关系,包括前缀的比较,可以通过以下步骤实现: 解析 IPv6 地址和前缀:将两个 IPv6 地址和它们的前缀长度解析为二进制形式。生成掩码:根据前缀长度生成掩码。按位比较&#…...
【玩转全栈】----Django基本配置和介绍
目录 Django基本介绍: Django基本配置: 安装Django 创建项目 创建app 注册app Django配置路由URL Django创建视图 启动项目 Django基本介绍: Django是一个开源的、基于Python的高级Web框架,旨在以快速、简洁的方式构建高质量的Web…...
Agent的决策模糊
文章目录Langchian Agent内部记忆:信息过载LLM注意力有限的解释:上下文窗口长度很大,会有这种问题么对比langGraphLangchian Agent内部记忆: 官方 ReAct 内部机制(铁律) LangChain 的 AgentExecutor 在一次 invoke () 内部&#…...
MAX32630FTHR平台RF95 LoRa精简移植实战
1. RadioHead库深度解析:面向MAX32630FTHR平台的RF95 LoRa通信精简移植 1.1 项目定位与工程价值 RadioHead并非官方标准协议栈,而是由Airspayce公司开发的一套轻量级、跨平台无线通信抽象库。其设计哲学强调“最小可行通信”——不追求协议完备性&#…...
基于Kubernetes Operator的MySQL InnoDB Cluster自动化部署实践
1. MySQL InnoDB Cluster与Kubernetes Operator基础 MySQL InnoDB Cluster是MySQL官方提供的高可用数据库解决方案,它基于MySQL Group Replication技术构建,能够实现多节点数据同步和自动故障转移。想象一下,这就像是一个由多个数据库实例组…...
Magma智能剪辑系统:视频自动生成实战
Magma智能剪辑系统:视频自动生成实战 1. 引言 想象一下这样的场景:你有一个精彩的视频创意,写好了详细的脚本,但面对一堆零散的素材片段却无从下手。传统的视频剪辑需要逐帧挑选、拼接、添加转场,一个几分钟的视频可…...
Phi-3-mini-4k-instruct-gguf应用落地:教育场景中的作业辅导与知识点提炼
Phi-3-mini-4k-instruct-gguf应用落地:教育场景中的作业辅导与知识点提炼 1. 教育场景中的AI助手需求 想象一下这样的场景:晚上10点,孩子还在为数学作业发愁,家长已经精疲力尽;老师批改着第50份作文,眼睛…...
M2LOrder模型在AI编程助手场景的应用:代码注释情感分析
M2LOrder模型在AI编程助手场景的应用:代码注释情感分析 1. 引言 你有没有在代码注释里写过“这里有个天坑,后面的人小心”或者“TODO: 这个逻辑太绕了,得重构”?这些看似随手的吐槽,其实藏着开发者最真实的情绪。代码…...
科研党福音:Zotero+Green Frog插件一键获取期刊分区与影响因子(附easyScholar密钥配置全流程)
科研文献管理革命:Zotero与Green Frog插件的深度整合实践 作为一名长期浸泡在学术海洋中的研究者,我深知高效文献管理工具的重要性。每天面对数百篇新发表的论文,如何快速识别高质量文献成为决定科研效率的关键因素。传统的手动查询期刊影响因…...
P3C黄山版突破式迁移指南:无缝升级Java代码规范检查体系
P3C黄山版突破式迁移指南:无缝升级Java代码规范检查体系 【免费下载链接】p3c Alibaba Java Coding Guidelines pmd implements and IDE plugin 项目地址: https://gitcode.com/gh_mirrors/p3/p3c 在Java开发团队中,代码规范检查工具的升级往往伴…...
Qwen2.5-VL-7B-Instruct开源大模型:支持中文优先的多模态理解部署方案
Qwen2.5-VL-7B-Instruct开源大模型:支持中文优先的多模态理解部署方案 1. 项目概述 Qwen2.5-VL-7B-Instruct是一款开源的视觉-语言多模态大模型,特别针对中文场景进行了优化。该模型能够同时处理图像和文本输入,实现跨模态的理解与生成任务…...
AI专著写作快车道:特色工具大集合,助力科研成果出版
学术专著写作困境与AI工具助力 学术专著的写作并不只是简单的“写出来”,更在于能否顺利“出版、得到认可”。在当前的出版市场,学术专著的受众本就相对有限,因此出版社对学术价值和作者的影响力要求非常高。许多作者虽然完成了初稿…...
