日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

用vue实现模态框组件

發布時間:2023/12/20 vue 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用vue实现模态框组件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基本上每個項目都需要用到模態框組件,由于在最近的項目中,alert組件和confirm是兩套完全不一樣的設計,所以我將他們分成了兩個組件,本文主要討論的是confirm組件的實現。

組件結構

<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><!--內容區域--><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>

模態框結構分為三部分,分別為頭部、內部區域和操作區域,都提供了slot,可以根據需要定制。

樣式

.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?模態接口參數*?@param?{string}?modal.title?模態框標題*?@param?{string}?modal.text?模態框內容*?@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進來的參數,對參數賦予默認值*/????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;},}, },

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

模態框內部方法

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

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

調用

<!--?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創建一個索引,就很方便拿到模態框組件內部的方法了。這樣一個模態框組件就完成了。

其他實現方法

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

使用事件轉發

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

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

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

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

//?接收事件,獲得需要取消和確定按鈕的事件名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); }

在父級組件中調用模態框如下:

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

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

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

使用emit來觸發

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

//?確定按鈕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>

但是我們在使用的時候經常會遇到這樣的場景,在一個組件的內部,經常會用到多個對話框,對話框可能只是文字有點區別,回調不同,這時就需要在template中為每個對話框都寫一次,有點麻煩。



本文轉自 sshpp 51CTO博客,原文鏈接:http://blog.51cto.com/12902932/1950350,如需轉載請自行聯系原作者

總結

以上是生活随笔為你收集整理的用vue实现模态框组件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。