element自定義 多文件上傳 觸發(fā)多次on-change問題
element自定義 多文件上傳 觸發(fā)多次on-change
由于項(xiàng)目需要,圖片上傳需要進(jìn)行壓縮之后在調(diào)用接口,那就只能走自定義上傳
自定義上傳關(guān)鍵在于:
- action = #
- :auto-upload="false"
<el-upload ? ? ref="upload" ? ? action="#" ?// 上傳入口改成 # ? ? :multiple="true" // 多文件上傳開啟 ? ? :on-change="handleChange" // 改變監(jiān)聽 ? ? :file-list="fileList" ?//文件列表 ? ? :auto-upload="false" // 自動上傳關(guān)閉 > ? ? <i class="el-icon-plus"></i> </el-upload>?
由于 auto-upload 設(shè)置為 false 之后,before-upload 會失效,所以上傳的事件之前體現(xiàn)在 change 里。
但是這樣呢在上傳文件時無論是多圖還是單圖,在上傳后都會走2次 handleChange ,
此時我們需要一個防抖方法,來限制它。
handleChange(file, fileList) { ? /* ? ? ? 自動上傳改成true會導(dǎo)致重復(fù)觸發(fā),所以在handleChange上傳文件 ? ? */ ? // ?防抖 ? let length = fileList.length ? this.maxLength = Math.max(length, this.maxLength) ? setTimeout(() => { ? ? if (length === this.maxLength) { ? ? ? // 你的上傳文件邏輯 ? ? } ? }, 100) }
this.maxLength 默認(rèn)設(shè)置 0 就行,要記得在上傳成功(完成)后需要設(shè)置為默認(rèn) 0。
下面附上我完整的代碼
change 事件
handleChange(file, fileList) { ? /* ? ? ? 自動上傳改成true會導(dǎo)致重復(fù)觸發(fā),所以在handleChange上傳文件 ? ? */ ? // ?防抖 ? let length = fileList.length ? this.maxLength = Math.max(length, this.maxLength) ? setTimeout(() => { ? ? if (length === this.maxLength) { ? ? ? ? // 圖片驗(yàn)證 ? ? ? this.uploadFilesVerification(fileList) ? ? } ? }, 100) }
圖片驗(yàn)證: uploadFilesVerification
// 圖片驗(yàn)證 async uploadFilesVerification(fileList) { ? let resFileList = [] ? for (const key in fileList) { ? ? console.log('fileList[key] :>> ', fileList[key]) ? ? // 判斷文件大小(5M) ? ? if (fileList[key].size > 1024 * 1024 * 5) { ? ? ? this.$message.warning('圖片大小不可以超過5M') ? ? ? return ? ? } ? ? // 圖片壓縮(這里用的 lrz,項(xiàng)目不需要可以忽略) ? ? const lrzData = await lrz(fileList[key].raw, { quality: 0.5 }) ? ? // 內(nèi)容驗(yàn)證 ? ? // ?xxxx ? ? ? resFileList.push(lrzData.origin) ? } ? ? // 上傳圖片 ? this.customUploadFn(resFileList) ? }
自定義上傳:customUploadFn
// 自定義上傳 async function customUploadFn(fileList) { ? let form = new FormData() ? fileList.forEach((item) => { ? ? form.append('files', item) ? }) ? const { data } = await uploadFiles(form) // 上傳 api 接口 ? console.log('data :>> ', data) ? data.forEach((item) => { ? ? this.goodsImgList.push(item) // 圖片回顯數(shù)組 ? }) ? this.fileList = [] // 清空圖片已經(jīng)上傳的圖片列表(綁定在上傳組件的file-list) ? this.maxLength = 0 // 恢復(fù)默認(rèn)值 }
el-upload自定義上傳觸發(fā)多次change事件解決
昨天在做項(xiàng)目時,有個附件上傳的需求,需要使用formdata上傳文件,并且支持多文件上傳,使用el-upload on-change時發(fā)現(xiàn)會調(diào)用多次,以下是我整理出來規(guī)避的方法。
vue部分:
<el-upload ?:on-change="handleUpload" ?:on-remove="handleRemove" ?:auto-upload="false" ?:show-file-list="false" ?drag ?action="#" ?ref="upload" ?multiple ?style="display:none;" ?> ? <div class="el-upload__text">拖拽文件或點(diǎn)擊上傳</div> </el-upload>
ts/js部分:
? // 附件上傳 ? private handleUpload(file, fileList) { ? ? let length = fileList.length; ? ? this.maxFileLength = Math.max(length, this.maxFileLength) ? ? setTimeout(() => { ? ? ? if (this.maxFileLength !== length) { ? ? ? ? return ? ? ? } ? ? ? fileList.forEach(item => { ? ? ? ? this.fileList.push(item.raw) ? ? ? }) ? ? }, 0) ? }
定義一個全局變量maxFileLength 用于計算當(dāng)前上傳次數(shù),如果上傳次數(shù)等于上傳文件的數(shù)量長度則將文件放到當(dāng)前下發(fā)文件的參數(shù)中。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue+Element UI實(shí)現(xiàn)下拉菜單的封裝
這篇文章主要為大家詳細(xì)介紹了Vue+Element UI實(shí)現(xiàn)下拉菜單的封裝代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09Vue?Router動態(tài)路由實(shí)現(xiàn)實(shí)現(xiàn)更靈活的頁面交互
Vue?Router是Vue.js官方的路由管理器,用于構(gòu)建SPA(單頁應(yīng)用程序),本文將深入探討Vue?Router的動態(tài)路由功能,希望可以幫助大家更好地理解和應(yīng)用Vue.js框架2024-02-02基于vue實(shí)現(xiàn)swipe輪播組件實(shí)例代碼
本篇文章主要介紹了基于vue實(shí)現(xiàn)swipe輪播組件實(shí)例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05vue輸入框使用模糊搜索功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue輸入框使用模糊搜索功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05vue監(jiān)聽瀏覽器的后退和刷新事件,阻止默認(rèn)的事件方式
這篇文章主要介紹了vue監(jiān)聽瀏覽器的后退和刷新事件,阻止默認(rèn)的事件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10vue.js使用Element-ui實(shí)現(xiàn)導(dǎo)航菜單
這篇文章主要為大家詳細(xì)介紹了vue.js使用Element-ui中實(shí)現(xiàn)導(dǎo)航菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09Vue 關(guān)閉當(dāng)前頁、關(guān)閉當(dāng)前標(biāo)簽tagsView的實(shí)現(xiàn)方法
這篇文章主要介紹了Vue 關(guān)閉當(dāng)前頁、關(guān)閉當(dāng)前標(biāo)簽tagsView,主要有兩種方式,一種是在vue頁面直接實(shí)現(xiàn),另一種在js文件中寫自定義函數(shù),在vue頁面中調(diào)用,本文通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08vue2實(shí)現(xiàn)封裝動態(tài)表單組件
這篇文章主要介紹了vue2實(shí)現(xiàn)封裝動態(tài)表單組件,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08