簡體   English   中英

Vue + axios 在值更改時不更新 DOM

[英]Vue + axios not update DOM when value change

我有上傳文件的循環

      this.fileUpload.filter((file) => !file.error)
        .map((file, index_file) => {
          var formData = new FormData();
          formData.append("folderID", id);
          formData.append("folderName", name);
          formData.append("type", type);
          formData.append(`content`, file);

          fileService
            .uploadfiles(
              formData,
              (event) => {
                file.status = "uploading";
                file.uploadPercentage =
                  Math.round((event.loaded * 100) / event.total) * 0.9;
                if (file.uploadPercentage == 90) {
                  file.status = "uploaded";
                }
                console.log(  file.uploadPercentage);
              }
            )
            .then((result) => {
              file.uploadPercentage = 100;
              file.status = "done";
            })
            .catch(() => {
              file.status = "uploaded";
            });
        });

ps fileService.uploadfiles 文件用於創建函數調用 axios.post

和 div 用於顯示上傳

   <div v-for="(file, file_index) in fileUpload" :key="`file_preview_${file_index}_${file.name}_${file.status}`">

{{ file.uploadPercentage }}
</div>

我不明白為什么 div 上的百分比不上傳,但在控制台中它記錄寫入文件的百分比。

在此處輸入圖像描述

您應該按照鏈接中的說明使用Vue.set

由於 JavaScript 的限制,Vue 無法檢測到某些類型的更改。 但是,有一些方法可以繞過它們以保持反應性。

Vue.set(file, 'status', 'uploading');
Vue.set(file, 'uploadPercentage', Math.round((event.loaded * 100) / event.total) * 0.9);

您可以使用 $forceUpdate() 手動更新虛擬 dom

 fileService
        .uploadfiles(
          formData,
          (event) => {
            file.status = "uploading";
            file.uploadPercentage =
              Math.round((event.loaded * 100) / event.total) * 0.9;
            if (file.uploadPercentage == 90) {
              file.status = "uploaded";
            }
            console.log(  file.uploadPercentage);
            this.$forceUpdate()
          }
        )
        
     

我將 $nextTick 添加到箭頭函數中以重新渲染並將 v-if rerenderProgress 添加到模板。

uploadfiles(
              formData,
              (event) => {
                file.status = "uploading";
                file.uploadPercentage = Math.round((event.loaded * 100) / event.total) * 0.9;
                this.rerenderProgress = false;
                this.$nextTick(function () {
                  this.rerenderProgress = true;
                });
                // this.$forceUpdate();
                if (file.uploadPercentage == 90) {
                  file.status = "uploaded";
                }
              },
              { cancelToken }
            )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM