在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ vue 上傳文件進(jìn)度條更新問(wèn)題

vue 上傳文件進(jìn)度條更新問(wèn)題

我做了一個(gè)上傳進(jìn)度組件,發(fā)現(xiàn)上傳時(shí)進(jìn)度條progress只更新一次,只有在完成上傳的時(shí)候或者我把窗口最小化再?gòu)?fù)原時(shí)更新一次dom,其余上傳期間進(jìn)度條讀條依然為0。
clipboard.png
代碼如下:
模板:
<div class="uploadItem" v-for='item in files'>
<div class="uploadProgress" :style="'width:' + item.progress + '%'" ></div>
</div>

數(shù)據(jù):
data() {

return {
  files: []
}

}

我使用串行上傳文件
給files數(shù)組下的文件對(duì)象添加xhr對(duì)象的progress屬性,上傳過(guò)程中都會(huì)調(diào)用$set方法,代碼如下

  function uploadFileList(list, callback) {
    function uploadFile(file, cb) {
      let ot
      let oloaded
      file.xhr = new XMLHttpRequest()
      file.xhr.upload.onprogress = function(evt) {
        console.log(file)
        if (evt.lengthComputable) {
          var precent = (evt.loaded) / (evt.total) * 100
          that.$set(file, 'progress', precent)
        }
        let nt = new Date().getTime()
        let pertime = (nt - ot) / 1000 // 計(jì)算出上次調(diào)用該方法時(shí)到現(xiàn)在的時(shí)間差,單位為s
        ot = new Date().getTime()
        oloaded = 0 // 重新賦值時(shí)間,用于下次計(jì)算
        let perload = evt.loaded - oloaded // 計(jì)算該分段上傳的文件大小,單位b
        oloaded = evt.loaded // 重新賦值已上傳文件大小,用以下次計(jì)算
         // 上傳速度計(jì)算
        let speed = perload / pertime// 單位b/s
        let bspeed = speed
        let units = 'b/s'// 單位名稱(chēng)
        if (speed / 1024 > 1) {
          speed = speed / 1024
          units = 'KB/s'
        } else if (speed / 1024 > 1) {
          speed = speed / 1024
          units = 'M/s'
        }
        speed = speed.toFixed(1)
        that.$set(file, 'speed', speed + units)
        if (bspeed === 0) {
          that.$set(file, 'bspeed', true)
        }
      }
      file.xhr.onerror = that.uploadFailed
      file.xhr.onload = function() {
        that.uploadCurrent++
        cb()
      }
      file.xhr.open('PUT', file.putPath)
      file.xhr.send(file)
    }
    if (list.length) {
      uploadFile(list[0], function() {
        let newList = list.slice(1, list.length)
        uploadFileList(newList, callback)
      })
    } else {
      callback()
    }
  }
  上傳過(guò)程中files數(shù)組下文件對(duì)象的打印如下
  

clipboard.png
其中progress一直在改變,
clipboard.png
問(wèn)下為啥視圖只會(huì)更新一次???

回答
編輯回答
奧特蛋

http://www.cnblogs.com/ypinch... 原因如下 已解決

2018年6月15日 21:35
編輯回答
愛(ài)是癌

更新v2:可能progress更新太快了,vue拋棄掉了之前的更新,取最后一次更新
你試下:

that.$nextTick(() => {
    file.progress = xxxx
})

更新:直接 file.progress = xxxx 呢?
如果你的file已經(jīng)有progress這個(gè)屬性了,是不需要用$set的


:style="'width:' + item.progress + '%'"

改成對(duì)象語(yǔ)法:

:style="{width : item.progress + '%'}" 
2018年1月21日 12:39