版本:iView 2.7.4
自從項目用了iView之后忙芒,感覺做新需求的一半時間都在瘋狂踩坑根灯,所以寫個文檔記錄一下踩過的坑毕源。
此篇為iView表單驗證的爬坑記錄岸更。
更新:2019.3.10
1、value為undefined
在項目開發(fā)中,表單驗證時一直出現(xiàn)各種“不能為空”法焰、驗證不通過等情況秧荆,但是自身輸入和驗證方法沒有問題時,一般來說是輸入框的value為undefined
的埃仪。
比較簡單的檢測方法就是寫一個驗證方法乙濒,打印或debugger
查看此時的輸入值的取值(value
)是否為輸入值,如果不是或為undefined
贵试,那么就是取值錯誤,而非驗證方法錯誤凯正。
參考文檔例子:
const validatePass = (rule, value, callback) => {
// 此時便能打印value值查看
};
解決方法:
- 表單的
ref="..."
是否有添加毙玻; - 表單的
:model="..."
是否有添加; - 表單的
:rules="..."
是否有添加廊散; - 表單的
ref="..."
和:model="..."
是否一致桑滩; - 表單的
FormItem
的屬性prop="..."
是否與輸入框(例如input)的v-moel="..."
模版名稱一致;
2允睹、驗證類型
雖然我們在官網(wǎng)上會看到類似例子:
{ type: 'email', message: 'Incorrect email format', trigger: 'blur' }
但是建議放棄利用這個方法驗證輸入值的數(shù)據(jù)類型运准。
例如,該驗證方法的type
類型有number
缭受,但它默認獲取輸入值為string
胁澳,所以會導致type
不符(并非因為輸入的值不是數(shù)字)。
現(xiàn)在用的版本中還未修復此問題米者,如果已修復則可忽視該建議
3.日期非空
在平時項目中韭畸,會遇到需要選擇日期,但提交時日期不能為空這一需求蔓搞,那么應該如何驗證胰丁?
根據(jù)上面第一條打印value
值,發(fā)現(xiàn)如果日期沒有選擇喂分,日期選擇器上的value
值為["",""]
(使用的是<DatePicker type="date"></DatePicker>
)锦庸。
解決方法:
這時候就不能根據(jù)長度驗證,所以必須循環(huán)/遍歷判斷value
的數(shù)組每一項是否為空蒲祈。
4.時間選擇器值類型
之前表單驗證時遇到一個問題甘萧,在不同電腦上,TimePicker
的最終數(shù)據(jù)值類型不同(不知道是否因為一個是Mac一個是Windows10)梆掸。
搜索了一下度娘幔嗦,發(fā)現(xiàn)也有其他人有類似問題。
問題為:
Mac上TimePicker
最終數(shù)據(jù)類型為數(shù)組沥潭,而Win10上TimePicker
最終數(shù)據(jù)類型為本地時區(qū)時間(例如:2017-11-16T05:23:20.000Z)邀泉。
解決方法:
表單提交前記得判斷TimePicker
最終數(shù)據(jù)的類型,避免傳值給后端時報錯。
5.屬性trigger不添加
表單驗證規(guī)則中汇恤,trigger
屬性填寫的是在什么情況下觸發(fā)該驗證庞钢,例如blur
或者change
。
但是我們會有某些需求因谎,需要讓該輸入框在提交的時候才驗證基括,并不需要實時驗證,此時就會有把trigger
刪掉的做法财岔。
該做法的結果是风皿,一進入有表單的頁面時,表單就會進行一次校驗匠璧。
6.校驗錯誤信息定制
有時候在項目中會有幾個表單的輸入框使用同一個校驗方法(比如校驗數(shù)字桐款、身份證之類的),需要根據(jù)頁面情況顯示特定的錯誤信息提示夷恍,但是這個校驗方法又是單獨一個JS文件魔眨。
那么可以在校驗規(guī)則上添加message
,寫上特定的錯誤信息提示酿雪,這樣頁面上顯示的就是特定的錯誤信息提示遏暴。
7.表單驗證成功沒有進方法
this.$refs[formName].validate((valid) => {
if (valid) { // 步驟1
alert('submit!');
} else {
console.log('error submit!!');
return false;
}
});
在規(guī)則中有未填或填錯,會有正常提示指黎,但是如果全部填寫朋凉,步驟1卻沒辦法判斷成功并進入方法,會直接報錯醋安,有可能是寫自定義規(guī)則的時候侥啤,沒有寫callback()
。