思路:調用input的focus()事件,聚焦到失敗的input框上,
問題:如何獲取失敗的input框,結合element的校驗方法,查看可以提供入口的地方
調用this.$refs[formName].validate()時的具體操作:
field信息:
內部‘field’信息:
驗證失敗的返回值invalidFields信息:
問題:如何根據校驗失敗的field定位到相應的input框?
返回的校驗失敗的對象信息,只包含了prop的名字和失敗的提示信息,根據這兩項無法獲取到對應的input框(ps:此時不知道如何利用返回的invalidFields的信息跟組件進行綁定)
第一次嘗試
仿照form.validate()方法重寫一個驗證,獲取所有的fields,同樣是循環遍歷調用field.validate()方法,在某個field驗證失敗時,自動聚焦到此input框上
此時的field是el-form-item組件,只有一個child就是el-input,可以看到此child下包含focus方法
弊端:field.$children[0]太過於局限,當此el-form-item中包含其他的組件時,索引為0的不一定是input框,如:
此時,field.$children[0]是一個el-button組件,此組件沒有focus方法,會導致報錯
最終解決辦法
在之前的debug過程中可以看到element-ui自帶的表單驗證返回中包含一個invalidFields對象,此對象包含了驗證失敗的所有屬性名,如下圖所示:
通過遍歷invalidFields的屬性(ps:之后才知道for可以遍歷一個對象的所有屬性),在對應的input框上添加ref屬性,直接根據ref就可精確地獲取到元素
注意:input的readonly和disabled屬性
disabled和readonly:
共同點:
都設為true,則form屬性將不能被編輯;
不同點:
disabled=true時,該表單項不能獲取焦點,表單提交時此項不會提交;
readonly只針對input(text / password)和textarea表單項有效,設置為true時,依然可以獲取焦點,提交時此項也會提交;
參考鏈接:
https://blog.csdn.net/m0_37972557/article/details/81357607