element自定義 多文件上傳 觸發(fā)多次on-change問題
element自定義 多文件上傳 觸發(fā)多次on-change
由于項目需要,圖片上傳需要進行壓縮之后在調(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會導致重復觸發(fā),所以在handleChange上傳文件
? ? */
? // ?防抖
? let length = fileList.length
? this.maxLength = Math.max(length, this.maxLength)
? setTimeout(() => {
? ? if (length === this.maxLength) {
? ? ? // 你的上傳文件邏輯
? ? }
? }, 100)
}this.maxLength 默認設(shè)置 0 就行,要記得在上傳成功(完成)后需要設(shè)置為默認 0。
下面附上我完整的代碼
change 事件
handleChange(file, fileList) {
? /*
? ? ? 自動上傳改成true會導致重復觸發(fā),所以在handleChange上傳文件
? ? */
? // ?防抖
? let length = fileList.length
? this.maxLength = Math.max(length, this.maxLength)
? setTimeout(() => {
? ? if (length === this.maxLength) {
? ? ? ? // 圖片驗證
? ? ? this.uploadFilesVerification(fileList)
? ? }
? }, 100)
}圖片驗證: uploadFilesVerification
// 圖片驗證
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,項目不需要可以忽略)
? ? const lrzData = await lrz(fileList[key].raw, { quality: 0.5 })
? ? // 內(nèi)容驗證
? ? // ?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 // 恢復默認值
}el-upload自定義上傳觸發(fā)多次change事件解決
昨天在做項目時,有個附件上傳的需求,需要使用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">拖拽文件或點擊上傳</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 用于計算當前上傳次數(shù),如果上傳次數(shù)等于上傳文件的數(shù)量長度則將文件放到當前下發(fā)文件的參數(shù)中。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue3+Vue Router實現(xiàn)動態(tài)路由導航的示例代碼
隨著單頁面應用程序(SPA)的日益流行,前端開發(fā)逐漸向復雜且交互性強的方向發(fā)展,在這個過程中,Vue.js及其生態(tài)圈的工具(如Vue Router)為我們提供了強大的支持,本文將介紹如何在Vue 3中使用Vue Router實現(xiàn)動態(tài)路由導航,需要的朋友可以參考下2024-08-08
vue?ElementUI級聯(lián)選擇器回顯問題解決
這篇文章主要介紹了vue?ElementUI級聯(lián)選擇器回顯問題解決,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09
Vue3使用TypeIt實現(xiàn)文字打字機效果的代碼示例
在現(xiàn)代網(wǎng)頁設(shè)計中,文字打字機效果是一種非常流行的動畫效果,能夠吸引用戶的注意力并提升用戶體驗,本文將介紹如何在 Vue 3 中使用 TypeIt 庫實現(xiàn)文字打字機效果,并分享一些實用的技巧和示例,需要的朋友可以參考下2025-01-01
優(yōu)雅的將ElementUI表格變身成樹形表格的方法步驟
這篇文章主要介紹了優(yōu)雅的將ElementUI表格變身成樹形表格的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04

