vue彈窗組件的使用(傳值),以及彈窗只能觸發(fā)一次的問題
vue彈窗組件的使用以及彈窗只能觸發(fā)一次
1.父組件引入并注冊子組件
import BusinessDialog from '../../components/BusinessDialog' export default { ? components: { ? ? BusinessDialog ? }, ? data() { ? ? return { ? ? ? dialog:false; ? ? }; ? },
2.在父組件中使用子組件
?<business-dialog :dialog.sync="dialog"></business-dialog> ?//這里的dialog就是要傳遞給子組件的值,默認是false(不彈出)
3.事件觸發(fā)改變dialog的值
openDialog() { ? ? ? this.dialog = true ? ? }, ? ? //在父組件中點擊編輯按鈕,觸發(fā)彈窗
以下是子組件的操作
export default { //子組件通過props接收父組件傳遞過來的值 dialog控制彈窗的彈出及隱藏 ? props: { ? ? dialog: { ? ? ? type: Boolean, ? ? ? default: false, ? ? }, ? }, ? data() { ? ? return { ? ? }; ? }, ? methods: { ? ? checkDate(val) {}, ? ? //解決彈窗只能彈一次的問題(點擊確定和取消按鈕的時候,給dialog做一個重新賦值) ? ? confirm() { ? ? ? this.$emit("update:dialog", false); ? ? }, ? ? cancle() { ? ? ? this.$emit("update:dialog", false); ? ? }, ?? ?//子組件傳值給父組件(onChange是傳遞給父組件的事件名, true是傳遞給父組件的值) ?? ?this.$emit('onChange',true) ? }, };
父組件怎么接收子組件傳的值呢?
<business-dialog :dialog.sync="dialog" @onChange="getData"></business-dialog> methods:{ getData(val) { ?? ?//這個val就是接收到的子組件傳遞過來的值啦~~~~ ?? ?} }
關于彈窗組件的優(yōu)化處理
在之前的項目中,發(fā)現(xiàn)很多頁面中有很多選擇各種數(shù)據(jù)的彈窗,如下:
一般來說,在vue的項目中寫成一個子組件,在父組件中引用即可。
問題在于
- 1.在父組件中要定義變量,什么時候展示該子組件
- 2.父子組件中的通信,父組件要定義方法傳給子組件調(diào)用
- 3.大量的父組件需要用到這個組件時,難免要重復上面的操作
于是,我想出一種思路,可不可以在父組件中通過調(diào)用方法的方式調(diào)用這個子組件,不需要在父組件中定義變量定義方法,省去一部分代碼,如下:
this.alertWbs(); // 打開上面的彈窗
具體思路如下
當調(diào)用這個方法的時候采用Vue.extend動態(tài)構建一個組件,具體代碼如下:
import Vue from 'vue'; import wbs from './wbs'; // 子組件 const Wbs = Vue.extend(wbs); var instance = null; // 這里做一個處理,只需要一個實例 export function alertWbs(){ if(!instance){ instance = new Wbs(); instance.$mount(); document.body.appendChild(instance.$el); } instance.projectAreaDialog = true; // 控制子組件自己的顯示 }
這樣以后,調(diào)用alertWbs方法以后,子組件會顯示出來。
那么還存在另外一個問題,當子組件中選擇完了數(shù)據(jù)以后如何告知父組件
思路:在點擊子組件按鈕的時候,通知父組件,我已經(jīng)選好數(shù)據(jù)了。
如何通知?
第一時間想到的是Promise,利用Promise的機制,當我點擊了子組件的按鈕時將數(shù)據(jù)通過resolve的方式推送給父組件,那么父組件里面的方法就可以寫成這樣
this.alertWbs().then(res=>{ console.log(res); // 此時傳過來的res應該就是子組件中選擇的數(shù)據(jù)了 })
那么,改造一下子組件,讓子組件返回一個Promise對象
import Vue from 'vue'; import wbs from './wbs'; const Wbs = Vue.extend(wbs); var instance = null; export function alertWbs(){ if(!instance){ instance = new Wbs(); instance.$mount(); document.body.appendChild(instance.$el); } instance.projectAreaDialog = true; return new Promise((resolve,reject)=>{ instance.promise = { // 將promise掛載到子組件實例上,因為目前為止,誰也不知道什么時候resolve數(shù)據(jù) resolve,reject } }) }
在wbs.vue文件中
choose(value){ this.promise.resolve(value); // 向父組件傳值 this.projectAreaDialog = false; // 改變自己的狀態(tài),隱藏 }
大功告成!??!
進一步優(yōu)化,父組件如何傳值給子組件呢?
在一個方法中,最容易想到的肯定是方法的參數(shù),改變一下父組件調(diào)用的方法
this.alertWbs(params).then(res=>{ console.log(res); // 此時傳過來的res應該就是子組件中選擇的數(shù)據(jù)了 })
子組件接受值
import Vue from 'vue'; import wbs from './wbs'; const Wbs = Vue.extend(wbs); var instance = null; export function alertWbs(params){ if(!instance){ instance = new Wbs(); instance.$mount(); document.body.appendChild(instance.$el); } instance.projectAreaDialog = true; instance.params = params; // 直接放在子組件的實例上 return new Promise((resolve,reject)=>{ instance.promise = { // 將promise掛載到子組件實例上,因為目前為止,誰也不知道什么時候resolve數(shù)據(jù) resolve,reject } }) }
當然為了讓子組件更加靈活,可以內(nèi)置一個鉤子函數(shù),當子組件顯示的時候自動調(diào)用,我這里用的是init方法,完整的代碼如下:
import Vue from 'vue'; import wbs from './wbs'; const Wbs = Vue.extend(wbs); var instance = null; export function alertWbs(){ if(!instance){ instance = new Wbs(); instance.$mount(); document.body.appendChild(instance.$el); } instance.projectAreaDialog = true; // init方法獲取頁面數(shù)據(jù) instance.init(); return new Promise((resolve,reject)=>{ instance.promise = { resolve,reject } }) }
init方法其實就是wbs.vue中的普通方法,需要定義
以上調(diào)用方法使用到的this,是由于該方法掛載在vue的原型對象上,不需要在每個組件中引用
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Vue項目全局配置頁面緩存之按需讀取緩存的實現(xiàn)詳解
這篇文章主要給大家介紹了關于Vue項目全局配置頁面緩存之實現(xiàn)按需讀取緩存的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧2018-08-08vue中使用過濾器filters的this為undefined的問題
這篇文章主要介紹了vue中使用過濾器filters的this為undefined的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Vue中實現(xiàn)表單地區(qū)選擇與級聯(lián)聯(lián)動示例詳解
這篇文章主要為大家介紹了Vue中實現(xiàn)表單地區(qū)選擇與級聯(lián)聯(lián)動示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09vue中Npm run build 根據(jù)環(huán)境傳遞參數(shù)方法來打包不同域名
這篇文章主要介紹了vue項目中Npm run build 根據(jù)環(huán)境傳遞參數(shù)方法來打包不同域名,使用npm run build --xxx,根據(jù)傳遞參數(shù)xxx來判定不同的環(huán)境,給出不同的域名配置,具體內(nèi)容詳情大家參考下本文2018-03-03