前段時間碰到一個腦瓜賊疼的問題,後臺管理有個需求,須要一次性多選文件,且選擇後立刻上傳文件.用的是element-uivue
百度找不到,element不提供選擇數量屬性,網上大部分提供的方案都是選擇後手動插入FrameData 表單再手動提交,有點麻煩啊程序員
也嘗試了數十種變量判斷算法,實在不行,再程序員不服氣毅力趨勢下,花了好長時間N天的摸爬滾打,跟了數十遍element 源碼,算法
分析了input 對象的全部屬性,終於讓俺獲取到了上傳數量element-ui
先上代碼後分析:ui
1.先說說原理this
文件上傳本質上是經過input 標籤上傳,無論是element 或者其餘第三方,用的intput 標籤spa
input 提供了on-change 事件,在文件選擇完成後就能獲取到獲取的文件數量,和文件信息,element-ui 的upload 其實用的也是input 從下面這段element 源碼中就能看出,上element upload源碼code
render(h) { let { handleClick, drag, name, handleChange, multiple, accept, listType, uploadFiles, disabled, handleKeydown } = this; const data = { class: { 'el-upload': true }, on: { click: handleClick, keydown: handleKeydown } }; data.class[`el-upload--${listType}`] = true; return ( <div {...data} tabindex="0" > { drag ? <upload-dragger disabled={disabled} on-file={uploadFiles}>{this.$slots.default}</upload-dragger>
: this.$slots.default } <input class="el-upload__input" type="file" ref="input" name={name} on-change={handleChange} multiple={multiple} accept={accept}></input>
</div>
); } handleChange(ev) { const files = ev.target.files; if (!files) return; this.uploadFiles(files); },
從上面2端代碼能夠看出,element 也是這樣獲取文件數量的,知道了這個真相就好辦了,對象
只要找到存放文件的input不就行了嗎,找了好久 element upload 實際上是有2個組件, 外部index.vue組件建立的upload子組件,因此不比較很差找,只能從f12 裏面一個個去跟蹤blog
最終發現 在elemet-upload的Dom下面有多個 上傳input 真實的是第0個 ,且只能在onchange 事件的時候獲取到.
但願能幫助到你們,碰到問題不要怕,就是肝,程序員就是想盡辦法解決問題的.碰到問題花時間看基礎,必定會有辦法的. 加油!!!!!