最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue彈窗組件的使用(傳值),以及彈窗只能觸發(fā)一次的問(wèn)題

 更新時(shí)間:2023年05月22日 17:19:57   作者:猴子都會(huì)我不會(huì)  
這篇文章主要介紹了vue彈窗組件的使用(傳值),以及彈窗只能觸發(fā)一次的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

vue彈窗組件的使用以及彈窗只能觸發(fā)一次

1.父組件引入并注冊(cè)子組件

import BusinessDialog from '../../components/BusinessDialog'
export default {
? components: {
? ? BusinessDialog
? },
? data() {
? ? return {
? ? ? dialog:false;
? ? };
? },

2.在父組件中使用子組件

?<business-dialog :dialog.sync="dialog"></business-dialog>
?//這里的dialog就是要傳遞給子組件的值,默認(rèn)是false(不彈出)

3.事件觸發(fā)改變dialog的值

openDialog() {
? ? ? this.dialog = true
? ? },
? ? //在父組件中點(diǎn)擊編輯按鈕,觸發(fā)彈窗

以下是子組件的操作

export default {
//子組件通過(guò)props接收父組件傳遞過(guò)來(lái)的值 dialog控制彈窗的彈出及隱藏
? props: {
? ? dialog: {
? ? ? type: Boolean,
? ? ? default: false,
? ? },
? },
? data() {
? ? return {
? ? };
? },
? methods: {
? ? checkDate(val) {},
? ? //解決彈窗只能彈一次的問(wèn)題(點(diǎn)擊確定和取消按鈕的時(shí)候,給dialog做一個(gè)重新賦值)
? ? 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) {
?? ?//這個(gè)val就是接收到的子組件傳遞過(guò)來(lái)的值啦~~~~
?? ?}
}

關(guān)于彈窗組件的優(yōu)化處理

在之前的項(xiàng)目中,發(fā)現(xiàn)很多頁(yè)面中有很多選擇各種數(shù)據(jù)的彈窗,如下:

一般來(lái)說(shuō),在vue的項(xiàng)目中寫成一個(gè)子組件,在父組件中引用即可。

問(wèn)題在于

  • 1.在父組件中要定義變量,什么時(shí)候展示該子組件
  • 2.父子組件中的通信,父組件要定義方法傳給子組件調(diào)用
  • 3.大量的父組件需要用到這個(gè)組件時(shí),難免要重復(fù)上面的操作

于是,我想出一種思路,可不可以在父組件中通過(guò)調(diào)用方法的方式調(diào)用這個(gè)子組件,不需要在父組件中定義變量定義方法,省去一部分代碼,如下:

this.alertWbs();   // 打開(kāi)上面的彈窗

具體思路如下

當(dāng)調(diào)用這個(gè)方法的時(shí)候采用Vue.extend動(dòng)態(tài)構(gòu)建一個(gè)組件,具體代碼如下:

import Vue from 'vue';
import wbs from './wbs';                // 子組件
const Wbs = Vue.extend(wbs);
var instance = null;                     // 這里做一個(gè)處理,只需要一個(gè)實(shí)例
export function alertWbs(){
    if(!instance){
        instance = new Wbs();
        instance.$mount();
        document.body.appendChild(instance.$el);
    }
    instance.projectAreaDialog = true;      // 控制子組件自己的顯示
}

這樣以后,調(diào)用alertWbs方法以后,子組件會(huì)顯示出來(lái)。

那么還存在另外一個(gè)問(wèn)題,當(dāng)子組件中選擇完了數(shù)據(jù)以后如何告知父組件

思路:在點(diǎn)擊子組件按鈕的時(shí)候,通知父組件,我已經(jīng)選好數(shù)據(jù)了。

如何通知?

第一時(shí)間想到的是Promise,利用Promise的機(jī)制,當(dāng)我點(diǎn)擊了子組件的按鈕時(shí)將數(shù)據(jù)通過(guò)resolve的方式推送給父組件,那么父組件里面的方法就可以寫成這樣

this.alertWbs().then(res=>{
  console.log(res);    // 此時(shí)傳過(guò)來(lái)的res應(yīng)該就是子組件中選擇的數(shù)據(jù)了
})

那么,改造一下子組件,讓子組件返回一個(gè)Promise對(duì)象

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掛載到子組件實(shí)例上,因?yàn)槟壳盀橹?,誰(shuí)也不知道什么時(shí)候resolve數(shù)據(jù)
            resolve,reject
        }
    })
}

在wbs.vue文件中

choose(value){
   this.promise.resolve(value);            //  向父組件傳值
   this.projectAreaDialog = false;       // 改變自己的狀態(tài),隱藏
}

大功告成?。?!

進(jìn)一步優(yōu)化,父組件如何傳值給子組件呢?

在一個(gè)方法中,最容易想到的肯定是方法的參數(shù),改變一下父組件調(diào)用的方法

this.alertWbs(params).then(res=>{
  console.log(res);    // 此時(shí)傳過(guò)來(lái)的res應(yīng)該就是子組件中選擇的數(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;   // 直接放在子組件的實(shí)例上
    return new Promise((resolve,reject)=>{
        instance.promise = {       //  將promise掛載到子組件實(shí)例上,因?yàn)槟壳盀橹?,誰(shuí)也不知道什么時(shí)候resolve數(shù)據(jù)
            resolve,reject
        }
    })
}

當(dāng)然為了讓子組件更加靈活,可以內(nèi)置一個(gè)鉤子函數(shù),當(dāng)子組件顯示的時(shí)候自動(dòng)調(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方法獲取頁(yè)面數(shù)據(jù)
    instance.init();
    return new Promise((resolve,reject)=>{
        instance.promise = {
            resolve,reject
        }
    })
}

init方法其實(shí)就是wbs.vue中的普通方法,需要定義

以上調(diào)用方法使用到的this,是由于該方法掛載在vue的原型對(duì)象上,不需要在每個(gè)組件中引用

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue中的事件綁定舉例詳解

    vue中的事件綁定舉例詳解

    這篇文章主要給大家介紹了關(guān)于vue中事件綁定的相關(guān)資料,事件綁定在Web開(kāi)發(fā)中非常常見(jiàn),我們經(jīng)常需要在頁(yè)面中為某個(gè)DOM元素綁定事件,如點(diǎn)擊、鼠標(biāo)移動(dòng)、鍵盤敲擊等等,需要的朋友可以參考下
    2023-09-09
  • vue element實(shí)現(xiàn)多個(gè)Formt表單同時(shí)驗(yàn)證

    vue element實(shí)現(xiàn)多個(gè)Formt表單同時(shí)驗(yàn)證

    這篇文章主要介紹了vue element實(shí)現(xiàn)多個(gè)Formt表單同時(shí)驗(yàn)證方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Vue qiankun微前端實(shí)現(xiàn)詳解

    Vue qiankun微前端實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了Vue qiankun微前端實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • vue/cli3版本打包如何去掉soucemap文件

    vue/cli3版本打包如何去掉soucemap文件

    這篇文章主要介紹了vue/cli3版本打包如何去掉soucemap文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • vue調(diào)用語(yǔ)音播放的方法

    vue調(diào)用語(yǔ)音播放的方法

    這篇文章主要為大家詳細(xì)介紹了vue調(diào)用語(yǔ)音播放的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 在vue中使用jointjs的方法

    在vue中使用jointjs的方法

    本篇文章主要介紹了在vue中使用jointjs的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • VUE組件中的 Drawer 抽屜實(shí)現(xiàn)代碼

    VUE組件中的 Drawer 抽屜實(shí)現(xiàn)代碼

    這篇文章主要介紹了VUE組件 之 Drawer 抽屜 ,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Vue Router去掉url中默認(rèn)的錨點(diǎn)#

    Vue Router去掉url中默認(rèn)的錨點(diǎn)#

    vue-router默認(rèn)hash模式——使用URL的hash來(lái)模擬一個(gè)完整的URL,于是當(dāng)URL改變時(shí),頁(yè)面不會(huì)重新加載。這篇文章主要介紹了Vue Router去掉url中默認(rèn)的錨點(diǎn)#,需要的朋友可以參考下
    2018-08-08
  • vue中的base64圖片轉(zhuǎn)網(wǎng)絡(luò)URL方式

    vue中的base64圖片轉(zhuǎn)網(wǎng)絡(luò)URL方式

    在Vue中,可以直接將Base64編碼的圖片賦值給img元素的src屬性,此外,也可以通過(guò)JavaScript的URL.createObjectURL()方法將Base64轉(zhuǎn)換為Blob URL,進(jìn)而轉(zhuǎn)換為File對(duì)象,并可進(jìn)一步轉(zhuǎn)換為PNG或其他格式的圖片,這種轉(zhuǎn)換技術(shù)在前端開(kāi)發(fā)中非常實(shí)用
    2024-10-10
  • Vue實(shí)現(xiàn)萬(wàn)年日歷的示例詳解

    Vue實(shí)現(xiàn)萬(wàn)年日歷的示例詳解

    又是一個(gè)老生常談的功能,接下來(lái)會(huì)從零實(shí)現(xiàn)一個(gè)萬(wàn)年日歷,從布局到邏輯,再到隨處可見(jiàn)的打卡功能。文中的示例代碼簡(jiǎn)潔易懂,需要的可以參考一下
    2023-01-01

最新評(píng)論

台东市| 新密市| 平潭县| 江华| 弋阳县| 大兴区| 如皋市| 高雄市| 万安县| 湘潭市| 新余市| 开化县| 景泰县| 崇义县| 元阳县| 全州县| 横山县| 怀化市| 岳普湖县| 望都县| 靖安县| 锡林浩特市| 灵寿县| 安平县| 长子县| 富川| 济宁市| 兰考县| 大庆市| 衡阳县| 诏安县| 罗甸县| 北川| 秦安县| 周至县| 濉溪县| 托克托县| 鄂托克前旗| 青浦区| 九江县| 石楼县|