1.起因
1.1現象
1.2程式碼:
<Form ref="formRef" :model="formState" style="padding-left: 8px;margin-bottom: 20px" :rules="rules">
<Form-item label="角色名" name="roleName">
<Input v-model:value="roleName" style="width: 200px"/>
</Form-item>
<Form-item label="狀態" name="roleStatus" v-if="type==='add' || type==='edit'">
<RadioGroup v-model:value="roleStatus" >
<Radio :value="1">啟用</Radio>
<Radio :value="0">禁用</Radio>
</RadioGroup>
</Form-item>
</Form>
... js
const formState = reactive({
roleName: '',
roleStatus: 1
})
const rules = {
roleName: [{ required: true, message: '請填寫角色名', trigger: 'blur' }],
roleStatus: [{ required: true, message: '請選擇狀態', trigger: 'blur' }]
}
...
2.逐漸抓狂
經過半個多小時反覆的對照官方用例,以及之前寫過的程式碼
經過不斷的不斷的嘗試
我99.99%的確定自己的程式碼沒啥問題臥槽 ,為啥提示狀態沒有選, 一直讓我選狀態 MDZZ
3.進展
雖然我可以睡服產品,取消狀態必選的驗證,繞過這個問題,但是這不符合我的風格。
收拾心態,重新上路。
從這個warning開始入手debbug吧
index.js?2a95:120 async-validator: ["'${name}' is not a valid ${type}"]
先點進去,打個斷點
然後復現一下錯誤 找到呼叫棧
棧底的是你寫的方法,棧頂的是庫的方法,有時間的可以一步步看一下大體流程。
我直接看的棧頂的幾個函式
4.真相
方法還是打斷點觀察
首先這個type:string讓我有點不好的聯想。這尼瑪是哪來的,官網用例用的字串,我為了傳後端引數方便用的數字,這個當時反覆對比的時候有注意過,沒有引起我的警覺。平時基本也沒加過這個引數。
繼續往下除錯,呼叫string方法。
string方法裡面又呼叫type 然後把我的錯誤給push進去了
然後我就悟了,估計是型別錯誤,但是尼瑪能不能不要報我自定義的錯誤,就不能報個型別錯誤嗎,干擾我debbuge方向
解決方法:加個type。完美解決
const rules = {
roleName: [{ required: true, message: '請填寫角色名', trigger: 'blur' }],
roleStatus: [{ type: 'number', required: true, message: '請選擇狀態', trigger: 'blur' }]
}
5.總結
有洗Bug確實雲裡霧裡,建議錯誤棧裡原始碼除錯下,這樣還快一點。