vue开发:vue的插槽功能讲解

news2025/2/26 15:01:22

vue的插槽

举一个生活中的例子:比如装修房子的时候我们会在很多地方预留出一些插孔,可能要插电冰箱,插电式,插充电器等,反正就是你觉得预留在这个位置的插座一定有用,这个预留的插座就类似我们今天要说的插槽,插槽就是你在模板中提前通过一个占位符(slot)来预言一块固定的区域将来会被某些元素替换掉,但是这个位置我得先预留出来。

在veu 2.6.0 中,具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令)。它取代了 slot 和 slot-scope 这两个目前已被废弃但未被移除且仍在文档中的 attribute。

插槽的基本使用

1、在组件中定义一个标签即可
2、如果插槽内具有共性的东西较多,可在插槽内设置默认值,当没有在插槽传入值时显示默认值
3、如果有多个值,同时放入到组件中进行替换时,一起作为替换元素

定义一个默认插槽

插槽的定义位置在组件中,所以首先我们得创建一个组件,再在这个组件中定义插槽,再使用!

<div id="app">
	<mainview></mainview>
</div>
    
<!-- 组件模板 -->
<template id="view">
	<div>
		<slot>
			<button type="button">插槽默认值</button>
        </slot>
    </div>
</template>
    
    <script type="text/javascript">
      var app = new Vue({
        el: "#app",
        components:{
          // view注册为一个局部组件
          mainview: {
            template: "#view"
          }
        }
      })
    </script>

在这里插入图片描述
运行这段代码我们会看到组件为我们渲染除了slot插槽里的默认内容,当然我们也可以不用设置默认内容,那么它将不会显示任何东西,那如何覆盖默认内容呢?只需要在组件中插入你需要显示的内容即可,如下:

<mainview>
	<button type="button" style="color: #42B983;">
		修改插槽
	</button>
</mainview>

改之后,我们可以看到渲染的内容已经变成了我们在 mainview 中定义的内容!

这就是插槽 一个基本使用,还是比较好理解的。但一般在实际项目中不会像 demo 一样简单直接。

通常情况下,一个页面设计非常复杂,需要在一个页面的不同位置放入不同的插槽内容。那么在这种情况下,我们就需要给插槽 指定一个具体的名称 name,使其具有具体匹配的特性,在 Vue 中把这种具有具体名称 name 的插槽叫做具名插槽。

具名插槽
现在,假设我们要做一个博客页面,这个页面分为三个部分头部header, 内容main,底部footer,这三个模块我们都通过插槽来实现!

<div id="app">
	<!-- 引用插槽 -->
	<base-layout>
		<template v-slot:header>
          <h1>这是头部header插槽内容</h1>
        </template>
        
        <template v-slot:default>
          <p>这是默认插槽的内容</p>
        </template>
        
        <template v-slot:footer>
          <p style="color: red;">这是footer插槽内容</p>
        </template>
        
      </base-layout>
</div>
    
    <!-- 定义组件间模板 -->
    <template id="layout">
      <div>
        <header>
          <!-- 定义具名插槽 -->
          <slot name="header"></slot>
        </header>
        <main>
          <slot></slot>
        </main>
        <footer>
          <slot name="footer"></slot>
        </footer>
      </div>
    </template>
    
    <script type="text/javascript">
      var app = new Vue({
        el: "#app",
        components:{
          // 局部注册组件
          BaseLayout: {
            template: "#layout"
          }
        }
      })
    </script>

以上案例中layout组建中定义了三个插槽,其中header和footer通过slot的name属性制定了插槽的名称,main用一个默认插槽填充,其中header和footer两个具名插槽会精确地匹配 name传入相应的插槽,任何没有被包裹在带有 v-slot 的 中的内容都会被视为默认插槽的内容。

注意: v-slot 只能添加在 上 ,并且可以缩写为一个#,即把参数之前的所有内容 (v-slot:) 替换为字符 #。例如 v-slot:header 可以被重写为 #header:

<template #header>
	<h1>这是头部header插槽内容</h1>
</template>

作用域插槽

vue的作用域插槽在2.6版本中有所改变,之前版本中使用的slot-scope命令已经废弃,统一成了v-slot方法。

<div id="app">
    <!-- 引入组件 -->
    <current-user></current-user>
</div>

<!-- 定义CurrentUser组件模板 -->
<template id="account">
    <div>
        <slot>
        	{{ user.LastName }}
        </slot>
    </div>
</template>

   <script type="text/javascript">
      var app = new Vue({
        el: "#app",
        components:{
          CurrentUser: {
            template:"#account",
            data:function(){
              return {
                user: {
                  fristName: "刘",
                  lastName: "德华"
                }
              }
            },
          }
        }
      })
    </script>

我们来看这个例子,首先我们定义了一个的组件,这个组件的模板中定义了一个默认插槽并设置了一个初始值{{ user.lastName }},运行这段代码会看到如期渲染除了组建中传入的lastName的值,但是有一天这个名字我不让显示了,只让显示一个姓就行了,我们知道插槽就是为了预定义一个区块,之后你想插入什么随你,但是要在父组件中调用子组件的frstName覆盖掉插槽默认传入的lastName要怎么做呢?这时候就是作用域插槽出场的时候了!

我们看作用域的概念发现里边总是提到作用域是一个有名字的代码范围,其实这在Vue的插槽表现形式中应该就是具名插槽,具名插槽要用到v-slot指令,v-slot又只能在template中使用。

首先,我们必须把子组件的user作为slot的元素属性通过v-bind绑定上去才可以,这个绑定在 元素上的 属性 (user)被称为插槽 prop。

<slot v-bind:user="user">
	{{ user.lastName }}
</slot>

现在在父级作用域中,我们可以使用带值的 v-slot 来定义我们提供的插槽 prop 的名字:

<div id="app">
	<current-user>
		<template v-slot:default="slotProps">
          {{ slotProps.user.fristName }}
        </template>    
	</current-user>
</div>

在这个例子中,我们选择将包含所有插槽 prop 的对象命名为 slotProps,但你也可以使用任意你喜欢的名字。

注意,如果当我们提供的组件模板中有且仅有一个默认插槽时,组件的标签可以被当做插槽的模板使用,简写为:

<current-user>
    <!-- 简写 -->
	<template v-slot="slotProps">
		{{ slotProps.user.fristName }}
	</template>    
</current-user>

但是,注意默认插槽的缩写语法不能和具名插槽混用,因为它会导致作用域不明确!

动态插槽

动态插槽依赖的是Vue2.6新增的动态参数概念,这里我大致说一下什么是动态参数:

<a v-bind:[attributeName]="url"> ... </a>

这个示例中用方括号括起来的 JavaScript 表达式作为一个指令的参数进行动态求值,求得的值将会作为最终的参数来使用!

这个动态的值可以通过方法,计算属性或者data里的数据作为内容,如下所示:

<base-layout>
  <template v-slot:[dynamicSlotName]>
    ...
  </template>
</base-layout>

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

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

相关文章

【C语言13】结构体的声明,定义与结构体的内存对齐

文章目录 一、结构体1.1结构体是什么1.2结构体声明1.3结构体的内存 以上便是结构体的介绍&#xff0c;如有不足&#xff0c;请多多指正&#xff01; 一、结构体 1.1结构体是什么 通俗的说&#xff0c;结构体就是一个类的集合&#xff0c;如同整形数组是整形数字的集合体&…

高数中的驻点以及要注意的事项

在高等数学中&#xff0c;驻点是指函数导数为零的点&#xff0c;即函数的极值点或拐点。在求解函数的最大值、最小值或拐点时&#xff0c;需要找到函数的驻点。 要注意以下几点&#xff1a; 1. 导数为零不一定是驻点&#xff1a;虽然驻点定义为函数导数为零的点&#xff0c;但…

力扣 | 双指针技巧

前文回顾&#xff1a;力扣 | 数组和字符串简介 力扣LeetBook&#xff1a;数组和字符串 文章目录 &#x1f4da;双指针技巧&#xff1a;情形一&#x1f449;反转字符串&#x1f449;数组拆分I&#x1f449;两数之和 II - 输入有序数组 &#x1f4da;双指针技巧&#xff1a;情形二…

基于智能手机的医院服务客户端设计与实现(论文+源码)_kaic

摘 要 近年来&#xff0c;随着中国经济的迅猛发展&#xff0c;医疗技术水平也在不断提高&#xff0c;但由于人口数目巨大&#xff0c;导致医疗资源人均分配不足的情况依旧十分严峻。预约挂号一直是制约医疗机构服务质量提高的主要环节之一。在传统预约挂号方式下&#xff0c;繁…

EMQ X(3):客户端websocket消息收发

在EMQ X Broker提供的 Dashboard 中 TOOLS 导航下的 Websocket 页面提供了一个简易但有效的WebSocket 客户端工具&#xff0c;它包含了连接、订阅和发布功能&#xff0c;同时还能查看自己发送和接收的报文数据&#xff0c;我们期望 它可以帮助您快速地完成某些场景或功能的测试…

ncm格式如何转换为mp3,分享几个方法!

你是否曾在网易云音乐上下载了一些NCM格式的音频文件&#xff0c;但发现无法在其他设备上播放&#xff1f;别担心&#xff0c;记灵在线工具可以帮助你将这些NCM格式转换为常见的MP3格式。今天小编就来分享三种方法&#xff0c;教你如何搞定&#xff01; 方法一&#xff1a;曲线…

C#学习之路-循环

有的时候&#xff0c;可能需要多次执行同一块代码。一般情况下&#xff0c;语句是顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了允许更为复杂的执行路径的多种控制结构。 循环语句允许我们多次执行一个…

Notepad++设置查看函数列表的快捷键

Notepad是一个非常精巧、启动便捷、支持文本自动补全的记事本软件&#xff0c;到2023年7月&#xff0c;已经更新到了v8.5.4版本&#xff0c;这里介绍设置其查看函数列表的快捷键方法。老版本的Notepad&#xff0c;比如Notepad v7.3, 默认查看函数列表的快捷键的为F8&#xff0c…

python PYQT5 键盘,鼠标,绘制,焦点,改变,输入法,事件的方法和使用例子

https://img-blog.csdnimg.cn/7630017d3ee444eab9bdedf8d48d575f.png from PyQt5.Qt import * import sys class MyQwidget(QWidget):def __init__(self):super().__init__()def showEvent(self, a0) -> None:print("窗口被展示出来",a0)def closeEvent(self,a0) …

网络编程4——传输层TCP协议的三大安全机制:三次握手四次挥手+确认应答机制+超时重传机制

文章目录 前言一、TCP协议段与机制TCP协议的特点TCP报头结构TCP协议的机制与特性 二、TCP协议的 连接管理机制 TCP建立连接&#xff1a;三次握手 TCP断开连接&#xff1a;四次挥手 三、TCP协议的 确认应答机制 四、TCP协议的 超时重传机制 总结 前言 本人是一个刚刚上路的I…

快速入门QT大法

QT大法 个人博客地址&#xff1a;https://zjxweb.github.io/#/ 1. 入门介绍 1.1 版本控制工具 svn vss git 1.2 QT 优点 跨平台接口接单&#xff0c;容易上手一定程度上简化了内存回收 2. 创建第一个QT程序 2.1 流程 点击创建项目后&#xff0c;选择项目路径以及给项目…

计算机体系结构基础知识介绍之指令集并行的基本编译器技术(循环展开、基本管道调度)

一、基本管道调度和循环展开 为了保持管道满载&#xff0c;必须通过查找可以在管道中重叠的不相关指令序列来利用指令之间的并行性。 为了避免流水线停顿&#xff0c;相关指令的执行必须与源指令分开一定的时钟周期距离&#xff0c;该距离等于该源指令的流水线延迟。 编译器执…

linux内核TCP/IP源码浅析

目录 数据接收流程图硬件层网络层ip_rcvip_rcv_coreip_rcv_finish 和 ip_rcv_finish_coreip_local_deliverip_local_deliver_finish 和 ip_protocol_deliver_rcu 传输层tcp_v4_rcvtcp_v4_do_rcvtcp_rcv_state_processtcp_rcv_establishedtcp_recvmsg 数据结构socketsocksock_co…

允许Traceroute探测漏洞和ICMP timestamp请求响应漏洞解决方法(三)

目录 服务器检测出了漏洞需要修改 1.允许Traceroute探测漏洞解决方法 2、ICMP timestamp请求响应漏洞 服务器检测出了漏洞需要修改 1.允许Traceroute探测漏洞解决方法 详细描述 本插件使用Traceroute探测来获取扫描器与远程主机之间的路由信息。攻击者也可以利用这些信息来…

Chapter 3: Conditional | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介Chapter 3: Conditional executionBoolean expressionsLogical operatorsConditional executionAlternative executionChained conditionalsNested conditionalsCatching exceptions using try and exceptShort-circuit evaluation of lo…

从零开始simulink自定义代码生成----自定义硬件驱动库文件(3)

文章目录 前言C mex文件mdlInitializeSizesmdlInitializeSampleTimesmdlOutputsmdlTerminatemdlRTWc文件结尾编译c文件 tlc文件Start函数Outputs函数模型及生成的代码 总结 前言 在很早的时候&#xff0c;做过一些Simulink自定义硬件驱动库的相关探索&#xff0c;但是后面没有…

惊喜!Alibaba架构师终于发布“微服务架构与实践”文档

前言&#xff1a; 对于微服务架构的概念&#xff0c;相信大家应该都不陌生&#xff0c;无论使用 Apache Dubbo、还是 Spring Cloud&#xff0c;都可以去尝试微服务&#xff0c;把复杂而庞大的业务系统拆分成一些更小粒度且独立部署的 Rest 服务。 但是这个过程&#xff0c;具…

单表查询练习

查看表的字符集编码 show create table tbname; 查看系统默认字符集 SHOW VARIABLES LIKE character_set_database; 显示所有可用的字符集 SHOW CHARACTER SET; 修改系统默认字符集 ①在 /etc/my.cnf 文件中的 [mysqld] 下添加&#xff1a; ②重启数据服务 systemctl re…

Linux:PXE网络装机

要实现需要开启以下服务 dhcp --- 开机没有u盘或光盘的引导电脑会去寻找网络中的引导 tftp --- 用于引导系统 ftp&& http --- 制作yum仓库让引导的系统去ftp或者http上找rpm包 1.ftp&& http yum仓库搭建 Linux&#xff1a;YUM仓库服务_鲍海超-GNUBHC…

Mycat【Mycat安全设置(SQL拦截白名单、SQL拦截黑名单、Mycat-web安装 )】(九)-全面详解(学习总结---从入门到深化)

目录 Mycat安全设置_user标签权限控制 Mycat安全设置_privileges标签权限控制 Mycat安全设置_SQL拦截白名单 Mycat安全设置_SQL拦截黑名单 Mycat性能监控_Mycat-web安装 Mycat性能优化 Mycat实施指南 Mycat安全设置_user标签权限控制 目前 Mycat 对于中间件的连接控制并…