el-form實(shí)現(xiàn)表單和圖片手動上傳和校驗(yàn)功能
在寫項目時,難免遇到需要上傳表單,圖片等文件。且表單內(nèi)容需進(jìn)行驗(yàn)證及必填項提示,圖片需要和信息一起傳遞且圖片載入后需可預(yù)覽。
這里舉一個例子:
表單數(shù)據(jù)
從上面的圖可以看出注冊環(huán)節(jié)分為了兩部分?jǐn)?shù)據(jù),左邊是注冊時需求提交的表單信息,右邊是需求上傳的圖片。先來解決左邊的表單數(shù)據(jù),el-form是ElementUI封裝的表單組件,可以收集、校驗(yàn)和提交數(shù)據(jù)。el-form中的model用來綁定表單數(shù)據(jù)對象,el-form-item中的prop為model對象中傳遞的字段,el-input中的v-model綁定的是該字段對應(yīng)的屬性值。
<el-form :model='loginForm' autocomplete='on' :rules='rules' class='login-form'> <el-form-item prop='username' label='用戶名'> <el-input placeholder='請輸入用戶名' name='username' type='text' v-model='loginForm.username' autocomplete='on'/> <el-form-item> </el-form>
el-upload組件
input的name屬性是用來定義input元素的名稱,只有設(shè)置了 name 屬性的表單元素才能在提交表單時傳遞它們的值。input的value屬性的type屬性來決定,type屬性屬性可以是button、reset、submit、text、password、hidden、checkbox、radio、image、file等。el-upload組件就是封裝的type屬性為file的input,并提供了before-upload、on-progress、on-success、on-error、on-preview、on-remove等鉤子函數(shù)來獲取上傳過程中的屬性狀態(tài)等信息。
表單驗(yàn)證
ElementUI提供了表單驗(yàn)證的規(guī)則,可以通過rules屬性來定義對應(yīng)el-form-item中的驗(yàn)證規(guī)則(支持多個規(guī)則驗(yàn)證)。當(dāng)然如果覺得ElementUI提供的表單驗(yàn)證功能無法滿足項目需求我們也可以自定義驗(yàn)證規(guī)則。通過validator屬性調(diào)用自定義的校驗(yàn)方法,自定義校驗(yàn)callback必須被調(diào)用。自定義校驗(yàn)規(guī)則可以參考文章自定義表單校驗(yàn)規(guī)則及常用表單校驗(yàn),我將一些常用的校驗(yàn)都寫在了一起方便后續(xù)直接使用。
文件上傳HTML構(gòu)建
ElementUI提供了一個封裝好的的上傳組件el-upload,封裝了文件上傳的一系列鉤子函數(shù),可以監(jiān)聽文件上傳過程中的所有事件。el-upload連請求也封裝了,只要通過action提供請求路徑(后端文件的上傳地址)就可以將文件直接上傳到服務(wù)器。
文件上傳樣式設(shè)計
根據(jù)自己的需求設(shè)計一個文件樣式,這里我用虛擬邊框來顯示文件上傳區(qū)域。中間放個圖標(biāo)來觸發(fā)input選框,圖片文件上傳后就可以直接在當(dāng)前區(qū)域進(jìn)行預(yù)覽。
阻止自動上傳并獲取文件
在el-upload中定義屬性:auto-upload=“false” 可以禁止文件自動上傳,既然禁止了自動上傳那么我們就需要拿到文件對象。通過upload組件的on-change屬性我們可以監(jiān)聽文件添加、上傳時的狀態(tài)改變,利用該屬性觸發(fā)自定義事件可以獲取到需要的文件屬性。利用window.createObjectURL(e.raw)創(chuàng)建圖片地址實(shí)現(xiàn)本地預(yù)覽,如果fileList長度大于0說明已經(jīng)上傳了圖片這時我們就通過clearValidate去掉校驗(yàn)提示。
表單和圖片上傳
有文件的form表單上傳數(shù)據(jù)要用formData類型,我們需要創(chuàng)建一個 FormData 對象來接收文件數(shù)據(jù)。選擇了圖片并填寫必填信息之后點(diǎn)擊【注冊】按鈕發(fā)起注冊請求,在register 方法里把表單信息通過append將數(shù)據(jù)添加到formData中。然后利用axios向后臺發(fā)起注冊請求并發(fā)送注冊信息,res為返回的請求結(jié)果。
總結(jié):
這里主要是多了圖片的手動上傳,el-upload組件默認(rèn)會自動上傳提交的文件。這里要求圖片不允許自動上傳,需要和信息一起在提交的時候進(jìn)行傳遞。
附上源碼供參考:
<el-form :model="loginForm" autocomplete="on" :rules="rules" class="login-form"> <div> <el-form-item prop="username" label="用戶名"> <el-input placeholder="請輸入用戶名" name="username" type="text" v-model="loginForm.username" autocomplete="on" /> </el-form-item> <el-form-item prop="file" label="營業(yè)執(zhí)照"> <el-upload class="fileupload" ref="upload" action="http://www.fiitool.com/upload" ::limit="1" :show-file-list="false" :on-change="PicturePreview" :auto-upload="false" accept="image/png,image/gif,image/jpg,image/jpeg"> <i class="el-icon-upload avatar-uploader-icon"></i> <div v-show="!dialogImageUrl" slot="tip" class="el-upload__text upload__tip">上傳照片</div> </el-upload> </el-form-item> </el-form> rules: { username: [ { required: true, message: '請輸入用戶名', trigger: 'blur' }, { validator: check.Username, trigger: 'blur' } ], password: [ { required: true, message: '請輸入密碼', trigger: 'blur' }, { validator: check.SimplePwd, trigger: 'blur' } ], company: [ { required: true, message: '請輸入公司名稱', trigger: 'blur' }, { validator: check.Company, trigger: 'blur' } ], phone: [ { required: true, message: '請輸入手機(jī)號', trigger: 'blur' }, { validator: check.Phone, trigger: 'blur' } ], email: [ { required: true, message: '請輸入郵箱', trigger: 'blur' }, { validator: check.Email, trigger: 'blur' } ], file: [ { required: true, message: '請上傳營業(yè)執(zhí)照' } ] } PicturePreview (file, fileList) { var URL = null if (window.createObjectURL !== undefined) { URL = window.createObjectURL(file.raw) // basic } else if (window.URL !== undefined) { URL = window.URL.createObjectURL(file.raw) // IE,google,360,Safari,firefox } else if (window.webkitURL !== undefined) { URL = window.webkitURL.createObjectURL(file.raw) // webkit } this.ImageUrl = URL this.registerForm.license = file.raw if (fileList.length > 0) { this.$refs['fileupload'].clearValidate() // 去掉file驗(yàn)證 } }, //CSS樣式 .files { .el-form-item { width: 100%; height: 100%; text-align: center; /deep/ { .el-form-item__content { border: 1px dashed #d9d9d9; border-radius: 6px; cursor: pointer; line-height: normal; padding: 5px; .fileupload { width: 100%; height: 100%; .uploader-icon { font-size: 40px; &:hover { color: royalblue; } } } } } } }
到此這篇關(guān)于el-form實(shí)現(xiàn)表單和圖片手動上傳和校驗(yàn)的文章就介紹到這了,更多相關(guān)el-form表單和圖片上傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
uniapp?Android解決?APP菜單、按鈕權(quán)限控制方法
這篇文章主要介紹了uniapp?Android解決?APP菜單、按鈕權(quán)限控制方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-01-01JavaScript實(shí)現(xiàn)環(huán)繞鼠標(biāo)旋轉(zhuǎn)效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)環(huán)繞鼠標(biāo)旋轉(zhuǎn)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01Google 爬蟲如何抓取 JavaScript 的內(nèi)容
我們測試了谷歌爬蟲是如何抓取 JavaScript,下面就是我們從中學(xué)習(xí)到的知識,需要的朋友可以參考下2017-04-04JavaScript實(shí)現(xiàn)煙花綻放動畫效果
這篇文章主要介紹了JavaScript如何實(shí)現(xiàn)煙花綻放動畫效果,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-08-08javascript實(shí)現(xiàn)列表滾動的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)列表滾動的方法,較為詳細(xì)的分析了javascript實(shí)現(xiàn)列表滾動的頁面布局及javascript滾動效果的實(shí)現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07JavaScript中innerHTML,innerText,outerHTML的用法及區(qū)別
在javascript中如果我們要獲取對象內(nèi)容,js為我們提供了三種方法outerhtml、innerhtml和innertext,但他們之間具體怎么使用與具體的區(qū)別在哪里,可能很多人不知道吧,接下來跟著小編一起來學(xué)習(xí)innerHTML,innerText,outerHTML的用法及區(qū)別吧。2015-09-09微信小程序?qū)崿F(xiàn)給嵌套template模板傳遞數(shù)據(jù)的方式總結(jié)
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)給嵌套template模板傳遞數(shù)據(jù)的方式,結(jié)合實(shí)例形式總結(jié)分析了微信小程序嵌套template模板的定義、調(diào)用、參數(shù)傳遞及相關(guān)使用技巧,需要的朋友可以參考下2017-12-12