成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院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號
大鷄巴久久久久久久久久| 班长哭了能不能再抠游戏里面的钱 | YYYY111111少妇影院| 不收费的十大免费好用的软件| 厨房掀起少妇裙子挺进去| 国产韩国精品一区二区三区 | 98人妻人人揉人人躁88Av| 国产精品亚洲А∨无码播放麻豆| 国产精品扒开腿做爽爽爽| 国精产品一区二区三区糖心| 狠狠澡人人添人人爽人妻少妇| 精品亚洲自慰AV无码喷奶水| 久久中文字幕人妻丝袜系列| 内射中出无码护士在线| 让人一看就舒服的网名| 天海翼一区二区三区高清在线| 亚洲AV极品无码专区在线观看 | 激情97综合亚洲色婷婷五| 久久久久人妻一区精品| 欧美精品黑人粗大| 十八款夜间禁用APP| 亚洲AV秘 无码一区二区三密桃| 亚洲日韩国产一区二区三区| 91无码人妻精品一区二区蜜桃| 成 人片 黄 色 大 片| 国产男男GaYGaY无套| 久久精品99无色码中文字幕| 欧美日韩视频一区二区三区| 搡BBB搡BBBB搡BBBB| 亚洲VA成无码人在线观看| 中文字幕亚洲欧美日韩在线不卡| 成 人 H动 漫在线播放日本| 国产午夜精品一区二区三区极品 | 欧洲成人午夜精品无码区久久| 天天AV天天翘天天综合网色鬼| 亚洲国产成人片在线观看无码| 99精产国品一二产区在线| 乖我们在办公室试试| 精品日产卡一卡二卡927| 欧美性XXXXX极品| 新狼窝色AV性久久久久久| 曰韩免费无码AV一区二区| 出租屋勾搭老熟妇啪啪| 精品无人区麻豆乱码1区2| 欧美美女视频熟女一区二区| 无码专区亚洲综合另类| 中国女人大白屁股ASS| 国产CHINESEHDXXXX宾馆TUBE| 久久九九久精品国产88| 色爱无码AⅤ综合区| 亚洲欧美综合精品AⅤ一区二区| А√ 天堂 在线官网中文| 黑人巨鞭大战丰满少妇| 欧美最猛黑人XXXⅩ猛男视频| 亚洲 小说 欧美 激情 另类| 97色精品视频在线观看| 国产又黄又爽又刺激的免费网址| 欧美黑人XXXX高潮猛交| 亚洲成AV人最新无码| 被强迫的爱人 电影| 久久99精品久久久久婷婷| 精品国产AV 无码一区二区三区| 欧美性猛交XXXX黑人| 亚洲成A人片无码不卡| 扒开腿挺进湿润的花苞HD视频| 狠狠躁夜夜人人爽天96| 日产精品卡2卡3卡4卡免费 | 熟妇的滚烫的肉唇翻进翻出| 影音先锋亚洲无码资源网| 国产成人综合色视频精品| 免费无遮挡无码H肉动漫在线观看 免费无遮挡色视频网站 | 好儿子妈妈今天就是你的女人| 人妻去按摩店被黑人按中出| 亚洲精品天堂无码中文字幕| 丰满多毛的大隂户BEST| 蜜芽亚洲日韩欧美国产高清ΑV| 亚洲AV成人一区二区三区观看在| IJZZIJZZIJ亚洲大全| 久久SE精品一区二区| 无码成A∧人片在线播放| CSGO大姐姐AWP多少钱| 久久AV无码专区亚洲AV桃花岛| 无码精品A∨在线观看十八禁| 99久RE热视频这只有精品6| 精品国产乱码久久久久久蜜桃| 少妇兽交PWWW综合网| 99国产精品欧美一区二区三区| 精品国产Ⅴ无码大片在线观看 | 嘼皇PORONOⅤIDEOS极| 蜜桃色欲AV久久无码精品软件| 亚洲AV无码专区在线观看成人| 父债子偿BY画崖海棠| 女生裙子里面到底穿了啥| 亚洲熟妇无码AV不卡在线播放| 国产女人18毛片水真多1| 色欲色香天天天综合WWW| ATLANTICOCEAN巨大| 久久香蕉综合色一综合色88| 亚洲大色堂人在线无码| 国产精品免费看久久久8| 三个男人换着躁我一个| chinese炮打老熟女| 免费 黄 色 人成 视频 在| 亚洲人妻免费视频| 好男人2019在线视频播放观看| 天堂AV无码一区二区三区| 边吃奶边扎下面动态| 欧美丰满熟妇性XXXX| 中文亚洲AV片在线观看无码| 久久99精品久久久久子伦| 亚洲AV永久无码成人网站| 国产精品无码一区二区三区不卡| 色欲AV无码一区二区三区| 啊灬啊灬啊灬快好深| 欧美黑人又大又粗XXXX| 中文毛片无遮挡高潮免费| 久久丫线这里只精品| 亚洲中文字幕久久精品无码APP| 交换配乱吟粗大SNS84O| 亚洲 自拍 另类 欧美 综合| 国产精品无码AV无码| 无码H黄肉3D动漫在线观看| 国产9 9在线 | 中文| 色又黄又爽18禁免费网站| 粗大的内捧猛烈进出无码 | 99精品视频在线观看婷婷| 男人J桶进女人P无遮挡的图片| 中文AV无码人妻一区二区三区| 老汉引诱新婚少妇| 伊人久久精品亚洲午夜| 久久五月丁香中文字幕| 一二三四电影在线观看视频播放免| 久久国产高潮流白浆免费观看| 亚洲另类精品无码专区| 精品无人区卡卡卡卡卡二卡三乱码| 亚洲AV无码一区二区三区人区| 韩国理伦电影午夜三级| 亚洲AV中文无码字幕色三| 国产一区二区三区影院| 亚洲A成人无码网站在线| 狠狠久久精品中文字幕无码| 亚洲精品无码成人片久久| 精品一区二区三区在线视频| 亚洲熟妇久久精品| 久久无码中文字幕免费影院蜜桃| 与狼共舞 电视剧| 免费看的WWW哔哩哔哩 | 末发育娇小性色XXXXX| 99久久国产自偷自偷免费一区| 人妻丰满AV中文久久不卡| 成人免费观看的A级毛片| 天堂AV旡码AV毛片毛片免费| 国产男男Gay做受×Xx男| 亚洲成人Av在线| 久久久久久亚洲AV无码蜜芽 | 成人性无码专区免费视频| 熟妇人妻久久中文字幕 | 精品无码人妻夜人多侵犯18| 一对一大尺度聊天APP安装| 欧美成妇人吹潮在线播放| 宝贝把腿抬高点我让你更爽漫画 | 亚洲成av人片在线观看无码| 久久精品国产精品国产精品污 | 亚洲AV无码麻豆一区二区三区| 精品国内自产拍在线观看视频| 又爽又刺激免费男女视频| 欧美日韩国产精品| 丰满少妇AAAAAA爰片毛片| 亚洲 日韩 欧美 成人 在线| 久久国产精品娇妻素人| 2018午夜福利| 日日摸日日碰夜夜爽无| 国产亚洲AV片在线观看播放按摩| 亚洲熟妇AV一区二区三区下载| 女人裸体张开腿无遮挡| 成熟丰满熟妇AV无码| 亚洲AV成人无码精品电影在线| 久久久久久AV无码免费看大片| AJ四色鸳鸯真假区别| 天堂中文资源库官网| 精品久久久久久中文字幕大豆网| 中文字幕免费不卡二区| 日韩AV一区二区在线| 国产性生大片免费观看性| 伊人久久大香线焦AV综合影院| 人人妻人人狠人人爽天天综合网| 国产精品久久久久9999不卡| 亚洲色欲色欲WWW在线播放| 欧美人与牲动交a欧美精品| 国产成人综合色视频精品| 亚洲中文字幕无码日韩精品| 人妻熟妇乱又伦精品视频APP| 国产精品无码久久久久成人影院| 又黑又肥的60岁岳| 色综合天天综合网国产| 久久97久久精品免费观看黑人| H精品无码动漫在线观看| 午夜成人理论福利片| 妺妺晚上扒我内裤吃我精子H | 少妇白浆高潮无码免费区|