成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

vue組件實戰:開發一個加載Button組件–LoadingButton

本篇文章手把手帶大家開發一個超實用的vue加載Button組件–LoadingButton,希望對大家有所幫助。

vue組件實戰:開發一個加載Button組件--LoadingButton

組件背景

在平時的工作中,經常會遇到一個場景:

vue組件實戰:開發一個加載Button組件--LoadingButton

點擊按鈕時請求一些接口數據,而為了避免用戶重復的點擊我們通常會為這些按鈕添加loading。這個添加loading的功能本身時非常簡單的,只要我們定義一個變量使用在Button組件中即可,但在做后臺管理類項目時,這樣的按鈕可能會有非常非常多,可能一個組件中,很多變量都是xxx_loading,耗時耗力又不夠優雅。

接下來,我們對Button組件做一個簡單的封裝來解決這個耗時耗力又不夠優雅的loading問題。(學習視頻分享:vue視頻教程)

靈感來源

我們在使用Antd的Modal對話框時,當我們的onOk異步函數時,此時Modal的確定按鈕會自動添加loading效果,在函數執行完成后關閉彈窗,就像這樣:

vue組件實戰:開發一個加載Button組件--LoadingButton

此時,代碼如下:

asyncFunc() {   return new Promise(resolve => {     setTimeout(() => {       resolve()     }, 2000)   }) }, handleTestModal() {   const that = this   this.$confirm({     title: '測試異步函數',     content: '異步函數延遲兩秒結束',     async onOk() {       await that.asyncFunc()     }   }) },

看到這種效果后,就想到,如果可以封裝一個Button組件,將需要執行的函數傳入,組件中自動根據函數執行情況添加loading效果豈不是非常的方便。

實現LoadingButton

定義組件參數

這邊就定義幾個大家會常用到的參數:text(按鈕文字)type(按鈕類型)asyncFunc(按鈕點擊時執行的異步函數)delay(loading延遲),另外,還需要一個組件內部的loading變量來控制我們Button組件的狀態,代碼如下:

export default {     data() {         return {           loading: false         }     },     props: {         text: {           type: String,           default: '確定'         },         type: {           type: String,           default: 'primary'         },         delay: {           type: Number,           default: 0         },         asyncFunc: {           type: Function,           default: () => {}         }     }, }

使用antd中的Button組件進行二次封裝

在我們的自定義LoadingButton組件中,將上面定義的參數使用起來,并綁定一個click事件,代碼如下:

<template>   <Button :type="type" :loading="loading" @click="handleClick">     {{ text }}   </Button> </template>  <script> import { Button } from 'ant-design-vue'  export default {     components: {         Button     },     methods: {         handleClick() {}     } } </script>

判斷異步函數asyncFunc

這一部分為整個組件最重要的一個部分,即我們如何去判斷傳入的函數是異步函數,當我們傳入的asyncFunc函數是異步函數時,組件才需要添加loading的動畫,那么我們應該如何去判斷一個函數是否為異步函數呢?

參考antd是如何實現的?

上面我們剛介紹了antdModal對話框中有類似的邏輯,那么不妨去閱讀一下這部分相關的源碼,看下antd的實現方式:

// components/modal/ActionButton.jsx  onClick() {   const { actionFn, closeModal } = this;   if (actionFn) {     let ret;     if (actionFn.length) {       ret = actionFn(closeModal);     } else {       ret = actionFn();       if (!ret) {         closeModal();       }     }     if (ret && ret.then) {       this.setState({ loading: true });       ret.then(         (...args) => {           // It's unnecessary to set loading=false, for the Modal will be unmounted after close.           // this.setState({ loading: false });           closeModal(...args);         },         e => {           // Emit error when catch promise reject           // eslint-disable-next-line no-console           console.error(e);           // See: https://github.com/ant-design/ant-design/issues/6183           this.setState({ loading: false });         },       );     }   } else {     closeModal();   } },

閱讀antd源碼的實現,我們知道,判斷一個函數是否是異步函數,可以通過判斷函數是否有.then(ret && ret.then)方法,那么我們也可以類似的做一個判斷,代碼如下:

async handleClick() {   const asyncFunc = this.asyncFunc   if (!this.isFunc) {     return   }   const ret = asyncFunc()    // 如果是異步函數,則顯示loading   if (ret && ret.then) {     this.loading = {       delay: this.delay     }     ret.finally(() => {       this.loading = false     })   } }

測試LoadingButton組件

到這里我們的最核心的組件邏輯就開發完成了,后面我們寫一個demo來測試一下這個LoadingButton組件是否符合預期:demo代碼如下:

<template>   <div>     <LoadingButton :delay="500" :asyncFunc="asyncFunc" />   </div> </template>  <script> import LoadingButton from './LoadingButton.vue'  export default {   data() {     return {       loading: false     }   },   components: {     LoadingButton   },   methods: {     asyncFunc() {       return new Promise(resolve => {         setTimeout(() => {           resolve()         }, 2000)       })     }   } } </script>

我們寫了一個異步函數asyncFunc用來模擬實際業務中的異步請求,現在可以看下效果:

vue組件實戰:開發一個加載Button組件--LoadingButton

符合之前的預期效果,這樣我們再有類似需要loading的場景時,就可以直接使用LoadingButton組件,將點擊需要執行的異步函數傳入即可,不需要再去定義loading變量。

寫在最后

這個組件其實核心的代碼非常少,也很容易讀懂。由于最近在做一些業務這類場景比較多,感覺這個小組件還是挺實用的所以分享給大家,這里也是只對最重要的部分做了一個介紹,相信大家學會了之后也可以通過這個方式封裝出符合自己實際場景需求的組件。最后,附上這個組件的完整代碼:

<template>   <Button :type="type" :loading="loading" @click="handleClick">     {{ text }}   </Button> </template>  <script> import { Button } from 'ant-design-vue'  export default {   data() {     return {       loading: false     }   },   props: {     text: {       type: String,       default: '確定'     },     type: {       type: String,       default: 'primary'     },     delay: {       type: Number,       default: 0     },     asyncFunc: {       type: Function,       default: () => {}     }   },   components: {     Button   },   computed: {     isFunc() {       return typeof this.asyncFunc === 'function'     }   },   methods: {     async handleClick() {       const asyncFunc = this.asyncFunc       if (!this.isFunc) {         return       }       const ret = asyncFunc()        // 如果是異步函數,則顯示loading       if (ret && ret.then) {         this.loading = {           delay: this.delay         }         ret.finally(() => {           this.loading = false         })       }     }   } } </script>

原文地址:https://juejin.cn/post/7099234795720278046

作者:liangyue

(學習視頻分享:web前端開發、編程基礎視頻)

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
性色欲情侣网站WWW| 亚洲av无码一区二区三区dv| 国产午夜精品一区二区三区老| 我和公GONG在厨房日本电影| 女角色翻白眼流口水流眼泪图片| 饥渴的少妇2中文字幕| 成人无码精品1区2区3区免费看| 影音先锋女人AV鲁色资源网久久| 小受呻吟高潮GV在线观看| 揉着我的奶从后面进去视频| 欧美人与动牲交A欧美精品| 久久综合激激的五月天| 黑人双人RAPPER的特点| 国产精品免费久久久久久蜜桃| 俺去俺来也在线WWW色官网| 最新的美国ZOOM动物| 亚洲欧美另类激情综合区蜜芽| 午夜精品久久久久9999| 十八禁午夜私人在线观看影院| 日本熟妇人妻XXXXX中文| 欧美黑人又大又粗XXXX| 免费无码的AV片在线观看| 久久香综合精品久久伊人| 男人J放进女人P全黄动态图 | 国产精品无码一区二区在线观一| 果冻传媒一二三工厂免费观看| 国产精品久久久久久久久软件| 成人av在线网站| 八戒八戒看片在线WWW看| 国产成人一区二区| 国产SM重口调教在线观看| 村长用力挺进她的花苞啥电视| 中文人妻AV高清一区二区| 伊在人亚洲香蕉精品区| А√天堂资源在线官网| 保守人妻精油按摩被强出| 暴躁老阿姨CSGO技巧| 国产精品久久毛片| 久久午夜私人影院| 色欧美与xxxxx| 熟女一区二区三区| 天堂А√在线最新版中文下载| 天天摸天天做天天爽水多| 亚洲欧美另类在线| 啊灬啊灬啊灬快灬高潮了霸总| 国产日韩综合一区二区性色AV| 国产精品自在线拍国产电影| 国产手机在线国内精品| 花火と在线观看动漫免费| 欧美成人午夜免费全部完| 人妻少妇无码精品视频区| 日日摸夜夜添夜夜添影院| 亚洲成AⅤ人片在线观看天堂无码| 亚洲精品AⅤ无码精品| 婬乱丰满熟妇XXXXX性69| 成人亚洲A片Ⅴ一区二区小说| 狠狠色丁香久久婷婷综合五月| 欧美黑人XXXXXⅩ| 亚洲AV理论在线电影网| 亚洲中文字幕久久久一区 | 色偷偷亚洲第一成人综合网址| 四虎国产精品成人影院| 亚洲A∨精品一区二区三区下载| 亚洲AV成人无码精品网站老司机 | 亚洲午夜福利在线观看| 中文字幕无码成人片| JIZZJIZZJIZZ中国| 成人伊人亚洲人综合网站| 久久精品动漫一区二区三区| 老赵揉搓苏清雅双乳| 欧美精品AⅤ一区二区三区| 亚洲AV无码成H人在线观看| 暗交小拗女一区二区三区视频 | 亚洲国产成人丁香五月激情| 亚洲性夜夜综合久久7777| 高潮VPSWINDOWS国产乱| 国模少妇无码一区二区三区| 久久亚洲精品无码| 无码免费伦费影视在线观看| 亚洲欧洲日产国码无码久久99| 成人H动漫精品一区二区| 老师你乖乖的可以让你少吃点苦头 | 色欲狠狠躁天天躁无码中文字幕 | 又黄又无遮挡AAAAA毛片| H无码动漫在线观看网站| 公和我做好爽添厨房在线观看| 美女又大又黄WWW免费网站| 日本无遮挡真人祼交视频| 曰本女人牲交全视频播放毛片| 国产日韩精品一区二区三区在线观 | 好爽…又高潮了毛片无广告| 久久人人爽人人爽人人片AV| 人妻互换免费中文字幕| 亚洲综合成人婷婷五月网址| 国产麻豆剧传媒精品国产AV蜜桃 | 欧美精品亚洲精品日韩传电影| 亚洲欧美在线人成最新| 国产精品视频免费一区二区| 日韩欧美视频一区二区| 亚洲成A人片77777KKKK| 国产成人乱色伦区| 日韩精品极品视频在线观看免费| 亚洲AV综合色区无码二区爱AV| 18禁强伦姧人妻又大又| 国产精品国产三级在线专区| 久久亚洲精品无码VA大香大香| 亚洲AV高潮黄色毛片| 国产成人AV乱码在线观看| 久久久久久久精品免费| 日日AV拍夜夜添久久免费| 99视频精品全部免费免费观看 | 无码少妇一区二区三区芒果| 中文乱码精品一区二区三区人妻| 精品久久久久久无码人妻| 人妻AV鲁丝一区二区三区蜜臀| 亚洲AV无码成人网站国产网站| 国产99久久精品一区二区| 局长从后面握住我的奶| 婷婷久久久亚洲欧洲日产国码AV| 一区二区三区av在线| 国产AV无码专区亚洲AⅤ蜜芽| 人妻无码熟妇乱又视频| 亚洲性色AV片在线观看网址 | 亚洲欧美色国产综合| 孩教小UXXXⅩ精品| 小13箩利洗澡无码视频网站| 97夜夜澡人人爽人人| 黑人性受XXXX黑人XYX性爽| 无人区码一码二码三码四码| 国产成人亚洲综合无码DVD| 玩弄丰满熟妇XXXXX性HD| 国产SUV精品一区二区33| 熟妇一区二区三区| 国产高清在线精品一区二区三区 | 熟妇人妻中文字幕| 国产69精品久久久久777| 天堂8А√中文在线官网| 国产精品岛国久久久久| 无码人妻一区二区三区免费AV| 国产精品久久毛片| 亚洲AV乱码一区二区三区按摩| 国精产品一二三产区| 亚洲国产精品一区二区久久HS | 国产精品成人久久久久久久| 偷炮少妇宾馆半推半就激情| 国产乱色精品成人免费视频| 亚洲AV成人综合网成人| 精品国际久久久久999波多野| 视频在线一区二区三区| 国产ww又大又粗又刺激孕妇| 无码中文AV有码中文AV| 和朋友换娶妻野外夫妇3| 亚洲欧洲日产国码无码APP| 老熟妇高潮一区二区三区网| 999久久久国产精品消防器材| 人妻ay无码一区二区三区| 俄罗斯性孕妇孕交| 欧美一区二区三区不卡| 永久黄网站色视频免费品善网| 妺妺窝人体色聚窝窝| 白嫩无码人妻丰满熟妇啪啪区百度| 色婷婷亚洲六月婷婷中文字幕| 国产成人精品无码片区| 亚洲AV无码专区国产乱码4SE | 亚洲熟妇少妇任你躁在线观看无码 | JIZZJIZZ日本护士水好多| 色婷婷AV一区二区三区浪潮慧瑟 | 厨房里的激战2免费观看不打丐赛| 玩弄老太太的BBB| 饥渴少妇AV无码影片| 制服 丝袜 有码 无码 中文| 精品熟女少妇AV免费久久| 亚洲AV无码无在线观看| 久久久久久久久久久精品尤物| 4HC88四虎WWW在线影院| 撅高屁股乖乖被学长CAO男男| 99热这里只有精品免费播放| 十八禁羞羞视频爽爽爽| 韩国免费A级毛片| 中文在线天堂А√在线| 日韩在线看片免费人成视频播放 | 免费A级毛片无码A| 又爽又黄无遮挡高潮视频网站| 欧美日韩免费专区在线| 69精产国品一二三产区区别| 日本少妇毛茸茸高潮| 好男人官网在线观看免费播放| 在线观看韩国电影| 免费高清播放A级毛片完整版| 成人无码区免费AⅤ片在线观看| 小妖精又紧又湿高潮H视频69| 看成年女人午夜毛片免费| 成在线人午夜剧场免费无码| 亚洲AV永久无码精品漫画| 欧美激情内射喷水高潮| 国产裸模视频免费区无码| 中文字幕日本最新乱码视频| 玩弄放荡人妻一区二区三区| 麻花传媒剧国产MV入口在线观看 | 亚洲狠狠婷婷综合久久蜜芽 |