当前位置: 首页 > news >正文

vue -- 组件插槽 默认插槽 具名插槽 作用域插槽

组件插槽

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

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

默认插槽

如果没有插入对应的内容 我们需要显示一个默认的内容
我们可以插入普通的内容 html元素 组件都是可以的

下面展示了怎么设置插槽内容是一个按钮 超链接 图片 。。。
在 ShowMessage.vue中

<template>
	<div class="content">
		<slot>
			<p>我是默认内容</p>
		</slot>
	</div>
</template>

在app.vue中

<template>
	<div class="app">
		<!-- 内容是一个按钮button -->
		<show-message title="哈哈">
			<button>我是按钮元素</button>
		</show-message>

		<!-- 内容是一个超链接 -->
		<show-message>
			<a href="#">百度</a>
		</show-message>

		<!-- 内容是一张图片 -->
		<show-message>
			<img src="@/assets/logo.png" alt="">
		</show-message>

		<!-- 内容没有传递 -->
		<show-message></show-message>
	</div>
</template>

<script>
import ShowMessage from './ShowMessage.vue';
export default {
	components: {
		ShowMessage
	}
}
</script>

<style scoped>

</style>

具名插槽

当我们希望插槽对应的显示 这时候我们就可以使用具名插槽
具名插槽就是给插槽起一个名字 < slot >元素有一个特殊的attribute:name
一个不带name的slot 会带有隐含的名字default

在NavBar.vue中

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

在app.vue中

	<nav-bar>
		<template v-slot:left>
			<button>{{leftText}}</button>
		</template>
		<template v-slot:center>
			<span>内容</span>
		</template>
		<template v-slot:right>
			<a href="#">连接</a>
		</template>
	</nav-bar>

动态插槽名
1.目前我们使用的插槽名称都是固定的
2.比如 v-slot:left v-slot:center等
3.我们可以通过 v-slot:[name]方式动态绑定一个名称

<template>
	<nav-bar>
		<template v-slot:[position]>
		</template>
	</nav-bar>
</template>
<script>
import NavBar from './NavBar.vue'
export default{
	data(){
		return {
			position:'center'	
		}
	],
	components:{
		NavBar
	}
}
</script>

具名插槽使用的时候缩写
与v-on 于 v-bind一样 v-slot也有缩写
即把参数之前的所有内容(v-slot:)替换为#

	<nav-bar>
		<template #left>
			<button>{{leftText}}</button>
		</template>
		<template #center>
			<span>内容</span>
		</template>
		<template #right>
			<a href="#">连接</a>
		</template>
	</nav-bar>

渲染作用域

在vue中有渲染作用域的概念
父级模板里的所有内容都是在父级作用域中编译的
子模板里的所有内容都在子作用域中编译的

例如 对于自身data中的属性 是可以通过{{}}访问到 当时在插槽中是不能访问的

作用域插槽

但是有时候我们希望插槽可以访问到子组件中的内容
1.当一个组件被用来渲染一个数组元素时 我们使用插槽 并且希望插槽中没有显示每项内容
2.Vue给我们提供了作用域插槽
在这里插入图片描述如果我们的插槽是默认插槽default,那么在使用的时候 v-slot:default="slotProps"可以简写为v-slot=“slotProps”
在这里插入图片描述
并且如果我们的插槽只有默认插槽时,组件的标签可以被当做插槽的模板来使用,这样,我们就可以将 v-slot 直接用在组件上
在这里插入图片描述

作用域插槽的案例

<template>
	<div class="tab-control">
		<template v-for="(item,index) in titles" :key="item">
			<div class="tab-control-item" @click="itemClick(index)" :class="{active:index === currentIndex}">
				<slot :item2="item" abc="cba">
					<span>
						{{item}}
					</span>
				</slot>
			</div>
		</template>
	</div>
</template>

<script>
export default {
	emits: ["tabItemClick"],
	props: {
		titles: {
			type: Array,
			default: () => []
		}
	},
	data() {
		return {
			currentIndex: 0
		}
	},
	methods: {
		itemClick(index) {
			this.currentIndex = index
			this.$emit('tabItemClick', index)
		}
	}
}
</script>

<style scoped>
.tab-control {
	display: flex;
	height: 44px;
	line-height: 44px;
	text-align: center;
}

.tab-control-item {
	flex: 1
}

.tab-control-item.active {
	color: red;
	font-weight: 700;
}

.tab-control-item.active span {
	border-bottom: 3px solid red;
	padding: 8px;
}
</style>
<template>
	<div class="app">
		<!-- 1 tab-control -->
		<tab-control :titles="['衣服','鞋子','裤子']" @tab-item-click="tabItemClick"></tab-control>

		<h1>{{pageContents[currentIndex]}}</h1>

		<tab-control :titles="['衣服','鞋子','裤子']" @tab-item-click="tabItemClick">
			<!-- 独占默认插槽的简写 -->
			<template v-slot="props">
				<button>{{props.item2}}</button>
			</template>
		</tab-control>

		<tab-control :titles="['衣服','鞋子','裤子']" @tab-item-click="tabItemClick">
			<template #default="props">
				<a href="#">{{props.item2}}</a>
			</template>
		</tab-control>
		<tab-control v-slot="props" :titles="['衣服','鞋子','裤子']" @tab-item-click="tabItemClick">
			<a href="#">{{props.item2}}</a>
		</tab-control>

	</div>
</template>

<script>
import TabControl from './TabControl.vue';
export default {
	components: {
		TabControl
	},
	data() {
		return {
			pageContents: ["衣服列表", "鞋子列表", "裤子列表"],
			currentIndex: 0
		}
	},
	methods: {
		tabItemClick(index) {
			console.log(index);
			this.currentIndex = index
		}
	}
}
</script>

<style lang="scss" scoped>

</style>

相关文章:

  • [附源码]Java计算机毕业设计SSM高校教材管理系统
  • asp.net园林绿化服务交易网站
  • 网络精通-VRRP+MSTP
  • 无需专业设备和技能修复AOC显示器
  • Google Earth Engine APP——在线计算23类植被指数app代码
  • R语言---Ubuntu中R语言更新至R4.2.1和R包devtools下载
  • 笔试强训48天——day9
  • 什么是盒子模型中的边框
  • 2022海德堡桂冠论坛(HLF)见闻录
  • 动态规划-状态压缩、树形DP问题总结
  • AD936x_IIO Oscilloscope基本使用技巧
  • 【小刘带你玩儿前端】什么是跨域以及如何解决?小刘带你轻松拿彻底解决~
  • 大数据必学Java基础(八十五):自定义注解
  • 跨平台应用开发进阶(四十二)vue与nvue页面设计方案探究
  • Pytorch的加速和优化
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • angular学习第一篇-----环境搭建
  • crontab执行失败的多种原因
  • FineReport中如何实现自动滚屏效果
  • JAVA并发编程--1.基础概念
  • Java超时控制的实现
  • Linux快速复制或删除大量小文件
  • Promise面试题,控制异步流程
  • 从零开始在ubuntu上搭建node开发环境
  • 工作手记之html2canvas使用概述
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 前端性能优化--懒加载和预加载
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 在Unity中实现一个简单的消息管理器
  • 找一份好的前端工作,起点很重要
  • elasticsearch-head插件安装
  • 关于Android全面屏虚拟导航栏的适配总结
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (分布式缓存)Redis分片集群
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (五)c52学习之旅-静态数码管
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET HttpWebRequest、WebClient、HttpClient
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET开发者必备的11款免费工具
  • 。Net下Windows服务程序开发疑惑
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [2021 蓝帽杯] One Pointer PHP
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [C和指针].(美)Kenneth.A.Reek(ED2000.COM)pdf
  • [github全教程]github版本控制最全教学------- 大厂找工作面试必备!
  • [Godot] 3D拾取