天天看點

Vue(五)插槽的使用

插槽分三種:普通插槽、具名插槽、作用域插槽

普通插槽

普通插槽的使用主要通過

<slot></slot>

标簽使用。代碼如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>插槽的使用</title>
		<script src="vue.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div id="app">
			//未使用插槽
			<com></com>
			<hr color="red">
			//使用插槽
			<com><button type="button">插槽中放入按鈕</button></com>
		</div>
		
		<template id="com">
			<div id="">
				<button type="button">左邊按鈕</button>
				<p>中間文字</p>
				<slot></slot>
			</div>	
		</template>
		
		<script type="text/javascript">
			new Vue({
				el: '#app',
				components:{
					com:{
						template:'#com'
					}
				}
			})
		</script>
	</body>
</html>
           

結果如下圖,當使用插槽的時候可以在使用同一個Vue元件(component)的情況下在插槽位置放入不同的标簽,如:程式中的按鈕标簽。

Vue(五)插槽的使用

具名插槽

在同一個Vue元件(component)中,放入多個插槽,在使用元件時,如何判斷放入的标簽是哪個插槽中的呢?此時可以使用具名插槽。

代碼如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>插槽的使用</title>
		<script src="vue.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div id="app">
			<!-- 未在插槽中放入相應的标簽,使用預設值 -->
			<com></com>
			<hr color="red">
			<!-- 僅改變中間的插槽,左右插槽此時使用預設值 -->
			<com><span slot="center">僅改變中間的插槽</span></com>
			<hr color="#0000FF">
			<!-- 插槽全部更改 -->
			<com>
				<button type="button" slot="left">左邊換為按鈕</button>
				<span slot="center">改變中間</span>
				<img src="3.gif" slot="right">
			</com>
		</div>
		
		<template id="com">
			<div id="">
				<slot name="left"><span>左邊</span></slot>
				<slot name="center"><span>中間</span></slot>
				<slot name="right"><span>右邊</span></slot>
			</div>	
		</template>
		
		<script type="text/javascript">
			new Vue({
				el: '#app',
				components:{
					com:{
						template:'#com'
					}
				}
			})
		</script>
	</body>
</html>
           

在上述代碼中

<slot name="right"><span>右邊</span></slot>

意為此插槽預設是

<span>右邊</span>

标簽,在使用Vue元件時不添加标簽時,使用插槽中預設的标簽。該插槽添加

name

屬性,可以在使用時作為區分(區分在那個插槽中添加标簽),使用時代碼如:

<com><span slot="center">僅改變中間的插槽</span></com>

。程式運作結果如下圖:

Vue(五)插槽的使用

作用域插槽

作用域插槽是為了讓同一Vue元件表現為不同的形式。(可以看作父元件提供插槽中表現形式,而Vue元件中提供資料),代碼如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>作用域插槽</title>
		<script src="vue.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div id="app">
			<!-- 插槽的預設形式 -->
			<com></com>
			<hr color="red">
			<!-- 更換插槽内标簽 -->
			<com>
				<template slot-scope="slotdata">
					<!-- 接收Vue元件傳出的值值是用slotdata.data -->
					<span>{{slotdata.data.join(' —— ')}}</span>
				</template>
			</com>
		</div>
		
		<template id="com">
			<div id="">
				<!-- 将mydata的值傳出 -->
				<slot :data="mydata">
					<ul>
						<li v-for="item in mydata">{{item}}</li>
					</ul>
				</slot>
			</div>
		</template>
		
		<script type="text/javascript">
			var com = {
				template:'#com',
				data(){
					return {
						mydata:['C', 'C++', 'Java', 'JavaScript', 'html', 'Python']
					}
				}
			}
			
			new Vue({
				el:'#app',
				components:{
					com
				}
			})
		</script>
	</body>
</html>
           

上述代碼實作了Vue元件的兩種形式,一種是預設的,另一種是通過

slot

插槽實作的。結果如下圖:

Vue(五)插槽的使用

第一種是預設的,第二種是自定義的。

在程式中要想将Vue元件的私有資料傳出,需要在

slot

标簽中添加屬性,如:

<slot :data="mydata"></slot>

其中“data”是可以自定義的名稱,而“mydata”是資料源。

父元件接收資料時利用如下方式:

<com>
	<template slot-scope="slotdata">
		<!-- 接收Vue元件傳出的值值是用slotdata.data -->
		<span>{{slotdata.data.join(' —— ')}}</span>
	</template>
</com>
           

com

是自定義的Vue元件,在其中使用Vue的

template

标簽(

template

标簽在Vue2.5.x版本一下時必須要用,在Vue2.5.x以上版本時不是必須的),在

template

标簽中使用

slot-scope

屬性來接收子元件的資料。并通過

slotedata.data

來得到子元件的資料。(**注意:**其中

slotdata

是自定義的名稱,而

data

也是自定義的名稱,但要與子元件中的

slot

标簽屬性中定義的相同)