事情要從一次開發一個功能開始說起,我使用的是在el-dialog里面放el-form來存放表單數據,點擊按鈕后顯示el-dialog,然后添加、編輯、查看都使用同一個el-dialog。
然后在操作完編輯后,我再次去點擊添加,就發現編輯的數據留在el-dialog里面了,這顯然不是我想要的結果。
然后就去文檔里面找,能不能打開彈框時把表單重置了。
然后我就寫了如下代碼(偽代碼)
// 打開點擊添加按鈕處理
handleAdd(){
// 打開彈框(略)
// 重置表單
this.$refs['form'].resetFields()
// 加載數據(略)
}
發現不起作用,控制台一直提示 this.$refs['form'] 為 undefined,然后又看了官方文檔:
原來如此,那我們就寫個 handleOpenDialogForm 的方法,在打開 el-dialog 進行重置表單吧。
但是這顯然有問題,如果重置方法在數據回填后執行了,那我們在編輯和查看時豈不是一直顯示空數據了。
el-dialog 既然有 open 事件,那如果有 close 事件的話,我們在關閉彈框時重置表單,這不就可以了。
看了 el-dialog 的文檔,的確有close事件,然后我就寫了這樣的代碼:
// 關閉彈框,清空表單
handleCloseDialogForm() {
// 重置表單
this.$nextTick(() => {
this.$refs['form'].resetFields()
})
}
這樣在關閉彈框時就會重置表單為初始化的值了。但是初始化值指的是第一次加載的值,並不是指寫在data里面的默認值。所以按照上面的步驟操作以后,第一次點擊編輯按鈕,初始化值就會被記錄成編輯時加載的數據,然后關閉時就會重置成編輯時加載的數據。但是如果第一次點擊的是添加,初始化值就是data里面定義的默認值,就不會出現bug。
基於以上分析我們如果我們在第一次打開彈框的時候,把data里面定義的默認值設置進去,表單就會把這個值記錄為默認值。遺憾的是並沒有相關操作的API,這個方法沒法使用。
以上就是使用 resetFields 時遇到的問題,筆者技術能力有限以上方法就棄用了。
解決方法:
既然以上方法我們做不了的話,我們得想其他方法。
我們可以定義一個變量,把data里面初始化的值拷貝到這個變量里面,然后不去修改它,這樣我們就可以得到data的默認值。在關閉彈框時,我們把這個變量的值賦值給data,這樣data里面的值就是初始化的值了。