【前端-VUE+TS】Vue3组件化-下(五)

一. 插槽的使用

1.1. 认识插槽slot

在开发中,我们会经常封装一个个可复用的组件:

  • 前面我们会通过props传递给组件一些数据,让组件来进行展示;
  • 但是为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定的div、span等等这些元素;
  • 比如某种情况下我们使用组件希望组件显示的是一个按钮,某种情况下我们使用组件希望显示的是一张图片;
  • 我们应该让使用者可以决定某一块区域到底存放什么内容;

举个栗子:假如我们定制一个通用的导航组件 - NavBar

  • 这个组件分成三块区域:左边-中间-右边,每块区域的内容是不固定;
  • 左边区域可能显示一个菜单图标,也可能显示一个返回按钮,可能什么都不显示;
  • 中间区域可能显示一个搜索框,也可能是一个列表,也可能是一个标题,等等;
  • 右边可能是一个文字,也可能是一个图标,也可能什么都不显示;

京东导航

这个时候我们就可以来定义插槽slot:

  • 插槽的使用过程其实是抽取共性、保留不同;
  • 我们会将共同的元素、内容依然在组件内进行封装;
  • 同时会将不同的元素使用slot作为占位,让外部决定到底显示什么样的元素;

如何使用slot呢?

  • Vue中将 <slot> 元素作为承载分发内容的出口;
  • 在封装组件中,使用特殊的元素<slot>就可以为封装组件开启一个插槽;
  • 该插槽插入什么内容取决于父组件如何使用;

1.2. 插槽的使用

1.2.1. 插槽的基本使用

我们一个组件MySlotCpn.vue:

  • 该组件中有一个插槽,我们可以在插槽中放入需要显示的内容;

	<template>
	    <div>
	        <h2>MySlotCpn开始</h2>
	        <slot></slot>
	        <h2>MySlotCpn结尾</h2>
	    </div>
	</template>

我们在App.vue中使用它们:

  • 我们可以插入普通的内容、html元素、组件元素,都可以是可以的;
<template>
	<div>
	    <my-slot-cpn>
	        <!-- 1.普通的内容 -->
	        Hello World
	        <!-- 2.html元素 -->
	        <button>我是按钮</button>
	        <!-- 3.组件元素 -->
	        <my-button></my-button>
	    </my-slot-cpn>
	</div>
</template>

1.2.2. 插槽的默认内容

有时候我们希望在使用插槽时,如果没有插入对应的内容,那么我们需要显示一个默认的内容:

  • 当然这个默认的内容只会在没有提供插入的内容时,才会显示;

插槽的默认值

1.2.3. 具名插槽的使用

我们先测试一个知识点:如果一个组件中含有多个插槽,我们插入多个内容时是什么效果?

  • 我们会发现默认情况下每个插槽都会获取到我们插入的内容来显示;

多个插槽的效果

事实上,我们希望达到的效果是插槽对应的显示,这个时候我们就可以使用 具名插槽

  • 具名插槽顾名思义就是给插槽起一个名字,<slot> 元素有一个特殊的 attribute:name;
  • 一个不带 name 的slot,会带有隐含的名字 default

<template>
	<div class="nav-bar">
	    <div name="left">
	        <slot></slot>
	    </div>
	    <div name="center">
	        <slot></slot>
	    </div>
	    <div name="right">
	        <slot></slot>
	    </div>
	</div>
</template>

在向具名插槽提供内容的时候,我们可以在一个 <template> 元素上使用 v-slot 指令,并以 v-slot 的参数的形式提供其名称:

<template>
	<div>
	    <nav-bar>
	        <template v-slot:left>
	            <button>左边按钮</button>
	        </template>
	        <template v-slot:center>
	            <h2>中间标题</h2>
	        </template>
	        <template v-slot:right>
	            <i>右边i元素</i>
	        </template>
	    </nav-bar>
	</div>
</template>

插槽的使用过程如下:

具名插槽的使用

动态插槽名:

  • 目前我们使用的插槽名称都是固定的;
  • 比如 v-slot:leftv-slot:center等等;
  • 我们可以通过 v-slot:[dynamicSlotName]方式动态绑定一个名称;

动态插槽名

具名插槽使用的时候缩写:

  • 跟 v-on 和 v-bind 一样,v-slot 也有缩写;
  • 即把参数之前的所有内容 (v-slot:) 替换为字符 #

<template>
	<div>
	    <nav-bar>
	        <template #left>
	            <button>左边按钮</button>
	        </template>
	        <template #center>
	            <h2>中间标题</h2>
	        </template>
	        <template #right>
	            <i>右边i元素</i>
	        </template>
	    </nav-bar>
	</div>
</template>

二. 作用域插槽

2.1. 渲染作用域

在Vue中有渲染作用域的概念:

  • 父级模板里的所有内容都是在父级作用域中编译的;
  • 子模板里的所有内容都是在子作用域中编译的;

如何理解这句话呢?我们来看一个案例:

  • 在我们的案例中ChildCpn自然是可以让问自己作用域中的title内容的;
  • 但是在App中,是访问不了ChildCpn中的内容的,因为它们是跨作用域的访问;

案例作用域访问

2.2. 作用域插槽

但是有时候我们希望插槽可以访问到子组件中的内容是非常重要的:

  • 当一个组件被用来渲染一个数组元素时,我们使用插槽,并且希望插槽中没有显示每项的内容;
  • 这个Vue给我们提供了作用域插槽;

我们来看下面的一个案例:

  • 1.在App.vue中定义好数据
  • 2.传递给ShowNames组件中
  • 3.ShowNames组件中遍历names数据
  • 4.定义插槽的prop
  • 5.通过v-slot:default的方式获取到slot的props
  • 6.使用slotProps中的item和index

作用域插槽的案例

具体的代码如下:

App.vue代码:

<template>
	<div>
	    <show-names :names="names">
	        <template v-slot:default="slotProps">
	            <span>{{slotProps.item}}-{{slotProps.index}}</span>
	        </template>
	    </show-names>
	</div>
</template>
	
<script>
import ShowNames from './ShowNames.vue';
	
export default {
	components: {
	ShowNames,
    },
    data() {
	    return {
	        names: ["why", "kobe", "james", "curry"]
	    }
	}
}
</script>

ShowNames.vue代码:

<template>
	<div>
	    <template v-for="(item, index) in names" :key="item">
	        <!-- 插槽prop -->
	        <slot :item="item" :index="index"></slot>
	    </template>
	</div>
</template>
	
<script>
export default {
	props: {
	    names: {
	        type: Array,
	    default: () => []
	    }
	}
}
</script>

2.3. 独占默认插槽

如果我们的插槽是默认插槽default,那么在使用的时候 v-slot:default="slotProps"可以简写为v-slot="slotProps"

<show-names :names="names">
	<template v-slot="slotProps">
	    <span>{{slotProps.item}}-{{slotProps.index}}</span>
	</template>
</show-names>

并且如果我们的插槽只有默认插槽时,组件的标签可以被当做插槽的模板来使用,这样,我们就可以将 v-slot 直接用在组件上:

<show-names :names="names" v-slot="slotProps">
	<span>{{slotProps.item}}-{{slotProps.index}}</span>
</show-names>

但是,如果我们有默认插槽和具名插槽,那么按照完整的template来编写。

默认插槽和具名插槽

只要出现多个插槽,请始终为所有的插槽使用完整的基于 <template> 的语法:

完整的template写法

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

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

相关文章

STM32F407ZGT6——实验9-4 通用定时器脉冲计数实验

一、配置路线 二、问题及反思 配置的时候误以为需要先把【输入捕获配置】了再去配置【从模式】&#xff0c;后面验证了这样配置没办法产生预期的效果。 代码如下&#xff1a;void gtim_timx_cnt_chy_init(uint16_t psc, uint16_t arr) void gtim_timx_cnt_chy_init(uint16_t…

MyBatis 源码系列:MyBatis 解析配置文件、二级缓存、SQL

文章目录 解析全局配置文件二级缓存解析解析二级缓存缓存中的调用过程缓存中使用的设计模式 解析SQL 解析全局配置文件 启动流程分析 String resource "mybatis-config.xml"; //将XML配置文件构建为Configuration配置类 reader Resources.getResourceAsReader(re…

【3分钟开服】幻兽帕鲁服务器一键部署保姆教程

在帕鲁的世界&#xff0c;你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活&#xff0c;也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活&#xff0c;也可以为你在工厂工作。你也可以将它们进行售卖&#xff0c;或肢解后食用。 引用自&#x…

脚本实现两台windows 机器间多个目录中文件同步到某个特定的目录里

脚本实现两台windows 机器间多个目录中文件同步到某个特定的目录里 要求&#xff1a;将172.20.26.74 中的test1、test2文件夹里的文件都同步到172.20.26.87机器上的t1文件夹里。 1、两台机器&#xff0c;关闭防火墙&#xff0c;能相互ping通&#xff0c;在172.20.26.87机器上将…

Windows编程入门-窗口控件-资源操作

window控件&#xff1a; 控件是常见的窗口上的交互元素例如&#xff1a;一个按钮&#xff0c;一个复选框&#xff0c;一个列表框等。 当控件的特定功能被触发后&#xff0c;会主动发送消息通知父窗口&#xff0c;父窗口可以通过发送消息给控件控制控件的行为。 控件的本质是一个…

Utreexo:优化Bitcoin UTXO集合的基于哈希的动态累加器

1. 引言 前序博客&#xff1a; Utreexo&#xff1a;比特币UTXO merkle tree proof以节约节点存储空间 MIT Digital Currency Initiative 的 Thaddeus Dryja 2019年论文 Utreexo: A dynamic hash-based accumulator optimized for the Bitcoin UTXO set。 开源代码实现见&…

Kafka 记录

推荐资源 官网http://kafka.apache.org/Githubhttps://github.com/apache/kafka书籍《深入理解Kafka 核心设计与实践原理》 Kafka 架构 Kafka使用ZooKeeper作为其分布式协调框架&#xff0c;其动态扩容是通过ZooKeeper来实现的。Kafka使用Zookeeper保存broker的元数据和消费者信…

使用流服务器m7s对接gb28181

优&#xff1a;sip品牌兼容性比较好&#xff0c;大华&#xff0c;海康都稳定可以&#xff0c;srs的5.0 sip品牌兼容性大华没反应&#xff0c;akstream-sip 大华也有问题&#xff0c;wvp也还可以 缺&#xff1a;目前最新的4.7.4版本&#xff0c;&#xff0c;sip协议用udp正常&a…

年底特殊时期外贸装柜多花点心思

如果可以&#xff0c;尽量不要在工厂快要放假的时候安排装柜了&#xff0c;一个是人手不够&#xff0c;一个是容易漏货&#xff0c;还有就是柜子不好定。 看到有人说自己客户收到货的时候比预期晚了两个星期&#xff0c;一直延误&#xff0c;已经比原来要计划开业的时间推迟&a…

mini-spring 实现应用上下文,自动识别、资源加载、扩展机制

我们不能让面向 Spring 本身开发的 DefaultListableBeanFactory 服务&#xff0c;直接给予用户使用 DefaultListableBeanFactory、XmlBeanDefinitionReader&#xff0c;是我们在目前 Spring 框架中对于服务功能测试的使用方式&#xff0c;它能很好的体现出 Spring 是如何对 xm…

Cocos creator 动作系统

动作系统简介 是用于控制物体运动的一套系统&#xff0c;完全依赖代码进行实现&#xff0c;动态调节节点的移动。 移动 cc.moveTo 移动到某个坐标&#xff08;x,y&#xff09; //1秒时间内&#xff0c;移动到0,0let action1 cc.moveTo(1,0,0)this.node.runAction(action1)c…

Walrus 实用教程|Walrus + Gitlab,打通CI/CD 自动化交付!

Walrus file 是 Walrus 0.5 版本推出的新功能&#xff0c;用户可以通过一个非常简洁的 YAML 描述应用或基础设施资源的部署配置&#xff0c;然后通过 Walrus CLI 执行 walrus apply或在 Walrus UI 上进行import&#xff0c;将 Walrus file 提交给 Walrus server&#xff0c;由 …

Qt简易的五子棋

五子棋是个简单的小游戏&#xff0c;尝试使用Qt将他做出来&#xff0c;学习时的练习demo。 成果展示 需求分析 五子棋&#xff1a;在棋盘上&#xff0c;黑棋先行&#xff0c;交替下棋&#xff0c;五子练成直线获取胜利。 实现过程 1.棋盘绘制&#xff1a;下棋的第一步肯定是绘制…

7000字详解Spring Boot项目集成RabbitMQ实战以及坑点分析

本文给大家介绍一下在 Spring Boot 项目中如何集成消息队列 RabbitMQ&#xff0c;包含对 RibbitMQ 的架构介绍、应用场景、坑点解析以及代码实战。 我将使用 waynboot-mall 项目作为代码讲解&#xff0c;项目地址&#xff1a;https://github.com/wayn111/waynboot-mall。本文大…

无需 Root 卸载手机预装软件,精简过的老年机又行了

基础准备 准备目标手机、USB 数据线、以及一台电脑。手机 USB 连接电脑&#xff0c;开发者选项中打开 USB 调试。&#xff08;开发者选项默认隐藏&#xff0c;需要在关于手机中多次点击版本号才能调出&#xff09;。 安装手机驱动&#xff0c;下载安装 ADB 工具包。 开始操作…

世界坐标系转换为平面地图坐标

将世界坐标系转换为平面地图坐标的方法通常涉及地图投影。地图投影是一种将地球(一个三维球体)上的点转换为平面(二维)地图上的点的方法。 这里介绍几种常见的地图投影方法: 墨卡托投影(Mercator Projection): 这是最常见的投影方式之一,尤其用于航海地图。它将经纬度…

3D数据转换器HOOPS Exchange如何获取模型的几何数据? 干货预警!

一、概述 前面讲解过模型在内存中的结构&#xff0c;现在回顾一下&#xff0c;当模型导入成功后&#xff0c;整个模型数据会以原生结构的 PRC 组装树形式存放到内存中。&#xff08;申请 HOOPS Exchange 试用&#xff09; PRC结构的主要类型包含四种&#xff0c;分别是…

Pipwork相关测试过程

pipework可以减轻docker实施过程中的工作量&#xff0c;在网上也找了几篇类似的文章&#xff0c;按照相应配置&#xff0c;结果并不相同 如下测试过程记录下&#xff1a; docker run -it --rm --name c1 busybox docker run -it --rm --name c2 busyboxpipework br1 c1 192…

数据结构:大顶堆、小顶堆

堆是其中一种非常重要且实用的数据结构。堆可以用于实现优先队列&#xff0c;进行堆排序&#xff0c;以及解决各种与查找和排序相关的问题。本文将深入探讨两种常见的堆结构&#xff1a;大顶堆和小顶堆&#xff0c;并通过 C 语言展示如何实现和使用它们。 一、定义 堆是一种完…