Skip to content

Commit fea83cf

Browse files
committed
fix(useForm): improve reactivity and reset logic
Wrap defaults in $state for reactivity and update setFormData to trigger updates for each property. Refactor reset to handle specific fields more reliably and ensure correct default values are restored.
1 parent fef4783 commit fea83cf

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

packages/svelte5/src/useForm.svelte.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export default function useForm<TForm extends FormDataType<TForm>>(
6060
? (router.restore(rememberKey) as { data: TForm; errors: Record<FormDataKeys<TForm>, string> } | null)
6161
: null
6262

63-
let defaults = cloneDeep(initialData)
63+
let defaults = $state(cloneDeep(initialData))
6464
let cancelToken: { cancel: () => void } | null = null
6565
let recentlySuccessfulTimeoutId: ReturnType<typeof setTimeout> | null = null
6666
let transform = (data: TForm) => data as object
@@ -96,7 +96,10 @@ export default function useForm<TForm extends FormDataType<TForm>>(
9696
if (typeof keyOrData === 'string') {
9797
set(formData, keyOrData, maybeValue)
9898
} else {
99-
Object.assign(formData, keyOrData)
99+
// For runes, we need to update each property individually to trigger reactivity
100+
Object.keys(keyOrData).forEach(key => {
101+
set(formData, key, get(keyOrData, key))
102+
})
100103
}
101104
}
102105

@@ -135,16 +138,18 @@ export default function useForm<TForm extends FormDataType<TForm>>(
135138
},
136139

137140
reset(...fields: FormDataKeys<TForm>[]) {
138-
const clonedData = cloneDeep(defaults)
139141
if (fields.length === 0) {
142+
// Reset all fields
143+
const clonedData = cloneDeep(defaults)
140144
setFormData(clonedData)
141145
} else {
142-
const resetData = fields
143-
.filter((key) => has(clonedData, key))
144-
.reduce((carry, key) => {
145-
return set(carry, key, get(clonedData, key))
146-
}, {} as Partial<TForm>)
147-
setFormData(resetData as TForm)
146+
// Reset specific fields
147+
fields.forEach(field => {
148+
if (has(defaults, field)) {
149+
const defaultValue = get(defaults, field)
150+
setFormData(field as keyof TForm, defaultValue)
151+
}
152+
})
148153
}
149154

150155
return form

0 commit comments

Comments
 (0)