最近在使用element-ui框架,用到了Dialog對話框組件,大體實現的效果,跟我以前本身在移動端項目裏面弄的一個彈窗組件差不太多。而後就想着把這種彈窗組件的實現方式與你們分享一下,下面本文會帶着你們手摸手實現一個彈窗組件。css
本文主要內容會涉及到彈窗遮罩的實現,slot
插槽的使用方式,props
、$emit
傳參,具體組件代碼也傳上去了。若是喜歡的話能夠點波贊/關注,支持一下,但願你們看完本文能夠有所收穫。html
我的博客瞭解一下:obkoro1.comvue
slot
插槽接受從父組件那裏傳過來彈窗內容。props
接收從父組件傳過來的彈窗寬度,上下左右的位置。props
控制組件的顯示與隱藏,子組件關閉時經過事件$emit
觸發父組件改變值。html結構:一層遮罩層,一層內容層,內容層裏面又有一個頭部title和主體內容和一個關閉按鈕。git
下面是組件中的html結構,裏面有一些後面纔要加進去的東西,若是看不懂的話能夠先跳過,github
<template>
<div class="dialog">
<!--外層的遮罩 點擊事件用來關閉彈窗,isShow控制彈窗顯示 隱藏的props-->
<div class="dialog-cover back" v-if="isShow" @click="closeMyself"></div>
<!-- transition 這裏能夠加一些簡單的動畫效果 -->
<transition name="drop">
<!--style 經過props 控制內容的樣式 -->
<div class="dialog-content" :style="{top:topDistance+'%',width:widNum+'%',left:leftSite+'%'}" v-if="isShow">
<div class="dialog_head back">
<!--彈窗頭部 title-->
<slot name="header">提示信息</slot>
</div>
<div class="dialog_main" :style="{paddingTop:pdt+'px',paddingBottom:pdb+'px'}">
<!--彈窗的內容-->
<slot name="main">彈窗內容</slot>
</div>
<!--彈窗關閉按鈕-->
<div class="foot_close" @click="closeMyself">
<div class="close_img back"></div>
</div>
</div>
</transition>
</div>
</template>
複製代碼
下面是組件中的主要的css樣式,裏面都作了充分的註釋,主要經過z-index
和background
達到遮罩的效果,具體內容的css能夠根據本身的需求來設置。web
<style lang="scss" scoped>
// 最外層 設置position定位
.dialog {
position: relative;
color: #2e2c2d;
font-size: 16px;
}
// 遮罩 設置背景層,z-index值要足夠大確保能覆蓋,高度 寬度設置滿 作到全屏遮罩
.dialog-cover {
background: rgba(0,0,0, 0.8);
position: fixed;
z-index: 200;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
// 內容層 z-index要比遮罩大,不然會被遮蓋,
.dialog-content{
position: fixed;
top: 35%;
// 移動端使用felx佈局
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
z-index: 300;
}
</style>
複製代碼
slot
定製彈窗內容這一步,只要理解了slot
的做用以及用法,就沒有問題了。element-ui
<slot>這是在沒有slot傳進來的時候,才顯示的彈窗內容</slot>
複製代碼
上面是單個插槽也叫默認插槽,在父組件中使用插槽的正確姿式:數組
<my-component>
<!--在my-component裏面的全部內容片斷都將插入到slot所在的DOM位置,而且會替換掉slot標籤-->
<!--這兩個p標籤,將替換整個slot標籤裏面的內容-->
<p>這是一些初始內容</p>
<p>這是更多的初始內容</p>
</my-component>
複製代碼
ps:若是子組件裏面包含slot
插槽,那麼上面的p標籤的內容將會被丟棄。框架
所謂的具名插槽,即爲slot
標籤賦一個name
屬性,具名插槽能夠父組件中不一樣的內容片斷放到子組件的不一樣地方,具名插槽仍是能夠擁有一個默認插槽。下面能夠看一下彈窗組件插槽的使用方式:ide
<div class="dialog_head back ">
<!--彈窗頭部 title-->
<slot name="header">提示信息</slot>
</div>
<div class="dialog_main " :style="{paddingTop:pdt+'px',paddingBottom:pdb+'px'}">
<!--彈窗的內容-->
<slot name="main">彈窗內容</slot>
</div>
複製代碼
在父組件中的使用方式:
將彈窗組件引入要使用的組件中,並經過components
註冊成爲組件。
父組件中彈窗組件插槽的使用方法以下。
<dialogComponent>
<div slot="header">插入到name爲header的slot標籤裏面</div>
<div class="dialog_publish_main" slot="main">
這裏是內容插入到子組件的slot的name爲main裏面,能夠在父組件中添加class定義樣式,事件類型等各類操做
</div>
</dialogComponent>
複製代碼
關於組件中用到的插槽的介紹就到這裏了,插槽在彈窗組件中的應用是一個典型的栗子,能夠看到插槽做用至關強大,而插槽自己的使用並不難,同窗們愛上插槽了沒有?
props
控制彈窗顯隱&&定製彈窗stylepsops
是Vue中父組件向子組件傳遞數據的一種方式,不熟悉的小夥伴們能夠看一下props文檔。
由於彈窗組件都是引到別的組件裏面去用的,爲了適合不一樣組件場景中的彈窗,因此彈窗組件必須具有必定的可定製性,不然這樣的組件將毫無心義,下面介紹一下props的使用方式,以彈窗組件爲例:
首先須要在被傳入的組件中定義props的一些特性,驗證之類的。
而後在父組件中綁定props數據。
<script>
export default {
props: {
isShow: {
//彈窗組件是否顯示 默認不顯示
type: Boolean,
default: false,
required:true, //必須
},
//下面這些屬性會綁定到div上面 詳情參照上面的html結構
// 如: :style="{top:topDistance+'%',width:widNum+'%'}"
widNum:{
//內容寬度
type: Number,
default:86.5
},
leftSite:{
// 左定位
type: Number,
default:6.5
},
topDistance: {
//top上邊距
type: Number,
default:35
},
pdt:{
//上padding
type: Number,
default:22
},
pdb:{
//下padding
type: Number,
default:47
}
},
}
</script>
複製代碼
父組件中使用方式:
<dialogComponent :is-show="status.isShowPublish" :top-distance="status.topNum">
</dialogComponent>
複製代碼
ps:props傳遞數據不是雙向綁定的,而是單向數據流,父組件的數據變化時,也會傳遞到子組件中,這就意外着咱們不該該在子組件中修改props。因此咱們在關閉彈窗的時候就須要經過$emit
來修改父組件的數據,而後數據會自動傳到子組件中。
如今基本上彈窗組件都已實現的差很少了,還差一個彈窗的關閉事件,這裏就涉及到子組件往父組件傳參了。
$emit
觸發父組件事件修改數據,關閉彈窗Vue中在子組件往父組件傳參,不少都是經過$emit
來觸發父組件的事件來修改數據。
在子組件中,在點擊關閉,或者遮罩層的時候觸發下面這個方法:
methods: {
closeMyself() {
this.$emit("on-close");
//若是須要傳參的話,能夠在"on-close"後面再加參數,而後在父組件的函數裏接收就能夠了。
}
}
複製代碼
父組件中的寫法:
<dialogComponent :is-show="status.isShowPublish" :top-distance="status.topNum" @on-close="closeDialog">
</dialogComponent>
//"on-close是監聽子組件的時間有沒有觸發,觸發的時候執行closeDialog函數
methods:{
closeDialog(){
// this.status.isShowPublish=false;
//把綁定的彈窗數組 設爲false便可關閉彈窗
},
}
複製代碼
能夠用彈窗組件實現下列這種信息展現,或者事件交互:
上面是把彈窗的每一個步驟拆分開來,一步步解析的,每一步都說的比較清楚了,具體連起來的話,能夠看看代碼,再結合文章就能理的很清楚了。
這個彈窗組件,實現起來一點都不難,我這裏主要是提供了一個實現方式,當項目中有須要的話,你們也能夠本身擼一個出來,以上就是本文的內容了,但願同窗們看完能有所收穫。
最後:如需轉載,請放上原文連接並署名。碼字不易,感謝支持!本人寫文章本着交流記錄的心態,寫的很差之處,不撕逼,可是歡迎指點。
以上2018.4.21