關(guān)于Promise在vue動態(tài)組件中的應(yīng)用

最近在寫項目的時候需要“在vue中動態(tài)生成一個彈出層”耸弄,查找資料的時候偶然發(fā)現(xiàn)了一個關(guān)于Promise的用法郊闯,如下:

showPopupFrame(){
  this.showPopupFrameBtnDisable = true
  this.$loginFrame().then(res=>{
    // resolve時執(zhí)行
    console.log(res)
  }).catch(err=>{
    // reject時執(zhí)行
    console.log(err)
  }).finally(()=>{
    // 無論結(jié)果如何都執(zhí)行
    this.showPopupFrameBtnDisable = false
  })
}

生成組件以后肌幽,調(diào)用組件的地方可以監(jiān)聽組件動向舌涨,并根據(jù)此做出不同的操作糯耍,非常適用于各種需要交互的彈窗

一、 Promise

??Promise是在es6(ECMAScript 6.0)中的新特性囊嘉,它是異步編程的一種解決方案谍肤。基本使用方法如下:

  // 定義一個Promise對象
  const wait = ms => {
    return new Promise((resolve,reject)=>{
        if(ms>10000){
          // 如果ms大于10000則提交錯誤哗伯,執(zhí)行catch
          reject(ms+'毫秒太多了荒揣!')
        }else{
          // 否則執(zhí)行then
          setTimeout(()=>{resolve(ms+'毫秒過去了...')},ms)
        }
    })
  }
  // 執(zhí)行catch
  wait(15000).then((res)=>{
    console.log('then')
    console.log(res)
  }).catch((err)=>{
    console.log('catch')
    console.log(err)
  })
  // 執(zhí)行then
  wait(2000).then((res)=>{
    console.log('then')
    console.log(res)
  }).catch((err)=>{
    console.log('catch')
    console.log(err)
  })

二、Vue動態(tài)加載組件

??先定義好template.vue前端文件焊刹,然后在一個js文件中封裝一些方法將它實例化為Vue.Component系任,就可以進(jìn)行動態(tài)加載了。

三虐块、demo

點擊按鈕俩滥,出現(xiàn)彈出層,同時將按鈕禁用

demo-彈出框示意

輸入數(shù)據(jù)贺奠,點擊提交霜旧,觸發(fā)提交事件,同時調(diào)用組件的方法也接收到了數(shù)據(jù)

demo-提交示意

點擊取消

demo-取消示意

四儡率、簡要實現(xiàn)

組件代碼

// component/dialog/login.vue
<template>
  <div class="login-frame">
    <div class="login-form">
      <label>
        賬號:<input v-model="account" type="text" placeholder="用戶名">
      </label><br/>
      <label>
        密碼:<input v-model="pwd" type="password">
      </label><br/>
      <button @click="cancel">取消</button>
      <button @click="submit">提交</button>
    </div>
  </div>
</template>

<script>
export default {
  name: "login.vue",
  data(){
    return {
      account:'',
      pwd:''
    }
  },
  methods:{
    cancel(){
      console.log('點擊了取消')
      //取消登錄 執(zhí)行fail
      this.$emit('fail')
      this.destroy()
    },
    submit(){
      console.log('點擊了登錄')
      //提交登錄 執(zhí)行success
      this.$emit('success',{
        account:this.account,
        password:this.pwd
      })
      this.destroy()
    },
    show(){
      document.body.append(this.$el)
    },
    destroy(){
      // 從頁面移除
      if (document.body.contains(this.$el)){
        document.body.removeChild(this.$el)
      }
    }
  }
}
</script>

<style scoped>
  .login-frame{
    position: fixed;
    top: 180px;
    width: 100%;
    margin: 0;
    padding: 0;
  }
  .login-form{
    width: 200px;
    margin: 0 auto;
    border: 1px solid red;
    background: #eee;
  }
</style>

組件封裝代碼

// component/dialog/loginFrame.js
import vue from 'vue'
import loginComponent from './login'
// 生成構(gòu)造方法
const loginConstructor = vue.extend(loginComponent)

let loginDom = null

const login = () => {
    if (loginDom!==null){
        loginDom.destroy()
        loginDom = null
    }
    // 創(chuàng)建
    loginDom = new loginConstructor({
        el:document.createElement('div')
    })
    // 附加到頁面
    loginDom.show()
    return new Promise((resolve,reject) => {
        // 若login.vue執(zhí)行success
        loginDom.$on('success',(form)=>{
            resolve(form)
        })
        // 若login.vue執(zhí)行fail
        loginDom.$on('fail',()=>{
            reject('用戶取消登錄')
        })
    })
}

export default login

在main.js中定義

import loginFrame from "@/components/dialog/loginFrame"

Vue.prototype.$loginFrame = loginFrame






如有錯誤挂据,歡迎指出,謝謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末儿普,一起剝皮案震驚了整個濱河市崎逃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌眉孩,老刑警劉巖个绍,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浪汪,居然都是意外死亡巴柿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門死遭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來广恢,“玉大人,你說我怎么就攤上這事殃姓≡ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵蜗侈,是天一觀的道長篷牌。 經(jīng)常有香客問我,道長踏幻,這世上最難降的妖魔是什么枷颊? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮该面,結(jié)果婚禮上夭苗,老公的妹妹穿的比我還像新娘。我一直安慰自己隔缀,他們只是感情好题造,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猾瘸,像睡著了一般界赔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牵触,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天淮悼,我揣著相機與錄音,去河邊找鬼揽思。 笑死袜腥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钉汗。 我是一名探鬼主播羹令,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼损痰!你這毒婦竟也來了特恬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤徐钠,失蹤者是張志新(化名)和其女友劉穎癌刽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尝丐,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡显拜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了爹袁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片远荠。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖失息,靈堂內(nèi)的尸體忽然破棺而出譬淳,到底是詐尸還是另有隱情档址,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布邻梆,位于F島的核電站守伸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏浦妄。R本人自食惡果不足惜尼摹,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剂娄。 院中可真熱鬧蠢涝,春花似錦、人聲如沸阅懦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耳胎。三九已至儿咱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間场晶,已是汗流浹背混埠。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诗轻,地道東北人钳宪。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像扳炬,于是被迫代替她去往敵國和親吏颖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容