vue3 插槽slot

news2025/4/9 10:49:01

插槽是子组件中的提供给父组件使用的一个占位符,用 <slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot> 元素。<slot> 元素是一个插槽出口 (slot outlet),标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。

一、匿名插槽 

子组件 FancyButton 中插槽模板

# 基础用法
<button class="fancy-btn">
	<!-- 插槽出口 -->
	<slot></slot> 
</button>

# 可指定默认插槽内容:父组件没有提供任何插槽内容时,默认渲染的插槽内容 Submit
<button class="fancy-btn">
	<slot>Submit</slot> 
</button>

父组件填充插槽内容

<FancyButton>
	<!-- 插槽内容 -->
	<div>Click me!</div>
</FancyButton>

# 或

<FancyButton>
	<!-- 插槽内容 -->
	 <template v-slot>
       <div>Click Me</div>
    </template>
</FancyButton>

最终渲染出的 DOM 结构如下

<button class="fancy-btn">Click me!</button>

ps. 

通过使用插槽,使组件更加灵活和具有可复用性。这样组件可以用在不同的地方渲染各异的内容,但同时还保证都具有相同的样式。

二、具名插槽 (named slots) 

具名插槽其实就是给插槽取个名字。一个子组件可以放多个插槽,而且可以放在不同的地方,而父组件填充内容时,可以根据这个名字把内容填充到对应插槽中。

对于这种场景,<slot> 元素可以有一个特殊的属性 name,用来给各个插槽分配唯一的 ID,以确定每一处要渲染的内容:

子组件预留的插槽

<div class="container">
    <header>
    	<slot name="header"></slot>
    </header>
    <main>
    	<-- 没有提供 name 的 slot 出口会隐式地命名为 “default” -->
    	<slot></slot>
    </main>
    <footer>
    	<slot name="footer"></slot>
    </footer>
</div>

 父组件对指定插槽进行填充

要为具名插槽传入内容,我们需要使用一个含 v-slot 指令的 <template> 元素,并将目标插槽的名字传给该指令。

<BaseLayout>
    <template v-slot:header>
       <div>header</div>
    </template>
    <template v-slot>
       <div>default</div>
    </template>
    <template v-slot:footer>
       <div>footer</div>
    </template>
</BaseLayout>

v-slot 语法糖(简写方式)

v-slot 有对应的简写 #,因此 <template v-slot:header> 可以简写为 <template #header>。其意思就是“将这部分模板片段传入子组件的 header 插槽中”。

<BaseLayout>
    <template #header>
    	<h1>Here might be a page title</h1>
    </template>

    <template #default>
    	<p>A paragraph for the main content.</p>
    	<p>And another one.</p>
    </template>

    <template #footer>
    	<p>Here's some contact info</p>
    </template>
</BaseLayout>

# 或

# 当一个组件同时接收默认插槽和具名插槽时,所有位于顶级的非 <template> 节点都被隐式地视为默认插槽的内容。所以上面也可以写成:
<BaseLayout>
    <template #header>
    	<h1>Here might be a page title</h1>
    </template>

    <!-- 隐式的默认插槽 -->
    <p>A paragraph for the main content.</p>
    <p>And another one.</p>

    <template #footer>
    	<p>Here's some contact info</p>
    </template>
</BaseLayout>

现在 <template> 元素中的所有内容都将被传递到相应的插槽。最终渲染出的 HTML 如下:

<div class="container">
    <header>
    	<h1>Here might be a page title</h1>
    </header>
    
    <main>
    	<p>A paragraph for the main content.</p>
    	<p>And another one.</p>
    </main>
    
    <footer>
    	<p>Here's some contact info</p>
    </footer>
</div>

三、动态插槽

动态指令参数在 v-slot 上也是有效的,即可以通过变量定义动态插槽名:

<script setup>
	import { ref } from "vue";
	const name = ref('header')
</script>
<template>
	<base-layout>
		<template v-slot:[name]>
            <div>动态插槽</div>
        </template>
	
		 <!-- 缩写为 -->
        <template #[name]>
            <div>动态插槽</div>
        </template>
    </base-layout>
</temppate>

四、作用域插槽

在某些场景下插槽的内容可能想要同时使用父组件域内和子组件域内的数据。可以使用属性绑定的方式向一个插槽的出口上传递数据,称为插槽 props 。

4.1 匿名插槽数据传递

子组件 MyComponent传递插槽 props

<div>
  <slot :text="greetingMessage" :count="1"></slot>
</div>  

父组件接收插槽 props:默认插槽通过子组件标签上的 v-slot 指令,直接接收到了一个插槽 props 对象

<MyComponent v-slot="slotProps">
	{{ slotProps.text }} {{ slotProps.count }}
</MyComponent>

# 或 在 v-slot 中使用解构语法
<MyComponent v-slot="{ text, count }">
	{{ text }} {{ count }}
</MyComponent>

4.2 具名插槽数据传递

具名作用域插槽的工作方式也是类似的,插槽 props 可以作为 v-slot 指令的值被访问到:v-slot:name="slotProps"

<MyComponent>
  <template #header="headerProps">
    {{ headerProps }}
  </template>

  <template #default="defaultProps">
    {{ defaultProps }}
  </template>

  <template #footer="footerProps">
    {{ footerProps }}
  </template>
</MyComponent>

4.3 作用域插槽应用场景:高级列表组件示例

你可能想问什么样的场景才适合用到作用域插槽,这里我们来看一个 <FancyList> 组件的例子。它会渲染一个列表,并同时会封装一些加载远端数据的逻辑、使用数据进行列表渲染、或者是像分页或无限滚动这样更进阶的功能。然而我们希望它能够保留足够的灵活性,将对单个列表元素内容和样式的控制权留给使用它的父组件。我们期望的用法可能是这样的:

<FancyList :api-url="url" :per-page="10">
    <template #item="{ body, username, likes }">
        <div class="item">
          <p>{{ body }}</p>
          <p>by {{ username }} | {{ likes }} likes</p>
        </div>
    </template>
</FancyList>

在 <FancyList> 之中,我们可以多次渲染 <slot> 并每次都提供不同的数据 (注意我们这里使用了 v-bind 来传递插槽的 props):

<ul>
  <li v-for="item in items">
    <slot name="item" v-bind="item"></slot>
  </li>
</ul>

上面的 <FancyList> 案例同时封装了可重用的逻辑 (数据获取、分页等) 和视图输出,但也将部分视图输出通过作用域插槽交给了消费者组件来管理

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自由编程学习资源:free-programming-books

最近&#xff0c;我发现了一个在GitHub上备受欢迎的项目&#xff0c;它为程序员和编程爱好者提供了丰富、免费且高质量的学习资料&#xff0c;这就是"free-programming-books"。目前&#xff0c;这个项目在GitHub上已经有305k的star&#xff0c;显示出它在开发者社区…

分享66个JavaGame源码总有一个是你想要的

分享66个JavaGame源码总有一个是你想要的 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 游戏下载链接&#xff1a;https://pan.baidu.com/s/1BUVmun2RhAY4vAMJwcY0mQ?pwd6666 提取码&#xff1a;6666 游戏项目名称 java实现…

千兆多模光模块SFP-GE-SX是什么?特点和应用领域有哪些?

千兆多模光模块SFP-GE-SX是一种用于光纤通信的光模块&#xff0c;用于传输千兆&#xff08;1 Gbps&#xff09;速率的数据。它使用多模光纤作为传输介质&#xff0c;并通过光信号来实现数据的传输。多模光纤是一种光纤&#xff0c;它具有相对较大的纤芯直径&#xff0c;通常为5…

UltraISO(软碟通)制作U盘启动盘完整教程

一、 准备工作 UltralSO 软件、ISO系统镜像、容量合适的U盘 二、详细步骤 首先&#xff0c;确保你已经安装了UltraISO软件&#xff0c;如果没有&#xff0c;可以从官方网站下载并安装。插入你的U盘&#xff0c;并确保U盘上没有重要的数据&#xff0c;先格式化优盘。然后打开…

ASF-YOLO:一种基于注意尺度序列融合的细胞实例分割YOLO模型

摘要 我们提出了一种基于注意力尺度序列融合的You Only Look Once&#xff08;YOLO&#xff09;框架&#xff08;ASF-YOLO&#xff09;&#xff0c;该框架结合了空间和尺度特征&#xff0c;用于准确快速的细胞实例分割。在YOLO分割框架的基础上&#xff0c;我们采用尺度序列特…

电子电器架构( E/E) 演化 —— 大算力

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

Proxifier安装与激活

proxifier官网链接 步骤 1&#xff1a;购买 Proxifier 许可证 访问 Proxifier 官方网站&#xff1a;https://www.proxifier.com/ 在网站上查找并选择 “Purchase” 或类似的选项。 选择适合你需求的许可证类型&#xff0c;填写相关信息并完成购买。 如果不想购买&#xff0c…

每天五分钟计算机视觉:网络中的网络(NiN)

本文重点 前面的课程中我们学习了众多的经典网络模型&#xff0c;比如LeNet、AlexNet、VGG等等&#xff0c;这些网络模型都有共同的特点。 它们的特点是&#xff1a;先由卷积层构成的模块充分提取空间特征&#xff0c;然后再由全连接层构成的模块来输出分类结果。也就是说它们…

【C语言】基础刷题训练4(含全面分析和代码改进示例)

系列文章目录 提示&#xff1a;该系列文章暂未全部完成&#xff0c;暂时欠缺系列文章目录&#xff0c;见谅 基础刷题训练4&#xff08;含全面分析和代码改进示例&#xff09; 文章目录 系列文章目录前言题目链接(有需要的请自行链接做题)T1&#xff1a;思路1&#xff1a;思路2&…

基于Java SSM框架实现课程思政元素收集系统项目【项目源码+论文说明】

基于java的SSM框架实现课程思政元素收集系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认…

git教程(基于vscoede)

Git&#xff08;读音为/gɪt/&#xff09;是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 1.打开vscode&#xff0c;创建文件夹gittest&am…

keithley 吉时利6221源表

特点 优势 10 14 Ω 输出阻抗 提供广泛的输出阻抗&#xff0c;确保负载中有稳定的电流源。 65000 点源内存 允许直接从电流源执行全面的测试电流扫描。 输出 0.1V 至 105V 的恒流电压&#xff0c;10mV 步长 防止潜在损坏对过电压敏感的设备。 源交流电源范围为 4pA 至…

FFmpeg转码流程和常见概念

视频格式&#xff1a;mkv&#xff0c;flv&#xff0c;mov&#xff0c;wmv&#xff0c;avi&#xff0c;mp4&#xff0c;m3u8&#xff0c;ts等等 FFmpeg的转码工具&#xff0c;它的处理流程是这样的&#xff1a; 从输入源获得原始的音视频数据&#xff0c;解封装得到压缩封装的音…

iOS应用如何通过广告变现?有哪些变现优势?

2021年&#xff0c;在ios 14.5发布后&#xff0c;移动应用生态正式进入「后 IDFA 时代」&#xff0c;收集用户数据的方式发生了变化&#xff0c;这让通过定向广告变现变得比以往更加困难&#xff0c;且苹果还禁止对安装应用提供奖励。即便如此&#xff0c;iOS的“吸金”能力只增…

优质全套SpringMVC教程

三、SpringMVC 在SSM整合中&#xff0c;MyBatis担任的角色是持久层框架&#xff0c;它能帮我们访问数据库&#xff0c;操作数据库 Spring能利用它的两大核心IOC、AOP整合框架 1、SpringMVC简介 1.1、什么是MVC MVC是一种软件架构的思想&#xff08;不是设计模式-思想就是我们…

java 角色访问控制管理系统Myeclipse开发mysql数据库MVC结构serlvet编程计算机网页项目

一、源码特点 java 角色访问控制管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统采用serlvetdaobean&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发 开发工具myeclipse8.5 mysql5…

java8实战 lambda表达式和函数式接口(上)

前言&#xff1a; 本博客对java8实战第三章的总结&#xff0c;也是上一篇博客行为化参数的延续&#xff0c;介绍一下函数式接口 Lambda表达式 lambda的表达式的结构由&#xff1a;参数&#xff0c;箭头&#xff0c;主体构成。 lambda示例 函数式接口&#xff1a; 先看上一篇…

Ubuntu-报错

Hadoop-Eclipse-java&#xff1a;耽误进度的几个报错 错误1&#xff1a;桥接模式与NAT模式相互切换后导致两种模式都不能访问互联网&#xff08;1&#xff09;具体错误&#xff1a;&#xff08;2&#xff09;错误原因&#xff1a;&#xff08;3&#xff09;解决方案&#xff1a…

Java_Arrays类

一、Arrays类 接下来学习的类叫做Arrays&#xff0c;其实Arrays并不是重点&#xff0c;但是我们通过Arrays这个类的学习有助于我们理解下一个知识点Lambda的学习。所以我们这里先学习Arrays&#xff0c;再通过Arrays来学习Lamdba这样学习会更丝滑一些_. 1.1 Arrays基本使用 …

【Linux】初识命令行

为什么使用命令行&#xff1f; 大多数的计算机用户只是熟悉图形用户界面(GUI)&#xff0c;采用图形方式显示的用户操作界面。命令行界面(CLI)是一种通过文本输入来与计算机进行交互的方式&#xff0c;用来和计算机进行交流沟通的非常有效的方式&#xff0c;正像人类社会使用文…