4.6 插槽

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script src="js/vue2.x.js"></script>
		<style>
			body{
				margin: 0;
				font-size: 14px;
			}
			h3{
				margin: 0;
			}
			.title{
				width: 1000px;
				padding: 0 20px;
				height: 50px;
				line-height: 50px;
				margin: 20px auto;
				background: #f4f0ea;
			}
			.title h3{
				float: left;
				font-size: 28px;
				margin-right: 20px;
			}
			.subtitle{
				float: left;
			}
			.more{
				float: right;
				margin-left: 30px;
			}
			.title a{
				color: #333;
				text-decoration: none;
			}
			.title a:hover,.title a.active{
				color: #b4a078;
				border-bottom: 2px solid #b4a078;;
			}
			.tab{
				float: left;
			}
			.subnav{
				float: right;
			}
		</style>
	</head>
	<body>
		<!-- <div class="title">
			<h3>新品首发</h3>
			<span class="subtitle">为你寻觅世间好物</span>
			<div class="tab">
				<a href="#" class="active">编辑推荐</a>
				<a href="#">热销总榜</a>
			</div>
			<div class="more">
				<a href="#">更多新品></a>
			</div>
			<div class="subnav">
				<a href="#">好物精选</a> / <a href="#">秋冬焕新</a> / <a href="#">疫情防控</a> / <a href="#">收纳好物</a> / <a href="#">北欧原木</a> / <a href="#">餐厨爆款清单</a> / <a href="#">厨房电器</a>
			</div>
		</div> -->

		<div id="app">
			<section-head>
				<!-- <h3>新品首发 - 这是通过插槽添加的内容</h3>	
				<h3>人气推荐 - 再来一个,也会显示</h3> -->
				<template v-slot:title>
					<h3>新品首发</h3>
				</template>
				<template #subtitle>
					<span class="subtitle">为你寻觅世间好物</span>
				</template>
				<template #more>
					<div class="more">
						<a href="#">更多新品></a>
					</div>
				</template>
			</section-head>

			
			<section-head>
				<!-- 即使这里的顺序变了也没关系,它只会按定义插槽地方的顺序解析 -->
				<template #more>
					<div class="more">
						<a href="#">更多推荐></a>
					</div>	
				</template>
				
				<template #title>
					<h3>人气推荐</h3>
				</template>
				<template #tab>
					<div class="tab">
						<a href="#" class="active">编辑推荐</a>
						<a href="#">热销总榜</a>
					</div>	
				</template>
			</section-head>


			<section-head>
				<template #title>
					<h3>福利社</h3>
				</template>
				<template #more class="more">
					<div class="more">
						<a href="#">查看全部福利></a>
					</div>	
				</template>
			</section-head>


			<section-head>
				<template #title>
					<h3>居家生活</h3>
				</template>
				<template #more class="more">
					<div class="more">
						<a href="#">查看更多></a>
					</div>	
				</template>
				<template #subnav>
					<div class="subnav">
						<a href="#">好物精选</a> / <a href="#">秋冬焕新</a> / <a href="#">疫情防控</a> / <a href="#">收纳好物</a> / <a href="#">北欧原木</a> / <a href="#">餐厨爆款清单</a> / <a href="#">厨房电器</a>
					</div>
				</template>
			</section-head>
		</div>

		<template id="head">
			<div class="title">
				<!-- <slot></slot> -->
				<slot name='title'></slot>
				<slot name='subtitle'></slot>
				<slot name='tab'></slot>
				<slot name='more'></slot>
				<slot name='subnav'></slot>
				<slot></slot>
			</div>
		</template>



		<script>
			new Vue({
				el:'#app',
				components:{
					SectionHead:{
						template:'#head',
					}
				}
			});
			/*
				1、这节课我们来学习插槽,先别说什么是插槽,我先来吐槽。有没有发现当你学一门新技术的时候总会有一些新名词新概念,有的还很奇葩。
					1、比如javascript有个名词叫弱类型语言,什么叫弱?是不行么?大家都知道做为男人最讨厌别人说不行,做为男人怎么能不行呢
					2、那你说人家js不行?你是来搞笑了的吧?所以有些词起的就想让人想抽它
				2、那vue里的插槽是啥意思,是插座里的孔么,天生就得被人插的?有些词真的太奇葩,起得让人浮想联翩,春心荡漾
				3、在正经介绍插槽前,我先通过一个小功能来让大家理解什么叫他妈的插槽。
				4、把网易严选打开you.163.com
					1、看每个标题,像么?但是结构有不一样的地方。像这样的功能我们往往都会做一个通用的
					2、那我问你,这里头不一样的结构你该怎么处理?是不是要把所有的结构都写出来,然后每个标题里需要哪个,你就添加哪个。没有的就不用给了
					3、比如大标题后面的一段小文本,你得写出来吧,第一个标题里有你就给。第二个标题里没有就不用给
					4、咱们上节课学习了props,那这种有差异的结构props如何传递数据?props要依赖相同的结构传递数据,结构不同它就没法传递数据了。那怎么办?用插槽
					5、插槽就可以来做这件事,在同样的结构里,使用插槽可以搞定差异结构
				5、来,正经的讲讲插槽
					1、插槽,英文名字叫slot,它的作用是用来分发内容,怎么分发呢?需要有个凭据才行。
					2、就像插线板一样,上面有三个孔的,有两个孔的,有一个孔的(usb)。厂家把能用到的孔都提供了,你买了一个,我也买了一个。你用了一个三个孔,我用了一个两个孔。
					3、那我问你,我能不能用三个孔,你能不能用两个孔?肯定是可以的吧,为啥?因为插板里有这些孔。但是我用不用取决了我需不需要
					4、这个就叫内容分发,分发的依据是什么呢?插孔。只有插板给你提供这个插孔了,你才可以用。没提供,不好意思你用不了
				6、我把插线板与标题功能结合到一起,你就能明白什么是插槽了
					1、标题会写成一个插件,一个标题的插件好比一个插线板
					2、标题里面的每个内容就好比插板里的每个插孔
					3、每个内容是不是不一样,那插孔的类型是不是也不同,有三个的,两个的,一个的
					4、标题组件在生成的时候就带了这些内容,插线板在出厂的时候已经有了这些不同的插孔
					5、使用标题组件生成“人气推荐”标题,它用了三个内容(大标题、选项卡标题、更多链接);好比你买了一个插线板,分别用了个三个孔、用了个两个孔、用了个一个孔。也是三个内容
					6、使用标题组件生成“福利社”标题,它用了两个内容(大标题、更多链接);好比我也买了一个插线板,分别用了个三个孔和一个孔
					7、问题来了,我能不能用两个孔(福利社组件里能不能显示选项卡标题)?当然可以,但是我不需要(福利社组件里不需要选项卡标题)
					8、这回明白什么是插槽了吧

				7、下面咱来上代码试试
					1、先写模板
						<template id="head">
							<div>
								<slot></slot>	
								//1、插槽用slot来表示,它是一个vue的内置组件(api最下面)
								//2、放到这表示这里代表了组件里的一块内容(大标题),渲染的时候它会被内容给替换掉
								//3、好比插线板里的一个孔。记住打孔是要在模板里做的
							</div>
						</template>
					2、有了插口后,怎么使用?先定义一个组件
						new Vue({
							el:'#app',
							components:{
								SectionHead:{
									template:'#head',
								}
							}
						});
					3、接下来调用组件,组件好了,标题的孔也打好了。现在就要用了,怎么用呢?把h3标签放到组件的标签对里面就行了
						<div id="app">
							<section-head>	//注意如果插槽没定义,组件标签里写的内容是不会被渲染的
								<h3>新品首发 - 这是通过插槽添加的内容</h3>	
								<h3>人气推荐 - 再来一个,也会显示</h3>
							</section-head>
						</div>
						1、不过这里有个问题,就是这个插槽跟标题其实并没关系。不信,我换成个更多的链接它照样显示
						2、其实插槽要这么写的话,它只是占了个坑,至于这个坑谁能蹲?没有要求,谁都可以蹲。注意啦!我这里特别要强调一下,你们不用脑补去那种地方蹲坑的场景!一定不要啊~
						3、而在真正开发当中是需要实名制的。你的坑只能你来蹲,别人是蹲不了的。就需要用到具名插槽
				8、具名插槽
					1、具名插槽就是给插槽起上个名字,实名制。在用的时候通过名字关联上,就一一对应了
					2、名字是通过slot的name属性添加的,加了这个后它就叫具名插槽了
					3、你在用的时候,需要通过template标签并配合#插槽名(指令,看一下api),把内容放到template标签对里就行了
						1、这个指令只能用在template和组件上,并且组件是有要求的,后面会说
					4、当v-slot指令(可以缩写为#)的值与slot的name一致的话,就对上眼了就能匹配了
					5、如果你用的时候没有给名字,那这个内容会显示到默认插槽上<slot></slot>
						1、把最后一个<section-head>里的#title去掉后瞧一下
						2、标题依然存在,但是显示到了最后面。删除前删除后对比一下html里的位置 
						3、如果想显示在默认的插槽上还可以显式的给一个default的值,给template的#default
							<template #default>
								<h3>居家生活</h3>
							</template>
						4、这么设置与不加v-slot是一样的,只不过更清晰意图更明确一点。其实
				9、最后拿插槽与props做个对比,插槽让组件使用起来更加像真正的HTML标签了,数据不需要通过属性传播,直接通过里面的标签进行传播
			 */

			/*
				slot		插槽,用于分发内容(是Vue的内部组件)
					语法:
						template里定义:<slot></slot>
						组件标签对里使用(标签对里的标签能被解析)

					注意:插槽只能写一个,写多个会报错

				具名插槽	给slot添加name属性后就叫具名插槽
					语法
						template里定义:<slot name="属性名"></slot>
						组件标签对里使用:<template #属性名><p></p></template>


				//在template里开个槽,给个名字(做个记号),在组件中根据记号填上数据并使用。其实就是在template中挖个坑,在组件里填点土,让组件能更像真正的html(所有的标签都可以大胆写出来了)
			 */
		</script>
	</body>
</html>

  插槽:1.模版定义具名插槽.  2.<template>按需使用插槽</template>

posted @ 2022-01-03 15:06  JavaShop  阅读(44)  评论(0)    收藏  举报