国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

詳解Vue 普通對象數據更新與 file 對象數據更新

2024-05-06 15:17:57
字體:
來源:轉載
供稿:網友

最近在做一個多圖片上傳的組件,需求是做到多文件依次上傳,并顯示上傳進度條。

邏輯部分實現了以后,在更新進度條視圖的時候出現一點問題:動態計算生產的進度 progress 屬性不會自動更新。

原來的代碼是這樣寫的:

let files = this.filePicker.files;if(!files.length) {  return;}let arr = [];for(let i = 0, len = files.length; i < len; i++) {  let item = files[i];  // 每個文件初始進度為0  item.progress = '0';  arr.push(obj);}this.fileArr = arr;

這里直接將 file 對象添加一個 progress 屬性記錄上傳進度,并初始化為0,然后上傳時候實時計算更新 progress。但奇怪的是這個 progress 在視圖里并不會自動更新,巋然不動,一直都是0。還了N中辦法,百思不得其解。

 后來一怒之下做了一個小 demo,看看問題到底出現在哪里,把不想關的代碼都剔除,只保留核心代碼,并用最簡單的數據來模擬一下。代碼如下:

// 用數組模擬 files, 用對象模擬 file 對象let files = [];for(let i = 0, len = 5; i < len; i++) {  let obj = {name: 'name_' + 1};  files.push(obj);}let arr = [];for(let i = 0, len = files.length; i < len; i++) {  files[i].progress = '0';  arr.push(files[i]);}

這里僅僅是把 files 對象換成了數組來模擬,把 file 對象換成了普通對象模擬。

神奇的是,這樣居然就自動更新了。

由于文件 file 后來都保存在數組里,這說明唯一的區別就在 file 對象上面!于是打算用普通對象保存 file 對象的屬性再試試。

let files = this.filePicker.files;if(!files.length) {  return;}let arr = [];for(let i = 0, len = files.length; i < len; i++) {  let item = files[i];  let obj = {};  obj.name = item.name;  obj.size = item.size;  obj.progress = '0';  arr.push(obj);}

這樣視圖也是可以自動更新的,果然是 file 對象和普通對象的區別。

它們究竟是什么區別呢?看一下他們的類型先。

console.log('files type', Object.prototype.toString.call(files));// files type [object FileList]console.log('arr  type', Object.prototype.toString.call(arr));// arr  type [object Array]console.log('item type', Object.prototype.toString.call (files[0]));// item type [object File]console.log('obj type', Object.prototype.toString.call (obj));// obj type [object Object]

原來 files 是 FileList 類型,file 是 File 類型。而普通的 obj 是 Object 類型。

Vue 的數據更新利用的是 Object.defineProperty 的 getter setter 函數來實現的,而 Vue 默認沒有對 File 對象設置 getter setter, 因此用 File 對象不會自動更新。

解決辦法,就是用普通對象保存 file 對象里需要的信息,然后用來構造視圖數據。或者自己手動設置 File 對象的 setter,也可以自動更新。代碼如下:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 会泽县| 河间市| 左权县| 平定县| 五大连池市| 青海省| 丹棱县| 绥宁县| 民丰县| 天镇县| 吉隆县| 眉山市| 汉川市| 云浮市| 南溪县| 藁城市| 鄯善县| 蒙城县| 潢川县| 锡林郭勒盟| 柘城县| 得荣县| 开封县| 类乌齐县| 郁南县| 象州县| 汶上县| 民县| 呼图壁县| 西宁市| 澄江县| 桂东县| 杭州市| 奉化市| 兰西县| 道孚县| 汉沽区| 房山区| 白山市| 大冶市| 平原县|