El-form 的 resetFields 的參照資料是在「一開始生成」的時候取得的。若你想要讓 create 和 update 都共用同樣的元件,那會需要作一些額外操作來讓 El-form 元件更新參照。這邊筆記下兩種方式。
程式碼
方法一
在 resetFields 方法呼叫時,也手動更新你的 model 值參照。你可以用 Object.assign() 方法或是 lodash 函式的 cloneDeep()
1 2 3 4 |
const handleReset = (form: FormInstance | undefined) => { form?.resetFields() formDataModel.value = cloneDeep(props.originalValue) } |
方法二
由於 resetFields 方法也可讓 form 的重新生成來達成更新,因此你可以用 nextTick 的方法來解決
1 2 3 4 5 6 7 8 9 10 |
const changeMode = ( mode: "create" | "update" | "", value: Record<string, any> ) => { currentMode.value = "" // force re-render nextTick(() => { currentMode.value = mode form.value = value }) } |
方法三
在外層的 Component 上加一個 key 值,每次觸發新增/更新表單按鈕時,就將 Component 的 key 值改變 ( 通常是 +1 ),這樣一來就會讓 Component 更新。
1 2 3 4 5 6 7 8 9 10 11 |
<template> <MyComponent :key="componentKey" /> </template> import { ref } from 'vue'; const componentKey = ref(0); const forceRerender = () => { componentKey.value += 1; }; |
參考資料
1. 解决Element resetFields()重置表单不生效的问题
2. The correct way to force Vue to re-render a component