天天看點

vue元件化開發學習筆記-3-元件插槽

一,插槽的基礎概念

vue元件化開發學習筆記-3-元件插槽

在之前使用元件的時候,就是直接使用這個自定義的标簽,而沒有在裡面增加内容。

例如:

Vue.component('test-tom',{
				data:function(){return {num:0}},
				template:`
					<div>
						<div>TOM:{{num}}</div>
					</div>
				`
				})
			var vm= new Vue({
			    el:'#app'
			})
			
           
<div id="app">
			<test-tom>這裡沒有資訊</test-tom>
		</div>
           
vue元件化開發學習筆記-3-元件插槽

也就是這中間如果還想增加一些html結構,或者說是内容,則顯示不出來,為了解決這一問題,又出現了元件插槽的概念,實際上就是在模闆字元串中預留一個插槽,如果有額外的html結構,就可以插入到這裡。

Vue.component('test-tom',{
				data:function(){return {num:0}},
				template:`
					<div>
						<div>TOM:{{num}}</div>
						<slot></slot>
					</div>
				`
				})
			var vm= new Vue({
			    el:'#app'
			})
			
           
<div id="app">
			<test-tom>這裡沒有資訊</test-tom>
		</div>
           
vue元件化開發學習筆記-3-元件插槽

因為插槽是規定的,是以隻能用

值得注意的是,slot裡面還可以寫預設參數,也就是使用自定義标簽時,如果沒有參數,則頁面會顯示預設參數:

<div id="app">
			<test-tom></test-tom>
		</div>
		
		<script type="text/javascript" src="js/vue.min.js"></script>
		<script type="text/javascript">
			Vue.component('test-tom',{
				data:function(){return {num:0}},
				template:`
					<div>
						<div>TOM:{{num}}</div>
						<slot>這是定義的預設參數</slot>
					</div>
				`
				})
			var vm= new Vue({
			    el:'#app'
			})
			
		</script>
           
vue元件化開發學習筆記-3-元件插槽

二,具名插槽的用法

在上文中,如果有思考就會發現,插槽的作用讓元件可以增加一些自定義的html結構,以适應不同的業務需求,就像機械設計一樣,比如滾珠絲杠的設計,螺母上的法蘭有無,安裝孔的位置,就需要對應不同的客戶需求做出一定的變更。

但是,slot插槽存在巨大的局限性,它隻有一個!也就是說,隻能限定在固定的地方做出修改,這太low了,于是就有了具名插槽。

實際上模闆字元串中定義多個插槽,使用自定義标簽時,需要在哪個插槽中添加内容,就使用哪個插槽!

vue元件化開發學習筆記-3-元件插槽
<div id="app">
			<test-tom>
				<button slot="first">自行添加的按鈕,放在定義名字的slot中</button>
				這是定義的預設參數會放到不定義名字的slot中
			</test-tom>
		</div>
		
		<script type="text/javascript" src="js/vue.min.js"></script>
		<script type="text/javascript">
			Vue.component('test-tom',{
				data:function(){return {num:0}},
				template:`
					<div>
						
						<div>TOM:{{num}}</div>
						<slot></slot>
						<input type="text" />
						<slot name="first"><slot>
					</div>
				`
				})
			var vm= new Vue({
			    el:'#app'
			})
			
		</script>
           
vue元件化開發學習筆記-3-元件插槽

三,作用域插槽

vue元件化開發學習筆記-3-元件插槽
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<link rel="stylesheet" type="text/css" href="css/base.css"/>
		<style type="text/css">
			#app{
				width: 20%;
				margin: 200px auto;
				border: 1px solid #ccc;
				line-height: 30px;
				padding: 20px;
			}
		</style>
	</head>
	<body>
		<div id="app">
			<fruit-list :list="list">
				<template slot-scope='slotprops'>
					<!-- 通過template的slot-scope擷取 子元件傳過來的資料,存在slotprops對象中 -->
					<strong v-if='slotprops.info.id==3' class="current">{{slotprops.info.name}}</strong>
					<span v-else>{{slotprops.info.name}}</span>
				</template>
			</fruit-list>
		</div>
		
		<script type="text/javascript" src="js/vue.min.js"></script>
		<script type="text/javascript">
			Vue.component('fruit-list',{
				props:['list'],
				template:`
					<div>
						<li :key='item.id' v-for='item in list'>
							<slot :info='item'></slot>
						</li>
					</div>
				`
				//通過:info='item把資料傳遞給父元件
				})
			var vm= new Vue({
			    el:'#app',
				data:{
					list:[{
						id:1,
						name:'apple'
					},
					{
						id:2,
						name:'orange'
					},
					{
						id:3,
						name:'banana'
					}]
				}
			})
			
		</script>
	</body>
</html>