vue 做一個(gè)帶進(jìn)度動(dòng)畫的下載按鈕

game.gif

進(jìn)度通過VUEX全局控制烙如,就算切換頁面你的下載進(jìn)度也不會(huì)丟失并且在其他頁面也能通過btn按鈕看到下載進(jìn)度

<template>
  <div :class="percentageVerify?'button-succeed':'button'"
       :style="{height:strokeWidth/2+'px',
       borderRadius:strokeWidth/2+'px'}"
       @click="onclick"
       ref="dow">
    <span>{{text}}</span>
  </div>
</template>

<script>
    import {mapGetters} from "vuex";
    /**
     * carryOut下載完成時(shí)回調(diào)方法
     * */
    export default {
        name: "DownLoadButton",
        props: {
            /**
             * 按鈕寬度
             */
            strokeWidth: {
                type: Number,
                default: 56
            },
            /**
             * 完成文案
             */
            succeedText: {//
                type: String,
                default: "完成"
            },
            /**
             * 初始化文案
             */
            initText: {//
                type: String,
                default: "下載"
            },
            /**
             * 暫停時(shí)文案
             */
            suspendText: {//
                type: String,
                default: "繼續(xù)"
            },
            /**
             * vuex plan 中的對象名
             */
            vuexName:{
                type: String,
            },
            /**
             * 按鈕淺色
             */
            lightColor:{
                type:String,
                default:"#2BA3FF"
            },
            /**
             * 按鈕深色
             */
            darkColor:{
                type:String,
                default:"#017BFF"
            },
            /**
             * 按鈕邊框 單位PX
             */
            borderpx:{
                type:String,
                default:"1px"
            }
        },
        computed: {
            ...mapGetters({plan:'getPlan'}),
            percentage() {
                let p = 0
                if(this.plan[this.vuexName]){
                    let item = this.plan[this.vuexName]
                    p = Number(item.haveDownloaded / item.filelength * 100)
                }
                return p.toFixed(2);
            },
            percentageVerify(){
                return this.percentage==100 || this.percentage==0;
            },
            text(){
                if(this.percentage==0){
                    return this.initText
                }else if(this.percentage==100){
                    return this.succeedText
                }else if(!this.plan[this.vuexName].state){
                    return this.suspendText
                }
                return this.percentage+'%'
            }
        },
        watch: {
            percentage(val) {
                this.$refs.dow.style.setProperty('--position', val + '%');
                if(this.percentageVerify){
                    this.$refs.dow.style.setProperty('--borderpx', 0 );
                    if(val==100 && this._events.carryOut){//下載完成時(shí)回調(diào)
                        this.$emit('carryOut')
                    }
                }else{
                    this.$refs.dow.style.setProperty('--borderpx', this.borderpx );
                }
            }
        },
        mounted() {
            this.$refs.dow.style.setProperty('--position', this.percentage + '%');
            if(this.percentageVerify){
                this.$refs.dow.style.setProperty('--borderpx', 0 );
            }else{
                this.$refs.dow.style.setProperty('--borderpx', this.borderpx );
            }
            this.$refs.dow.style.setProperty('--lightColor', this.lightColor );
            this.$refs.dow.style.setProperty('--darkColor', this.darkColor );
        },
        methods:{
            onclick(){
                this.$emit("click");
            }
        }

    }
</script>

<style scoped lang="scss">
  @mixin span-font {
    font-size: 32px;
    font-weight: bold;
    text-align: center;
    width: 100%;
  }

  @mixin button {
    width: 100%;
    display: flex;
    align-items: center;
  }

  .button {
    @include button;
    border: 2px solid #E5E4E9;
    --color: #afdbff;
    --position: 0%;
    background-repeat: no-repeat;
    background-size: 100%, var(--position);
    background-image: radial-gradient(closest-side circle at 0, var(--color), var(--color) 100%, transparent),
    linear-gradient(var(--color), var(--color));

    span {
      @include span-font;
      color: $color-text;
    }
  }

  .button-succeed {
    --lightColor:#2BA3FF;
    --darkColor:#017BFF;
    --borderpx:1px;
    @include button;
    border: var(--borderpx) solid #E5E4E9;
    background: linear-gradient(90deg, var(--lightColor), var(--darkColor));

    span {
      @include span-font;
      color: $font-color-dark;
    }
  }
</style>

調(diào)用方式

<down-load-button @click="btnClick"
                              @carryOut="carryOut"
                              :vuexName="apkName"
                              :light-color="lightColor"
                              :dark-color="darkColor"
                              :init-text="btntext"
                              :succeed-text="btnsucceedtext"/>

vuex

state:{
  plan: {},
}菌赖,
getters:{
  /**
         * 下載進(jìn)度
         * @param state
         */
        getPlan: state => {
            return state.plan
        },
},
mutations:{
   setPlan(state, plan) {
            state.plan = JSON.parse(plan);
        },
/**
         * 停止進(jìn)度條
         * @param state
         */
        stopPlan(state) {
            window.clearInterval(intervalID)
            intervalID = undefined
        },
},
actions:{
/* 開始獲取進(jìn)度
         * @param commit
         */
        actionPlan({
            state,
            commit
        }) {
            if (!intervalID) {
                intervalID = setInterval(function () {
                    AppTool.getPlan().then(res => {
                        console.log("定時(shí)器")
                        commit("setPlan", res)
                        // console.log(state.plan)
                    })
                }, 500)
            }

        },
}
         

最終實(shí)現(xiàn)效果:
寬高適應(yīng),不同狀態(tài)時(shí)文字變化肋乍,按鈕顏色外部傳入绳慎,按鈕漸變色,下載完成時(shí)會(huì)有回調(diào)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載彩匕,如需轉(zhuǎn)載請通過簡信或評(píng)論聯(lián)系作者腔剂。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市驼仪,隨后出現(xiàn)的幾起案子掸犬,更是在濱河造成了極大的恐慌,老刑警劉巖绪爸,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件湾碎,死亡現(xiàn)場離奇詭異,居然都是意外死亡奠货,警方通過查閱死者的電腦和手機(jī)介褥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來递惋,“玉大人柔滔,你說我怎么就攤上這事〉つ” “怎么了廊遍?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贩挣。 經(jīng)常有香客問我喉前,道長,這世上最難降的妖魔是什么王财? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任卵迂,我火速辦了婚禮,結(jié)果婚禮上绒净,老公的妹妹穿的比我還像新娘见咒。我一直安慰自己,他們只是感情好挂疆,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布改览。 她就那樣靜靜地躺著下翎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宝当。 梳的紋絲不亂的頭發(fā)上视事,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音庆揩,去河邊找鬼俐东。 笑死,一個(gè)胖子當(dāng)著我的面吹牛订晌,可吹牛的內(nèi)容都是我干的虏辫。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼锈拨,長吁一口氣:“原來是場噩夢啊……” “哼砌庄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奕枢,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對情侶失蹤鹤耍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后验辞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稿黄,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年跌造,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杆怕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壳贪,死狀恐怖陵珍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情违施,我是刑警寧澤互纯,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站磕蒲,受9級(jí)特大地震影響留潦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辣往,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一兔院、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧站削,春花似錦坊萝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菩鲜。三九已至,卻和暖如春惦积,著一層夾襖步出監(jiān)牢的瞬間睦袖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國打工荣刑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伦乔。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓厉亏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親烈和。 傳聞我的和親對象是個(gè)殘疾皇子爱只,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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