el-form實(shí)現(xiàn)表單和圖片手動(dòng)上傳和校驗(yàn)功能
在寫項(xiàng)目時(shí),難免遇到需要上傳表單,圖片等文件。且表單內(nèi)容需進(jìn)行驗(yàn)證及必填項(xiàng)提示,圖片需要和信息一起傳遞且圖片載入后需可預(yù)覽。
這里舉一個(gè)例子:
表單數(shù)據(jù)
從上面的圖可以看出注冊(cè)環(huán)節(jié)分為了兩部分?jǐn)?shù)據(jù),左邊是注冊(cè)時(shí)需求提交的表單信息,右邊是需求上傳的圖片。先來(lái)解決左邊的表單數(shù)據(jù),el-form是ElementUI封裝的表單組件,可以收集、校驗(yàn)和提交數(shù)據(jù)。el-form中的model用來(lái)綁定表單數(shù)據(jù)對(duì)象,el-form-item中的prop為model對(duì)象中傳遞的字段,el-input中的v-model綁定的是該字段對(duì)應(yīng)的屬性值。
<el-form :model='loginForm' autocomplete='on' :rules='rules' class='login-form'> <el-form-item prop='username' label='用戶名'> <el-input placeholder='請(qǐng)輸入用戶名' name='username' type='text' v-model='loginForm.username' autocomplete='on'/> <el-form-item> </el-form>
el-upload組件
input的name屬性是用來(lái)定義input元素的名稱,只有設(shè)置了 name 屬性的表單元素才能在提交表單時(shí)傳遞它們的值。input的value屬性的type屬性來(lái)決定,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ù)來(lái)獲取上傳過(guò)程中的屬性狀態(tài)等信息。
表單驗(yàn)證
ElementUI提供了表單驗(yàn)證的規(guī)則,可以通過(guò)rules屬性來(lái)定義對(duì)應(yīng)el-form-item中的驗(yàn)證規(guī)則(支持多個(gè)規(guī)則驗(yàn)證)。當(dāng)然如果覺(jué)得ElementUI提供的表單驗(yàn)證功能無(wú)法滿足項(xiàng)目需求我們也可以自定義驗(yàn)證規(guī)則。通過(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提供了一個(gè)封裝好的的上傳組件el-upload,封裝了文件上傳的一系列鉤子函數(shù),可以監(jiān)聽文件上傳過(guò)程中的所有事件。el-upload連請(qǐng)求也封裝了,只要通過(guò)action提供請(qǐng)求路徑(后端文件的上傳地址)就可以將文件直接上傳到服務(wù)器。
文件上傳樣式設(shè)計(jì)
根據(jù)自己的需求設(shè)計(jì)一個(gè)文件樣式,這里我用虛擬邊框來(lái)顯示文件上傳區(qū)域。中間放個(gè)圖標(biāo)來(lái)觸發(fā)input選框,圖片文件上傳后就可以直接在當(dāng)前區(qū)域進(jìn)行預(yù)覽。
阻止自動(dòng)上傳并獲取文件
在el-upload中定義屬性:auto-upload=“false” 可以禁止文件自動(dòng)上傳,既然禁止了自動(dòng)上傳那么我們就需要拿到文件對(duì)象。通過(guò)upload組件的on-change屬性我們可以監(jiān)聽文件添加、上傳時(shí)的狀態(tài)改變,利用該屬性觸發(fā)自定義事件可以獲取到需要的文件屬性。利用window.createObjectURL(e.raw)創(chuàng)建圖片地址實(shí)現(xiàn)本地預(yù)覽,如果fileList長(zhǎng)度大于0說(shuō)明已經(jīng)上傳了圖片這時(shí)我們就通過(guò)clearValidate去掉校驗(yàn)提示。
表單和圖片上傳
有文件的form表單上傳數(shù)據(jù)要用formData類型,我們需要?jiǎng)?chuàng)建一個(gè) FormData 對(duì)象來(lái)接收文件數(shù)據(jù)。選擇了圖片并填寫必填信息之后點(diǎn)擊【注冊(cè)】按鈕發(fā)起注冊(cè)請(qǐng)求,在register 方法里把表單信息通過(guò)append將數(shù)據(jù)添加到formData中。然后利用axios向后臺(tái)發(fā)起注冊(cè)請(qǐng)求并發(fā)送注冊(cè)信息,res為返回的請(qǐng)求結(jié)果。
總結(jié):
這里主要是多了圖片的手動(dòng)上傳,el-upload組件默認(rèn)會(huì)自動(dòng)上傳提交的文件。這里要求圖片不允許自動(dòng)上傳,需要和信息一起在提交的時(shí)候進(jìn)行傳遞。
附上源碼供參考:
<el-form :model="loginForm" autocomplete="on" :rules="rules" class="login-form"> <div> <el-form-item prop="username" label="用戶名"> <el-input placeholder="請(qǐng)輸入用戶名" name="username" type="text" v-model="loginForm.username" autocomplete="on" /> </el-form-item> <el-form-item prop="file" label="營(yíng)業(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: '請(qǐng)輸入用戶名', trigger: 'blur' }, { validator: check.Username, trigger: 'blur' } ], password: [ { required: true, message: '請(qǐng)輸入密碼', trigger: 'blur' }, { validator: check.SimplePwd, trigger: 'blur' } ], company: [ { required: true, message: '請(qǐng)輸入公司名稱', trigger: 'blur' }, { validator: check.Company, trigger: 'blur' } ], phone: [ { required: true, message: '請(qǐng)輸入手機(jī)號(hào)', trigger: 'blur' }, { validator: check.Phone, trigger: 'blur' } ], email: [ { required: true, message: '請(qǐng)輸入郵箱', trigger: 'blur' }, { validator: check.Email, trigger: 'blur' } ], file: [ { required: true, message: '請(qǐng)上傳營(yíng)業(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)表單和圖片手動(dòng)上傳和校驗(yàn)的文章就介紹到這了,更多相關(guān)el-form表單和圖片上傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue實(shí)現(xiàn)多個(gè)el-form表單提交統(tǒng)一校驗(yàn)的2個(gè)方法
- elementUI動(dòng)態(tài)嵌套el-form表單校驗(yàn)舉例詳解
- 使用el-form之表單校驗(yàn)自動(dòng)定位到報(bào)錯(cuò)位置問(wèn)題
- vue中的el-form表單rule校驗(yàn)問(wèn)題(特殊字符、中文、數(shù)字等)
- vue之el-form表單校驗(yàn)以及常用正則詳解
- el-form的model、prop屬性和表單校驗(yàn)等使用
- v-for中動(dòng)態(tài)校驗(yàn)el-form表單項(xiàng)的實(shí)踐
- el-form表單實(shí)現(xiàn)校驗(yàn)的示例代碼
相關(guān)文章
uniapp?Android解決?APP菜單、按鈕權(quán)限控制方法
這篇文章主要介紹了uniapp?Android解決?APP菜單、按鈕權(quán)限控制方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01JavaScript實(shí)現(xiàn)環(huán)繞鼠標(biāo)旋轉(zhuǎn)效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)環(huán)繞鼠標(biāo)旋轉(zhuǎn)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Google 爬蟲如何抓取 JavaScript 的內(nèi)容
我們測(cè)試了谷歌爬蟲是如何抓取 JavaScript,下面就是我們從中學(xué)習(xí)到的知識(shí),需要的朋友可以參考下2017-04-04JavaScript實(shí)現(xiàn)煙花綻放動(dòng)畫效果
這篇文章主要介紹了JavaScript如何實(shí)現(xiàn)煙花綻放動(dòng)畫效果,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-08-08javascript實(shí)現(xiàn)列表滾動(dòng)的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)列表滾動(dòng)的方法,較為詳細(xì)的分析了javascript實(shí)現(xiàn)列表滾動(dòng)的頁(yè)面布局及javascript滾動(dòng)效果的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07JavaScript中innerHTML,innerText,outerHTML的用法及區(qū)別
在javascript中如果我們要獲取對(duì)象內(nèi)容,js為我們提供了三種方法outerhtml、innerhtml和innertext,但他們之間具體怎么使用與具體的區(qū)別在哪里,可能很多人不知道吧,接下來(lái)跟著小編一起來(lái)學(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