Vue插槽详解
Vue插槽是Vue中常见的一种组件间的相互通信方式,作用是让父组件可以向子组件指定位置插入html结构,适用于父组件===>子组件,在要接收数据的组件页面通过<slot>标签来表示,简单来说,就是通过此标签来起到占位的作用,而要插入的内容也会对应到标签所在的位置。
默认插槽是插槽最基本的方式:
首先在父组件App.Vue中引入子组件,并在引入的子组件标签内插入需要的html元素,在子组件中把需要用插槽的地方用<slot>标签替代:
在App.vue中引入子组件,使用子组件,并且声明需要的数据:
1.引入组件:
import StudyM from './components/StudyM.vue'
2.使用组件:
<template>
<div id="app">
<!-- 默认插值 -->
<StudyM title="游戏列表">
<ul>
<li v-for="game , index in games" :key="index">{{game}}</li>
</ul>
</StudyM>
<StudyM title="推荐音乐">
<ul>
<li v-for="music , index in musics" :key="index">{{music}}</li>
</ul>
</StudyM>
<StudyM title="电影推荐">
<ul>
<li v-for="movie , index in movies" :key="index">{{movie}}</li>
</ul>
</StudyM>
</div>
</template>
3.添加数据:
data(){
return{
games:['英雄联盟', '炉石传说', '穿越火线', 'QQ飞车', '吃鸡'],
musics:['迷途羔羊', '红玫瑰', '富士山下', '麻雀', '妈妈的话', '故乡'],
movies:['蜘蛛侠', '复仇者联盟', '金刚狼', '触不可及', '唐人街探案','当幸福来敲门']
}
}
App.vue:
<template>
<div id="app">
<!-- 默认插值 -->
<StudyM title="游戏列表">
<ul>
<li v-for="game , index in games" :key="index">{{game}}</li>
</ul>
</StudyM>
<StudyM title="推荐音乐">
<ul>
<li v-for="music , index in musics" :key="index">{{music}}</li>
</ul>
</StudyM>
<StudyM title="电影推荐">
<ul>
<li v-for="movie , index in movies" :key="index">{{movie}}</li>
</ul>
</StudyM>
</div>
</template>
<script>
//引入组件
import StudyM from './components/StudyM.vue'
export default {
name: 'App',
components: {
StudyM
},
data(){
return{
games:['英雄联盟', '炉石传说', '穿越火线', 'QQ飞车', '吃鸡'],
musics:['迷途羔羊', '红玫瑰', '富士山下', '麻雀', '妈妈的话', '故乡'],
movies:['蜘蛛侠', '复仇者联盟', '金刚狼', '触不可及', '唐人街探案','当幸福来敲门']
}
}
}
</script>
<style scoped>
#app{
display: inline-flex;
justify-content: center;
}
</style>
StudyM.vue:
<template>
<div class="box">
<h4>{{title}}</h4>
<slot></slot>
</div>
</template>
<script>
export default {
name:'StudyM',
props:['title'],
}
</script>
<style scoped>
.box{
margin: 20px;
width: 200px;
height: 200px;
background-color: aqua;
}
h4{
text-align: center;
background-color: rgb(127, 236, 113);
}
</style>
此时,我们已经完成了默认插槽的使用:
效果图:
简单来说,所谓的具名插槽就是有名字的插槽
那它和默认插槽有什么不同呢?
有时候我们会遇到这种场景,在一个组件中,我们虽然可以复用组件的结构,但是往往,有时候我们会遇到一个组件多用,但是结构稍微有所差别的情况,这时,就会用得到具名插值。
首先在要插入html的部分需要用一个<template>标签包裹住各个部分:
<!-- 具名插槽的写法一 -->
<template slot="one">
<ul>
<li v-for="game , index in games" :key="index">{{game}}</li>
</ul>
</template>
其次,当给<template>标签绑定slot=“name” 属性时,需要在子组件中对应每个<template> 给出一个<slot> 并且添加上name属性:
<div class="box">
<h4>{{title}}</h4>
<slot name="one"></slot>
<slot name="tow"></slot>
</div>
App.vue:
<template>
<div id="app">
<!-- 默认插值 -->
<StudyM title="游戏列表">
<!-- 具名插槽的写法一 -->
<template slot="one">
<ul>
<li v-for="game , index in games" :key="index">{{game}}</li>
</ul>
</template>
<!-- 具名插槽的写法二 -->
<template v-slot:tow>
<a href="https://lol.qq.com/main.shtml">英雄联盟官网由此进入</a><br/><br>
<a href="https://www.wegame.com.cn/">了解更多游戏</a>
</template>
</StudyM>
<StudyM title="推荐音乐">
<template slot="one">
<ul>
<li v-for="music , index in musics" :key="index">{{music}}</li>
</ul>
</template>
<template slot="tow">
<button>点击进入QQ音乐</button>
<button>点击进入网易云音乐</button>
</template>
</StudyM>
<StudyM title="电影推荐">
<template slot="one">
<ul>
<li v-for="movie , index in movies" :key="index">{{movie}}</li>
</ul>
</template>
<template slot="tow">
<video controls src="https://www.oppo.com/content/dam/oppo/product-asset-library/find/find-n/v1/assets/tvc-preview-3d0357.mp4"></video>
</template>
</StudyM>
</div>
</template>
<script>
//引入组件
import StudyM from './components/StudyM.vue'
export default {
name: 'App',
components: {
StudyM
},
data(){
return{
games:['英雄联盟', '炉石传说', '穿越火线', 'QQ飞车', '吃鸡'],
musics:['迷途羔羊', '红玫瑰', '富士山下', '麻雀', '妈妈的话', '故乡'],
movies:['蜘蛛侠', '复仇者联盟', '金刚狼', '触不可及', '唐人街探案','当幸福来敲门']
}
}
}
</script>
<style scoped>
#app{
display: inline-flex;
justify-content: center;
}
video{
width: 100%;
}
</style>
StudyM.vue:
<template>
<div class="box">
<h4>{{title}}</h4>
<slot name="one"></slot>
<slot name="tow"></slot>
</div>
</template>
<script>
export default {
name:'StudyM',
props:['title'],
}
</script>
<style scoped>
.box{
margin: 20px;
width: 300px;
padding: 20px;
background-color: aqua;
}
h4{
text-align: center;
background-color: rgb(127, 236, 113);
}
</style>
此时,我们已经完成了具名插槽的使用
效果图如下:

值得注意的是,在具名插槽当中,我们不仅要使用到
<template>标签,而且还要在其中声明slot="name"属性,在子组件中的<slot>标签中接收传过来的name
数据在组件的自身,但根据数据生成的结构需要组件的使用者来决定,也就是说,作用域插槽的不同之处就在于,数据不在父组件身上,而是在子组件身上,且组件的结构和内容由父组件决定。作用域组件限定了组件内结构和数据的展示范围,以便在开发中我们可以根据一个组件而不断变换其中的内容和结构。
使用作用域插槽,数据在子组件中,需要通过数据绑定传给使用者插入html的部分:
<div class="box">
<h4>{{title}}</h4>
<!-- 把数据传给插入的html部分 -->
<slot :movies="movies"></slot>
</div>
此时,在使用者组件中,使用<template> 中的scope="Data"属性将数据传递过来:
<StudyM title="游戏列表">
<template scope="one">
<!-- 第一种结构 -->
<ul>
<li v-for="m,index in one.movies" :key="index">{{m}}</li>
</ul>
</template>
</StudyM>
App.vue:
<template>
<div id="app">
<!-- 默认插值 -->
<StudyM title="游戏列表">
<template scope="one">
<!-- 第一种结构 -->
<ul>
<li v-for="m,index in one.movies" :key="index">{{m}}</li>
</ul>
</template>
</StudyM>
<StudyM title="游戏列表">
<template scope="one">
<!-- 第二种结构 -->
<ol>
<li v-for="m,index in one.movies" :key="index">{{m}}</li>
</ol>
</template>
</StudyM>
<StudyM title="游戏列表">
<template scope="one">
<!-- 第三种结构 -->
<h4 v-for="m,index in one.movies" :key="index">{{m}}</h4>
</template>
</StudyM>
</div>
</template>
<script>
//引入组件
import StudyM from './components/StudyM.vue'
export default {
name: 'App',
components: {
StudyM
},
}
</script>
<style scoped>
#app{
display: inline-flex;
justify-content: center;
}
video{
width: 100%;
}
</style>
StudyM.vue:
<template>
<div class="box">
<h4>{{title}}</h4>
<!-- 把数据传给插入的html部分 -->
<slot :movies="movies"></slot>
</div>
</template>
<script>
export default {
name:'StudyM',
props:['title'],
data(){
return{
movies:['蜘蛛侠', '复仇者联盟', '金刚狼', '触不可及', '唐人街探案','当幸福来敲门']
}
}
}
</script>
<style scoped>
.box{
margin: 20px;
width: 300px;
padding: 20px;
background-color: aqua;
}
h4{
text-align: center;
background-color: rgb(127, 236, 113);
}
</style>
此时,我们已经完成了作用域插槽的使用:
效果图如下:

以上内容就是Vue中插槽的三种不同类型的用法,在理解起来的时候,作用域插槽是相对来说难理解的,希望能够对大家有用,若有不对或是理解有偏差可以私信我
别忘记点个赞,加个关注再走哟!!!
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su
参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍 介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。 内容有: ①:Hub模型的方法介绍 ②:服务器端代码介绍 ③:前端vue3安装并调用后端方法 ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke() 去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on
TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是
开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建
文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就
HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca
如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1. 创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1. 创建SpringBoot项目 打开IDEA,选择NewProject创建项目。 填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。 选择springboot版本以及需要的包,此处只选择了springweb。 此处需特别注意,若你使用的是jdk1
平时开发中我们经常会遇到这样的需求,在一个不限高度的盒子中会有很多内容,如果全部显示用户体验会非常不好,所以可以先折叠起来,当内容达到一定高度时,显示展开更多按钮,点击即可显示全部内容,先来看看效果图: 这样做用户体验瞬间得到提升,接下来看看具体细节。0">主要操作在内容这里{{item.username}},……展开更多样式大家可依据自己项目需求进行设计,这里就不贴了,主要说几个关键的。1、在data中定义三个属性isShowMore:false, //控制展开更多的显示与隐藏textHeight:null, //框中内容的高度status:false, //内容状态是否打开2.计算内容是否
前言上一篇我们简要讲述了粒子系统是什么,如何添加,以及基本模块的介绍,以及对于曲线和颜色编辑器的讲解。从本篇开始,我们将按照模块结构讲解下去,本篇主要讲粒子系统的主模块,该模块主要是控制粒子的初始状态和全局属性的,以下是关于该模块的介绍,请大家指正。目录前言本系列提要一、粒子系统主模块1.阅读前注意事项2.参考图3.参数讲解DurationLoopingPrewarmStartDelayStartLifetimeStartSpeed3DStartSizeStartSize3DStartRotationStartRotationFlipRotationStartColorGravityModif