使用Vue的slot插槽分發父組件內容實現高度複用、更加靈活的組件

寫在前面

以前寫過一篇關於vue實現dialog會話框組件的文章http://www.cnblogs.com/fozero/p/8546883.html, 講到了如何實現一個vue對話框組件,其中涉及到了父組件和子組件的通訊,這個不用多說,看我以前的文章就能明白,文章最後也說到了,咱們能夠使用 slot插槽來編寫組件,slot用來分發內容到子組件中,從而實現組件的高度複用,編寫的組件更加靈活。html

仍是結合對話框的例子,使用slot來實現對話框組件vue

註冊一個名叫dialog-tip的全局組件

Vue.component('dialog-tip', {
		    template: '#dialog-tip',
		    props:['dialogShow','message'],
		    data:function(){
                return {
                	content:''
                }
            },
            methods:{
            }
        });

使用templete標籤來定義這個組件

<template id="dialog-tip">
		<div class="dialog_tip" v-if="dialogShow">
			<div class="dialog_tip--mask"></div>
			<div class="dialog_tip--content">
				<div class="dialog_tip--content__txt">
					<slot name="msg">請輸入1-8000之間任意整數</slot>
				</div>
				<div class="dialog_tip--content__btns">
					<slot>
						<button class="btn">肯定</button>
						<button class="btn">從新輸入</button>
						<button class="btn">去註冊</button>
					</slot>
				</div>
			</div>
		</div>
	</template>

組件內容包括兩部分 ,一個是提示內容,一個是button按鈕,咱們將要修改替換的內容使用slot包含起來, 這樣父組件就能夠分發內容到子組件裏面了。ide

<div class="dialog_tip--content__txt">
					<slot name="msg">請輸入1-8000之間任意整數</slot>
				</div>
				<div class="dialog_tip--content__btns">
					<slot>
						<button class="btn">肯定</button>
						<button class="btn">從新輸入</button>
						<button class="btn">去註冊</button>
					</slot>
				</div>

除了默認插槽,還能夠定義具名插槽 ,若是組件中有好幾個部份內容須要替換,咱們能夠爲它定義一個name,例如:ui

<slot name="msg">請輸入1-8000之間任意整數</slot>

這樣在使用組件的時候,指定slot的name ,就會將這一部份內容替換掉,而不會替換其餘的插槽內容spa

<p slot="msg">請輸入正確手機號</p>

使用定義好的dialog組件

<dialog-tip message="hello" :dialog-show="dialogShow.tip3">
			<p slot="msg">請輸入正確手機號</p>
			<button class="btn" @click="closeDialogTip('tip3')">肯定</button>
		</dialog-tip>
		<dialog-tip message="hello" :dialog-show="dialogShow.tip4">
			<p slot="msg">抱歉,沒有此用戶,請覈實後輸入</p>
			<button class="btn" @click="closeDialogTip('tip4')">從新輸入</button>
			<button class="btn" @click="reg">去註冊</button>
		</dialog-tip>

若是不指定slot的名稱,默認dialog-tip標籤裏面的內容會替換子組件中使用slot包含的內容部分,例如以上code

使用slot指定了它的名稱來替換子組件中的對應的slot部分,而沒有使用slot指定名稱的內容會默認將子組件中 沒有定義具名插槽的部份內容替換掉。component

須要注意的是,若是dialog-tip標籤裏沒有定義須要分發的內容,那麼子組件中會顯示默認的插槽內容htm

關於更多的slot用法,請移步https://cn.vuejs.org/v2/guide/components-slots.htmlblog

最後

效果圖 ip

做者:fozero 聲明:原創文章,轉載請註明出處,謝謝!http://www.cnblogs.com/fozero/p/8974597.html 標籤:vue,slot

相關文章
相關標籤/搜索