From 13b194740f4764cf335a88e11172726c31eac6d2 Mon Sep 17 00:00:00 2001 From: Trandx <42522718+Trandx@users.noreply.github.com> Date: Wed, 13 May 2026 00:10:35 +0200 Subject: [PATCH] fix(forms): cleanup dynamically removed form fields --- .../core/src/baseeditableholder/BaseEditableHolder.vue | 6 ++++++ packages/forms/src/form/Form.vue | 1 + packages/forms/src/useform/index.js | 10 ++++++++++ 3 files changed, 17 insertions(+) diff --git a/packages/core/src/baseeditableholder/BaseEditableHolder.vue b/packages/core/src/baseeditableholder/BaseEditableHolder.vue index fcb4cfcf5f..fd7014a195 100644 --- a/packages/core/src/baseeditableholder/BaseEditableHolder.vue +++ b/packages/core/src/baseeditableholder/BaseEditableHolder.vue @@ -86,6 +86,12 @@ export default { } }, formField: {}, + beforeUnmount() { + // PATCHED: unregister field and clear form state on unmount + if (this.$formName) { + this.$pcForm?.unregister?.(this.$formName) + } + }, methods: { writeValue(value, event) { if (this.controlled) { diff --git a/packages/forms/src/form/Form.vue b/packages/forms/src/form/Form.vue index 3354befda4..61ed15dbb0 100644 --- a/packages/forms/src/form/Form.vue +++ b/packages/forms/src/form/Form.vue @@ -46,6 +46,7 @@ export default { submit, register, onSubmit, + unregister: $form.unregister, // PATCHED: expose unregister method to child form components onReset, ...omit($form, ['handleSubmit', 'handleReset']) }; diff --git a/packages/forms/src/useform/index.js b/packages/forms/src/useform/index.js index 50f8daea93..8fc765c8af 100644 --- a/packages/forms/src/useform/index.js +++ b/packages/forms/src/useform/index.js @@ -240,6 +240,15 @@ export const useForm = (options = {}) => { if (_states[field] !== undefined) _states[field].value = value; }; + const unregister = (field) => { + // PATCHED: remove field state and stop reactive watchers + if (fields[field]) { + fields[field]._watcher.stop(); + delete fields[field]; + } + delete _states[field]; + }; + const getFieldState = (field) => { return fields[field]?.states; }; @@ -257,6 +266,7 @@ export const useForm = (options = {}) => { return { defineField, setFieldValue, + unregister, getFieldState, handleSubmit, handleReset,