您可能会发现自己需要链接两个字段;当一个字段因另一个字段的值发生变化而需要验证时。一种这样的用法是,您同时拥有一个 password 和 confirm_password 字段,您希望在 password 的值不匹配时,confirm_password 字段报错;无论哪个字段触发了值更改。
想象一下以下用户流程
在此示例中,表单仍会显示错误,因为“确认密码”字段的验证尚未重新运行以标记为已接受。
要解决此问题,我们需要确保在更新密码字段时重新运行“确认密码”验证。为此,您可以为 confirm_password 字段添加一个 onChangeListenTo 属性。
<script>
import { createForm } from '@tanstack/svelte-form'
const form = createForm(() => ({
defaultValues: {
password: '',
confirm_password: '',
},
// ...
}))
</script>
<div>
<form.Field name="password">
{#snippet children(field)}
<label>
<div>Password</div>
<input
value={field.state.value}
onChange={(e) => field.handleChange(e.target.value)}
/>
</label>
{/snippet}
</form.Field>
<form.Field
name="confirm_password"
validators={{
onChangeListenTo: ['password'],
onChange: ({ value, fieldApi }) => {
if (value !== fieldApi.form.getFieldValue('password')) {
return 'Passwords do not match'
}
return undefined
},
}}
>
{#snippet children(field)}
<div>
<label>
<div>Confirm Password</div>
<input
value={field.state.value}
onchange={(e) => field.handleChange(e.target.value)}
/>
</label>
{#each field.state.meta.errors as err}
<div>{err}</div>
{/each}
</div>
{/snippet}
</form.Field>
</div>
<script>
import { createForm } from '@tanstack/svelte-form'
const form = createForm(() => ({
defaultValues: {
password: '',
confirm_password: '',
},
// ...
}))
</script>
<div>
<form.Field name="password">
{#snippet children(field)}
<label>
<div>Password</div>
<input
value={field.state.value}
onChange={(e) => field.handleChange(e.target.value)}
/>
</label>
{/snippet}
</form.Field>
<form.Field
name="confirm_password"
validators={{
onChangeListenTo: ['password'],
onChange: ({ value, fieldApi }) => {
if (value !== fieldApi.form.getFieldValue('password')) {
return 'Passwords do not match'
}
return undefined
},
}}
>
{#snippet children(field)}
<div>
<label>
<div>Confirm Password</div>
<input
value={field.state.value}
onchange={(e) => field.handleChange(e.target.value)}
/>
</label>
{#each field.state.meta.errors as err}
<div>{err}</div>
{/each}
</div>
{/snippet}
</form.Field>
</div>
这同样适用于 onBlurListenTo 属性,它会在字段失去焦点时重新运行验证。
您的每周 JavaScript 资讯。每周一免费发送给超过 10 万开发者。