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

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.hqwc.cn/news/15827.html

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

相关文章

Meta为全天候AR眼镜设计了AI系统的八大指导方针

众所周知&#xff0c;Meta不仅局限在Quest这类VR头显上&#xff0c;同时还在打造更轻量化的AR眼镜&#xff0c;目标就是让产品更好的融入到人们的日常生活中去。除了硬件上轻量化以外&#xff0c;在功能和交互体验上也至关重要&#xff0c;例如自然交互方式&#xff0c;比如手势…

【算法】十大排序算法以及具体用例算法题

文章目录 1:冒泡排序2:选择排序3:插入排序4:希尔排序5:堆排序6:计数排序7:基数排序8:快速排序9:归并排序10:桶排序 源代码下载 1:冒泡排序 /** 冒泡排序是内部排序* 冒泡排序将会每一次都从头开始遍历* 每一次遍历都会把最大的数据放到最后一个* 因此每一次都可以少遍历一个元…

透彻理解 UART 通信的基本方法

UART是一种异步全双工串行通信协议&#xff0c;由 Tx 和 Rx 两根数据线组成&#xff0c;因为没有参考时钟信号&#xff0c;所以通信的双方必须约定串口波特率、数据位宽、奇偶校验位、停止位等配置参数&#xff0c;从而按照相同的速率进行通信。 异步通信以一个字符为传输单位…

MySQL性能瓶颈定位慢查询

目录 1 性能优化的思路2 引言3 MySQL慢查询日志3.1 慢查询参数3.2 开启慢查询日志&#xff08;临时&#xff09;3.3 开启慢查询日志&#xff08;永久&#xff09;3.4 慢查询测试 4 MySQL性能分析 EXPLAIN4.1 概述4.2 EXPLAIN字段介绍4.2.1 id字段4.2.2 select_type 与 table字段…

mac苹果电脑,怎么把mkv转换mp4格式

mac苹果电脑&#xff0c;怎么把mkv转换mp4格式&#xff1f;如果你是一名mac苹果电脑的用户&#xff0c;在电脑上下载到mkv格式的视频后会发现它使用起来非常的麻烦&#xff0c;甚至不能直接打开播放。mkv其实也是一种时间比较久远的视频文件格式&#xff0c;但是不知道是什么原…

责任链模式

责任链模式 概述优缺点应用场景Java 代码示例Spring 代码示例场景一场景二场景三 概述 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它通过将请求的发送者和接收者解耦&#xff0c;使多个对象都有机会处理请求。在这个…

RabbitMQ ---- 消息队列

RabbitMQ ---- 消息队列 1. MQ 的相关概念1.1 什么是 MQ1.2 为什么要用 MQ1.3 MQ 的分类1.4 MQ 的选择 2. RabbitMQ2.1 RabbitMQ 的概念2.2 四大核心概念2.3 RabbitMQ 核心部分2.4 各个名词介绍2.5 安装 1. MQ 的相关概念 1.1 什么是 MQ MQ(message queue)&#xff0c;从字面…

ARM架构(寄存器点灯)

文章目录 前言一、LED原理图二、使用寄存器点灯的步骤三、如何操作寄存器四、实际操作1.使能GPIO端口2.将引脚设置为输出模式3.设置输出状态 五、全部代码总结 前言 本篇文章我们来讲解一下如何使用寄存器点亮一个LED灯&#xff0c;一般对于新人来说都是使用HAL库或者标准库来…

Vue3 Diff 算法简易版

背景 学习一下Vue3中的diff算法~ 逻辑概述 这个算法的过程不算太复杂&#xff1a; 同时从新旧列表的头部遍历&#xff0c;找出相同的节点&#xff0c;则patch&#xff0c;否则就停止遍历&#xff1b;同时从新旧列表的尾部遍历&#xff0c;找出相同的节点&#xff0c;则patc…

ASM Java字节码操作框架入门学习 输出Hello World

ASM Java字节码操作框架入门学习 输出Hello World 1.类信息 package org.example;public class Hello {public void say(){System.out.println("hello world");}}查看字节码信息 //动态设置栈大小ClassWriter classWriter new ClassWriter(ClassWriter.COMPUTE_FR…

在vscode中配置git bash终端

将以下配置添加到vscode中的settings.json中 "terminal.integrated.profiles.windows": {"PowerShell": {"source": "PowerShell","icon": "terminal-powershell"},"Command Prompt": {"path"…

Vue3+Vite 项目配置 vue-router,并完成路由模块化

前言 我的技术栈&#xff1a;Vue3 Vite TypeScirpt我的包管理工具&#xff1a;pnpm&#xff08;v8.6.6&#xff09;我的 node.js 版本&#xff1a;v16.14.0 一、安装vue-router pnpm install vue-router二、创建页面 在 /src/views 文件夹下创建 home、login、test文件夹…