vue3:插槽、具名插槽、条件插槽、作用域插槽、具名作用域插槽 一次性搞清楚 --- 通俗易懂

1、插槽的使用:

~父组件index.vue:

<h3>我是父组件testSlot</h3>
<!-- 调用子组件alertBox测试插槽 -->
<alertBox></alertBox>
<alertBox>Something good will be happened.
/alertBox>
<br>

~alertBox.vue:

<template><h3>我是子组件alertBox</h3><div class="alert-box"><strong>This is a good news for this week!!!!!</strong><!-- 插槽占位,父组件调用时加入特性数据,展示特定数据 --><slot><!-- 我们使用 <slot> 作为一个占位符,父组件传递进来的内容就会渲染在这里。 --></slot></div>
</template>

效果:

2、封装button组件,通过slot插槽传入按钮名称 

~父组件index.vue:

<div>##################封装button组件,通过slot插槽传入按钮名称 start #############</div><div>调用fancyButton按钮组件</div><br><FancyButton class="fancy-btn">Click me!</FancyButton><FancyButton>提交订单</FancyButton><FancyButton class="examine-btn">提交审核</FancyButton><FancyButton>{{ obj.btn_text }}</FancyButton><br><div>##################封装button组件,通过slot插槽传入按钮名称 end #############</div>
const obj = reactive({productName: 'Fancy',total: 99,sku_id: '10086',btn_text: '去支付'
})
<style lang="less" scoped>.container {h3 {text-align: center;}.fancy-btn {margin-right: 10px;}.examine-btn:hover {background-color: #A802DB;font-size: 16px;}
}</style>

 ~fancyBuuton.vue:

<template><button class="fancu-btn"><slot></slot></button>
</template><script setup>
import { ref, reactive } from 'vue'/*** 封装统一风格的按钮样式* 稍微有不同的可以通过 透传 attribute* “透传 attribute”指的是传递给一个组件,却没有被该组件声明为 props 或 * emits 的 attribute 或者 v-on 事件监听器。最常见的例子就是 class、style 和 id。* 详情看官网:https://cn.vuejs.org/guide/components/attrs.html*/
</script><style scoped>
.fancu-btn {background-color: #42F5E2;border-radius: 25px;font-size: 14px;cursor: pointer;outline: none;
}
</style>

效果:

3、具名插槽

~父组件index.vue:

        <NamedSlots><template #header><h4>Here might be a page title</h4></template><!-- 两种写法效果相同 --><!-- <template #default><p>A paragraph for the main content.</p><p>And another one.</p></template> --><p>A paragraph for the main content.</p><p>And another one.</p><template #footer><h4>底部信息</h4><p>Here's some concat info.</p></template></NamedSlots>

 ~namedSlot.vue:

<template><div class="container"><header><!-- 标题内容放这里 --><slot name="header"></slot></header><main><!-- 主要内容放这里 ——不添加name,是默认插槽--><slot></slot></main><footer><!-- 底部内容放这里 --><slot name="footer"></slot></footer></div>
</template>
<script setup>
import { ref, reactive } from 'vue'
/*** 具名插槽 --- 有时在一个组件中包含多个插槽出口是很有用的。* Named slots* 这类带 name 的插槽被称为具名插槽 (named slots)。没有提供 name 的 <slot> 出口会隐式地命名为“default”。* 要为具名插槽传入内容,我们需要使用一个含 v-slot 指令的 <template> 元素,并将目标插槽的名字传给该指令:* v-slot 有对应的简写 #,因此 <template v-slot:header> 可以简写为 <template #header>。其意思就是“将这部* 分模板片段传入子组件的 header 插槽中”。*/</script>
<style scoped></style>

效果:

 4、条件插槽

~父组件index.vue:

        <div>##################条件插槽 start #############</div><ConditionalSlot><template #header><h4>头部数据</h4></template><template #default><p>主要内容:Here is the content.</p></template><template #footer><em>底部信息:Here is the footer!</em></template></ConditionalSlot><div>##################条件插槽 end #############</div>

conditionalSlot.vue:

<template><div class="card"><div class="card-header"><slot name="header"></slot></div><div class="card-content"><slot /></div><div class="card-footer"><slot name="footer"></slot></div></div>
</template>
<script setup>
import { ref, reactive } from 'vue'
/*** 条件插槽* 有时你需要根据插槽是否存在来渲染某些内容。* 你可以结合使用 $slots 属性与 v-if 来实现。* 在下面的示例中,我们定义了一个卡片组件,它拥有三* 个条件插槽:header、footer 和 default。 当 header、* footer 或 default 存在时,我们希望包装它们以提供额外的样式:* */</script>
<style lang="less" scoped>.card {border: 1px solid black;padding: 0;.card-header {background-color: skyblue;padding: 4px;}.card-content {background-color: pink;padding: 4px;}.card-footer {background-color: lightgray;padding: 4px;}}
</style>

效果:

5、动态插槽名:

       <!-- 动态插槽名动态指令参数在 v-slot 上也是有效的,即可以定义下面这样的动态插槽名: --><!-- <base-layout><template v-slot:[dynamicSlotName]>...</template>可缩写为如下:<template #[dynamicSlotName]>...</template></base-layout> -->

 6、作用域插槽:

~父组件index.vue:

<div>##################作用域插槽 start #############</div><br><!-- 通过v-slot接收传过来的数据 --><scopeSlot v-slot="props">message:{{ props.text }}count:{{ props.count }}</scopeSlot><!-- v-slot="slotProps" 可以类比这里的函数签名,和函数的参数类似,我们也可以在 v-slot 中使用解构:--><scopeSlot v-slot="{ text, count }">解构后的数据:'{{ text }}', 和 '{{ count }}''</scopeSlot><br><div>##################作用域插槽 end #############</div>

scopeSlot.vue:

<template><div class="container"><header><!-- 标题内容放这里 --><slot name="header"></slot></header><main><!-- 主要内容放这里 ——不添加name,是默认插槽--><slot></slot></main><footer><!-- 底部内容放这里 --><slot name="footer"></slot></footer></div>
</template>
<script setup>
import { ref, reactive } from 'vue'
/*** 具名插槽 --- 有时在一个组件中包含多个插槽出口是很有用的。* Named slots* 这类带 name 的插槽被称为具名插槽 (named slots)。没有提供 name 的 <slot> 出口会隐式地命名为“default”。* 要为具名插槽传入内容,我们需要使用一个含 v-slot 指令的 <template> 元素,并将目标插槽的名字传给该指令:* v-slot 有对应的简写 #,因此 <template v-slot:header> 可以简写为 <template #header>。其意思就是“将这部* 分模板片段传入子组件的 header 插槽中”。*/</script>
<style scoped></style>

 效果:

7、具名作用域插槽

~父组件index.vue:

    <div>##################具名作用域插槽 start #############</div><!-- 解构或者通过变量接收参数都可以 --><NamedScopeSlot v-slot:header="{msg}">具名作用域插槽数据:{{ msg }}</NamedScopeSlot><!-- 等同于下面 --><NamedScopeSlot #header="{msg}">具名作用域插槽数据:{{ msg }}</NamedScopeSlot><!-- 注意插槽上的 name 是一个 Vue 特别保留的 attribute,不会作为 props 传递给插槽。因此最终 headerProps 的结果是 { message: 'hello' }。 --><NamedScopeSlot #header="{name, msg}">具名作用域插槽数据:{{ name }} {{ msg }}</NamedScopeSlot><div>##################具名作用域插槽 end #############</div>

namedScopeSlot.vue:

<template><div><!-- 具名作用域插槽 --><slot name="header" msg="Hello, Friday"></slot></div>
</template>
<script setup>
import { ref, reactive } from 'vue'</script>
<style scoped></style>

效果:

以上就是插槽的使用,源码里面有注释说明。 

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

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

相关文章

钓虾馆计时计费怎么用,佳易王钓虾馆钓鱼场计时器工具软件操作教程

钓虾馆计时计费怎么用&#xff0c;佳易王钓虾馆钓鱼场计时器工具软件操作教程 一、前言 以下软件操作教程以&#xff0c;佳易王钓虾馆钓鱼场计时计费软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 可以多种单价计费方式&#xff0c;在系统…

Elasticsearch 认证模拟题 - 4

一、题目 生成快照&#xff0c;或快照生命周期 1.1 考点 快照生命周期&#xff08;最好通过界面化配置&#xff09;创建仓库创建快照 &#xff08;因为这个需要部署共享文件&#xff0c;所以这个我就在虚拟机上简单操作一下&#xff09; 注&#xff1a; 部署共享文件系统可…

【开发利器】使用OpenCV算子工作流高效开发

学习《人工智能应用软件开发》&#xff0c;学会所有OpenCV技能就这么简单&#xff01; 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; OpenCV实验大师Python SDK 基于OpenCV实验大师v1.02版本提供的Python SDK 实现工作流导出与第三方应用集…

MySql全文索引+Ngram

一、关于Ngram 1.1 什么是ngram MySQL 内置的全文解析器使用单词之间的空格作为分隔符&#xff0c;这对于不使用空格做分隔符的语言是一种限制。为了解决这一限制&#xff0c;MySQL提供了一个支持中文、日文和韩文&#xff08;CJK&#xff09;的ngram全文解析器。ngram 全文解…

图像加雾算法的研究与应用

目录 前言 一、图像加雾 1、基于传统方法的雾图合成 2、基于深度学习的雾图合成 3、基于Lightroom Classic实现软件加雾 4、基于深度图的方法实现加雾 二、开源的数据集 三、参考文章 前言 在去雾任务当中&#xff0c;训练和评估去雾算法需要大量的带有雾霾和无雾霾的…

聊聊几种常见的分布式Session解决方案

highlight: xcode theme: vuepress 问题引入&#xff1a;什么是分布式Session&#xff1f; 分布式 Session 是指在多台服务器之间共享和管理用户的会话数据&#xff0c;使得用户的会话状态能够在不同的服务器上保持一致。这样&#xff0c;无论用户的请求被路由到哪台服务器&…

【Go语言精进之路】构建高效Go程序:掌握变量、常量声明法则与iota在枚举中的奥秘

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、变量1.1 基础知识1.2 包级变量的声明形式深入解析&#x1f4cc; 声明并同时显式初始化&#x1f4cc; 声明但延迟初始化&#x1f4cc; 声明聚类与就近原则 1.3 局部变量的声明形式深入探讨&#x1f4cc; 延迟初始化的…

你认识nginx吗,nginx是做什么的,nginx可以做什么 --1)nginx介绍

一.Nginx 介绍 Nginx&#xff08;发音同engine x&#xff09;是一个异步框架的 Web 服务器&#xff0c;也可以用作反向代理&#xff0c;负载平衡器 和 HTTP 缓存。该软件由 Igor Sysoev 创建&#xff0c;并于2004年首次公开发布。同名公司成立于2011年&#xff0c;以提供支持。…

PHP:集成Xunsearch生成前端搜索骨架

如果是安装宝塔&#xff0c;我们在集成xunsearch的时候就会比较简单&#xff0c;后面我们在介绍其他的接入方式&#xff1b; 首先我们进入到宝塔管理后台&#xff1a;【软件商店】-【输入xun】-【点击xunsearch】直接安装即可 安装成功之后&#xff0c;会自动在www/server中创…

大模型高级 RAG 检索策略:自动合并检索

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

比较3维空间中4个点的不同结构

在4*4*4的3维空间中&#xff0c;取4个点共有635376种可能&#xff0c;有209个结构&#xff0c;继续按旋转对称分类则只有55个不同的结构。如其中的4t12 4个点在同一个平面&#xff0c;有1个点与其中的3个点不在同一行也不在同一列&#xff0c;这样的位置不止一个 这两个结构都是…

ubuntu系统下安装mysql的步骤详解

一、下载安装包 下载地址&#xff1a; https://dev.mysql.com/downloads/repo/apt 跳转到这个页面&#xff1a; 直接点击Download。 直接点击最下面的开始下载安装包即可。 二、将安装包下载到ubuntu系统中 先将用户切换成root用户&#xff0c;把下载好的安装包复制到桌面上&…

丛林生存法则其实就两个字:输出

不管你是在上班&#xff0c;还是在灵活就业&#xff0c;现在的大环境下&#xff0c;你要想活下来&#xff0c;生存下去&#xff0c;一定要记住这两个字&#xff1a;输出。如果你能记住更多的字&#xff0c;那便是持续高水平的输出。 你如果是大厂程序员&#xff0c;你肯定发现…

Linux DHCP server 配置

参考&#xff1a;linux dhcp配置多vlan ip_linux 接口vlan-CSDN博客 配置静态IP地址&#xff1a; 给固定的MAC地址分配指定的IP地址&#xff0c;固定的IP地址不必包含在指定的IP池中&#xff0c;如果包含在IP地址池中&#xff0c;固定的IP地址会从IP地址池中移除 配置方法&…

清洁力强的洗地机前十名排行榜:2024十大洗地机热销款式好用不踩雷

如今&#xff0c;洗地机行业竞争激烈&#xff0c;各品牌紧紧抓住用户对智能化和深度清洁的需求&#xff0c;深入研究创新。经过几轮行业内部的激烈竞争后&#xff0c;许多厂商在宣传中各说各的&#xff0c;对洗地机的重要参数描述不一&#xff0c;给消费者的选择带来了不少困惑…

【CVPR_2024】:逐元素乘积为什么会产生如此令人满意的结果?

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言论文重写星形运算一层网络推广多层网络特殊情况 W 1 W_1 W1​和/或 W 2 W_2 W2​…

JDK版本特性(JDK8\11\17\21版本)

JDK版本特性 Oracle官网https://www.oracle.com/java/technologies/java-se-support-roadmap.html Oracle官网中JDK版本的说明&#xff0c;Java SE 8、11、17和21是LTS版本。也就是长期支持版本。 我们针对这几个版本了解学习下对应版本的新特性。 JDK8版本 正式发布于2014…

Facebook的创新实验室:人工智能与新技术探索

Facebook作为全球领先的社交媒体平台之一&#xff0c;一直在不断探索和应用最新的技术来改善用户体验、推动创新和拓展业务边界。其创新实验室更是探索人工智能&#xff08;AI&#xff09;和新技术的前沿&#xff0c;为未来的社交媒体发展开辟了新的可能性。本文将深入探讨Face…

【题解 | 分享】2023年十四届蓝桥杯国赛(Java B组)

互质 答案&#xff1a;640720414 参考&#xff1a; public class Main {static int mod 1000000007;public static void main(String[] args) {long sum power(2023, 2023);long p1 ((sum % mod) * power( 7, mod - 2)) % mod;long p2 ((sum % mod) * power( 17, mod -…

【ZYNQ】SCU 与 GIC

在多 CPU 架构中&#xff0c;处理器之间可以对共享数据进行操作。Snoop control uint (SCU) 模块用于确保每个处理器都在最新的数据拷贝上运行&#xff0c;从而保持缓存一致性。通用中断控制器 Generic interrupt controller (GIC) 使用优先级的思想&#xff0c;管理 CPU 中断信…