溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue中怎么實現(xiàn)一個模態(tài)框組件

發(fā)布時間:2021-07-09 11:01:44 來源:億速云 閱讀:168 作者:Leah 欄目:web開發(fā)

這期內容當中小編將會給大家?guī)碛嘘Pvue中怎么實現(xiàn)一個模態(tài)框組件,文章內容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

組件結構

<template>     <div class="modal" v-show="show" transition="fade">         <div class="modal-dialog">             <div class="modal-content">                 <!--頭部-->                 <div class="modal-header">                     <slot name="header">                         <p class="title">{{modal.title}}</p>                     </slot>                     <a v-touch:tap="close(0)" class="close" href="javascript:void(0)"></a>                 </div>                 <!--內容區(qū)域-->                 <div class="modal-body">                     <slot name="body">                         <p class="notice">{{modal.text}}</p>                     </slot>                 </div>                 <!--尾部,操作按鈕-->                 <div class="modal-footer">                     <slot name="button">                         <a v-if="modal.showCancelButton" href="javascript:void(0)" class="button {{modal.cancelButtonClass}}" v-touch:tap="close(1)">{{modal.cancelButtonText}}</a>                         <a v-if="modal.showConfirmButton" href="javascript:void(0)" class="button {{modal.confirmButtonClass}}" v-touch:tap="submit">{{modal.confirmButtonText}}</a>                     </slot>                 </div>             </div>         </div>     </div>     <div v-show="show" class="modal-backup" transition="fade"></div> </template>

模態(tài)框結構分為三部分,分別為頭部、內部區(qū)域和操作區(qū)域,都提供了slot,可以根據(jù)需要定制。

樣式

.modal {     position: fixed;     left: 0;     top: 0;     right: 0;     bottom: 0;     z-index: 1001;     -webkit-overflow-scrolling: touch;     outline: 0;     overflow: scroll;     margin: 30/@rate auto; } .modal-dialog {     position: absolute;     left: 50%;     top: 0;     transform: translate(-50%,0);     width: 690/@rate;     padding: 50/@rate 40/@rate;     background: #fff; } .modal-backup {     position: fixed;     top: 0;     right: 0;     bottom: 0;     left: 0;     z-index: 1000;     background: rgba(0, 0, 0, 0.5); }

這里只是一些基本樣式,沒什么好說的,這次項目是在移動端,用了淘寶的自適應布局方案,@rate是切稿時候的轉換率。

接口定義

/**  * modal 模態(tài)接口參數(shù)  * @param {string} modal.title 模態(tài)框標題  * @param {string} modal.text 模態(tài)框內容  * @param {boolean} modal.showCancelButton 是否顯示取消按鈕  * @param {string} modal.cancelButtonClass 取消按鈕樣式  * @param {string} modal.cancelButtonText 取消按鈕文字  * @param {string} modal.showConfirmButton 是否顯示確定按鈕  * @param {string} modal.confirmButtonClass 確定按鈕樣式  * @param {string} modal.confirmButtonText 確定按鈕標文字  */ props: ['modalOptions'], computed: {     /**      * 格式化props進來的參數(shù),對參數(shù)賦予默認值      */     modal: {         get() {             let modal = this.modalOptions;             modal = {                 title: modal.title || '提示',                 text: modal.text,                 showCancelButton: typeof modal.showCancelButton === 'undefined' ? true : modal.showCancelButton,                 cancelButtonClass: modal.cancelButtonClass ? modal.showCancelButton : 'btn-default',                 cancelButtonText: modal.cancelButtonText ? modal.cancelButtonText : '取消',                 showConfirmButton: typeof modal.showConfirmButton === 'undefined' ? true : modal.cancelButtonClass,                 confirmButtonClass: modal.confirmButtonClass ? modal.confirmButtonClass : 'btn-active',                 confirmButtonText: modal.confirmButtonText ? modal.confirmButtonText : '確定',             };             return modal;         },     }, },

這里定義了接口的參數(shù),可以自定義標題、內容、是否顯示按鈕和按鈕的樣式,用一個computed來做參數(shù)默認值的控制。

模態(tài)框內部方法

data() {     return {         show: false,   // 是否顯示模態(tài)框         resolve: '',         reject: '',         promise: '',  // 保存promise對象     }; }, methods: {     /**      * 確定,將promise斷定為完成態(tài)      */     submit() {         this.resolve('submit');     },     /**      * 關閉,將promise斷定為reject狀態(tài)      * @param type {number} 關閉的方式 0表示關閉按鈕關閉,1表示取消按鈕關閉      */     close(type) {         this.show = false;         this.reject(type);     },     /**      * 顯示confirm彈出,并創(chuàng)建promise對象      * @returns {Promise}      */     confirm() {         this.show = true;         this.promise = new Promise((resolve, reject) => {             this.resolve = resolve;             this.reject = reject;         });         return this.promise;   //返回promise對象,給父級組件調用     }, },

在模態(tài)框內部定義了三個方法,最核心部分confirm方法,這是一個定義在模態(tài)框內部,但是是給使用模態(tài)框的父級組件調用的方法,該方法返回的是一個promise對象,并將resolve和reject存放于modal組件的data中,點擊取消按鈕時,斷定為reject狀態(tài),并將模態(tài)框關閉掉,點確定按鈕時,斷定為resolve狀態(tài),模態(tài)框沒有關閉,由調用modal組件的父級組件的回調處理完成后手動控制關閉模態(tài)框。

調用

<!-- template --> <confirm v-ref:dialog :modal-options.sync="modal"></confirm> <!-- methods --> this.$refs.dialog.confirm().then(() => {     // 點擊確定按鈕的回調處理     callback();     this.$refs.dialog.show = false;  }).catch(() => {     // 點擊取消按鈕的回調處理     callback(); });

用v-ref創(chuàng)建一個索引,就很方便拿到模態(tài)框組件內部的方法了。這樣一個模態(tài)框組件就完成了。

其他實現(xiàn)方法

在模態(tài)框組件中,比較難實現(xiàn)的應該是點擊確定和取消按鈕時,父級的回調處理,我在做這個組件時,也參考了一些其實實現(xiàn)方案。

使用事件轉發(fā)

這個方法是我的同事實現(xiàn)的,用在上一個項目,采用的是$dispatch和$broadcast來派發(fā)或廣播事件。

首先在根組件接收dispatch過來的transmit事件,再將transmit事件傳遞過來的eventName廣播下去

events: {     /**      * 轉發(fā)事件      * @param  {string} eventName 事件名稱      * @param  {object} arg       事件參數(shù)      * @return {null}      */     'transmit': function (eventName, arg) {         this.$broadcast(eventName, arg);     } },

其次是模態(tài)框組件內部接收從父級組件傳遞過來的確定和取消按鈕所觸發(fā)的事件名,點擊取消和確定按鈕的時候觸發(fā)

// 接收事件,獲得需要取消和確定按鈕的事件名 events: {     'tip': function(obj) {         this.events = {             cancel: obj.events.cancel,             confirm: obj.events.confirm         }     } } // 取消按鈕 cancel:function() {     this.$dispatch('transmit',this.events.cancel); } // 確定按鈕 submit: function() {     this.$dispatch('transmit',this.events.submit); }

在父級組件中調用模態(tài)框如下:

this.$dispatch('transmit','tip',{     events: {         confirm: 'confirmEvent'     } }); this.$once('confirmEvent',function() {     callback(); }

先是傳遞tip事件,將事件名傳遞給模態(tài)框,再用$once監(jiān)聽確定或取消按鈕所觸發(fā)的事件,事件觸發(fā)后進行回調。

這種方法看起來是不是很暈?所以vue  2.0取消了$dispatch和$broadcast,我們在最近的項目中雖然還在用1.0,但是也不再用$dispatch和$broadcast,方便以后的升級。

使用emit來觸發(fā)

這種方法來自vue-bootstrap-modal,點擊取消和確定按鈕的時候分別emit一個事件,直接在組件上監(jiān)聽這個事件,這種做法的好處是事件比較容易追蹤。

// 確定按鈕 ok () {     this.$emit('ok');     if (this.closeWhenOK) {         this.show = false;     } }, // 取消按鈕 cancel () {     this.$emit('cancel');     this.show = false; },

調用:

<modal title="Modal Title" :show.sync="show" @ok="ok" @cancel="cancel">     Modal Text </modal>

上述就是小編為大家分享的vue中怎么實現(xiàn)一個模態(tài)框組件了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

vue
AI