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

Vue項目實現(xiàn)文件下載進度條功能

 更新時間:2024年03月07日 14:43:30   作者:A 風  
大文件下載,花費的時間比較長,沒有任何提示,用戶體驗很差,需要優(yōu)化,提示文件在下載中,并且顯示進度百分比,下面小編給大家?guī)砹薞ue項目實現(xiàn)文件下載進度條功能,感興趣的朋友一起看看吧

Vue項目實現(xiàn)文件下載進度條

需求場景

大文件下載,花費的時間比較長,沒有任何提示,用戶體驗很差。

需要優(yōu)化,提示文件在下載中,并且顯示進度百分比。

實現(xiàn)步驟

1.下載文件的方法,需要拿到當前進度。

2.每一次下載進度更新,需要監(jiān)聽變化,并且刷新頁面顯示的數(shù)據。

3.封裝一個文件下載進度的組件。

下面一步步來實現(xiàn):

1.獲取文件下載進度

axios作為一個易用、簡潔且高效的http庫,有沒有獲取下載進度的方法呢?
打開axios官網查看一下,文檔中有一個對原生進度事件的處理的方法
onDownloadProgress
允許為下載處理進度事件。
在項目中,我已經對axios進行了封裝,并且增加了請求攔截器和響應攔截器。
在封裝接口的文件interface.js中,新增一個下載文件,并且獲取下載進度的方法。

export const downFileProgress  =(url,parameter,callback,totalSize,uniSign) =>{
  return axios({
    url: url,
    params: parameter,
    method:'get' ,
    responseType: 'blob',
    onDownloadProgress (progress) {
      callback(progress, totalSize, uniSign)
    }
  })
}

2.通過vuex狀態(tài)管理下載進度

下載進度對象,需要通過vuex狀態(tài)管理。在store文件下面的modules文件夾中,新建 downLoadProgress.js文件。
用來存放文件下載進度的數(shù)組 progressList 和修改進度列表方法,都在這里面。

const state = {
  // 文件下載進度
  progressList: [], 
  progressError: '',
}
const mutations = {
  SET_PROGRESS: (state, progressObj)=>{ 
    // 修改進度列表
    if(state.progressList.length){ 
      // 如果進度列表存在
      if(state.progressList.find(item=>item.path == progressObj.path)){ 
        // 前面說的path時間戳是唯一存在的,所以如果在進度列表中找到當前的進度對象
        state.progressList.find(item=>item.path == progressObj.path).progress = progressObj.progress 
        // 改變當前進度對象的progress
      }
    }else{
      // 當前進度列表為空,沒有下載任務,直接將該進度對象添加到進度數(shù)組內
      state.progressList.push(progressObj) 
    }
  },
  DEL_PROGRESS: (state, props) => {
    state.progressList.splice(state.progressList.findIndex(item=>item.path == props), 1) // 刪除進度列表中的進度對象
  },
  CHANGE_SETTING: (state, { key, value }) => {
    // eslint-disable-next-line no-prototype-builtins
    if (state.hasOwnProperty(key)) {
      state[key] = value
    }
  }
}
const actions = {
  changeSetting({ commit }, data) {
    commit('CHANGE_SETTING', data)
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}

3.新增一個顯示進度彈框的組件

<template>
</template>
<script>
  import { mapState } from 'vuex'
  export default {
    name: 'downLoadNotice',
    computed: {
      ...mapState({
      'progressList': state => state.downLoadProgress.progressList
    })
    },
    data() {
      return {
        notify: {} // 用來維護下載文件進度彈框對象
      }
    },
    watch: { // 監(jiān)聽進度列表
      progressList: {
        handler(n) {
          let data = JSON.parse(JSON.stringify(n))
          data.forEach(item => {
            const domList = [...document.getElementsByClassName(item.path)]
            if (domList.find(i => i.className == item.path)) { // 如果頁面已經有該進度對象的彈框,則更新它的進度progress
              if(item.progress)domList.find(i => i.className == item.path).innerHTML = item.progress + '%'
              if (item.progress === null) { // 此處容錯處理,如果后端傳輸文件流報錯,刪除當前進度對象
                this.$store.commit('downLoadProgress/DEL_PROGRESS', item.path)
                this.$notify.error({
                  title: '錯誤',
                  message: '文件下載失敗!'
                });
              }
            } else {
              // 如果頁面中沒有該進度對象所對應的彈框,頁面新建彈框,并在notify中加入該彈框對象,屬性名為該進度對象的path(上文可知path是唯一的),屬性值為$notify(element ui中的通知組件)彈框對象
              this.notify[item.path] = this.$notify.success({
                // title: 'info',
                dangerouslyUseHTMLString: true,
                customClass: 'progress-notify',
                message: `<p style="width: 100px;">正在下載<span class="${item.path}" style="float: right">${item.progress}%</span></p>`, // 顯示下載百分比,類名為進度對象的path(便于后面更新進度百分比)
                showClose: false,
                duration: 0
              })
            }
            console.log(item.progress + '%', '-------------------------->')
            if (item.progress == 100) { // 如果下載進度到了100%,關閉該彈框,并刪除notify中維護的彈框對象
              this.notify[item.path].close()
              // delete this.notify[item.path] 上面的close()事件是異步的,這里直接刪除會報錯,利用setTimeout,將該操作加入異步隊列
              setTimeout(() => {
                delete this.notify[item.path]
              }, 1000)
              this.$store.commit('downLoadProgress/DEL_PROGRESS', item.path)// 刪除caseInformation中state的progressList中的進度對象
            }
          })
        },
        deep: true
      }
    }
  }
</script>
<style lang="scss" scoped>
</style>

到此這篇關于Vue項目實現(xiàn)文件下載進度條功能的文章就介紹到這了,更多相關Vue文件下載進度條內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue-router路由懶加載及實現(xiàn)的3種方式

    vue-router路由懶加載及實現(xiàn)的3種方式

    這篇文章主要給大家介紹了關于vue-router路由懶加載及實現(xiàn)的3種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Vue2.x 項目性能優(yōu)化之代碼優(yōu)化的實現(xiàn)

    Vue2.x 項目性能優(yōu)化之代碼優(yōu)化的實現(xiàn)

    這篇文章主要介紹了Vue2.x 項目性能優(yōu)化之代碼優(yōu)化的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Element+Vue實現(xiàn)動態(tài)表單多個下拉框組件功能

    Element+Vue實現(xiàn)動態(tài)表單多個下拉框組件功能

    這篇文章主要介紹了Element+Vue實現(xiàn)動態(tài)表單多個下拉框組件功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • vue之郵箱、密碼、手機號碼等輸入驗證規(guī)則說明

    vue之郵箱、密碼、手機號碼等輸入驗證規(guī)則說明

    這篇文章主要介紹了vue之郵箱、密碼、手機號碼等輸入驗證規(guī)則說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 關于導入、配置Vuetify遇到的幾個問題

    關于導入、配置Vuetify遇到的幾個問題

    這篇文章主要介紹了關于導入、配置Vuetify遇到的幾個問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • VsCode新建VueJs項目的詳細步驟

    VsCode新建VueJs項目的詳細步驟

    本篇文章主要介紹了VsCode新建VueJs項目的詳細步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • vue中關于@media媒體查詢的使用

    vue中關于@media媒體查詢的使用

    這篇文章主要介紹了vue中關于@media媒體查詢的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue實現(xiàn)輸入框自動跳轉功能

    vue實現(xiàn)輸入框自動跳轉功能

    這篇文章主要為大家詳細介紹了vue實現(xiàn)輸入框自動跳轉功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Vue兩個同級組件傳值實現(xiàn)

    Vue兩個同級組件傳值實現(xiàn)

    Vue組件之間是有聯(lián)系的,避免不了組件之間要互相傳值,那么如何實現(xiàn)Vue兩個同級組件傳值,本文就來介紹一下,感興趣的可以了解一下
    2021-07-07
  • Vuejs第十二篇之動態(tài)組件全面解析

    Vuejs第十二篇之動態(tài)組件全面解析

    組件(Component)是 Vue.js 最強大的功能之一。組件可以擴展 HTML 元素,封裝可重用的代碼。接下來通過本文給大家介紹Vuejs第十二篇之動態(tài)組件,非常不錯,具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-09-09

最新評論

富蕴县| 类乌齐县| 繁昌县| 金沙县| 菏泽市| 弥勒县| 安吉县| 色达县| 综艺| 河池市| 牙克石市| 焉耆| 遂溪县| 永福县| 黄平县| 台江县| 邛崃市| 固始县| 互助| 晴隆县| 西昌市| 景泰县| 石屏县| 盖州市| 习水县| 陆河县| 噶尔县| 都安| 汨罗市| 永登县| 双鸭山市| 稷山县| 宿迁市| 新宾| 儋州市| 那曲县| 西乌| 鸡东县| 九江县| 宜昌市| 革吉县|