您可能会发现需要将两个字段链接在一起;当一个字段的值发生变化时,另一个字段需要重新验证。 一个常见的用法是当您同时拥有 password 和 confirm_password 字段时, 您希望当 password 的值不匹配时,confirm_password 字段显示错误; 无论是哪个字段触发了值的变化。
想象以下用户流程:
在此示例中,表单仍然会显示错误, 因为"确认密码"字段验证尚未重新运行以标记为已接受。
为了解决这个问题,我们需要确保在密码字段更新时重新运行"确认密码"验证。 为此,您可以向 confirm_password 字段添加 onChangeListenTo 属性。
export default function App() {
const form = createForm(() => ({
defaultValues: {
password: '',
confirm_password: '',
},
// ...
}))
return (
<div>
<form.Field name="password">
{(field) => (
<label>
<div>密码</div>
<input
value={field().state.value}
onChange={(e) => field().handleChange(e.target.value)}
/>
</label>
)}
</form.Field>
<form.Field
name="confirm_password"
validators={{
onChangeListenTo: ['password'],
onChange: ({ value, fieldApi }) => {
if (value !== fieldApi.form.getFieldValue('password')) {
return '密码不匹配'
}
return undefined
},
}}
>
{(field) => (
<div>
<label>
<div>确认密码</div>
<input
value={field().state.value}
onChange={(e) => field().handleChange(e.target.value)}
/>
</label>
<Index each={field().state.meta.errors}>
{(err) => <div>{err()}</div>}
</Index>
</div>
)}
</form.Field>
</div>
)
}
export default function App() {
const form = createForm(() => ({
defaultValues: {
password: '',
confirm_password: '',
},
// ...
}))
return (
<div>
<form.Field name="password">
{(field) => (
<label>
<div>密码</div>
<input
value={field().state.value}
onChange={(e) => field().handleChange(e.target.value)}
/>
</label>
)}
</form.Field>
<form.Field
name="confirm_password"
validators={{
onChangeListenTo: ['password'],
onChange: ({ value, fieldApi }) => {
if (value !== fieldApi.form.getFieldValue('password')) {
return '密码不匹配'
}
return undefined
},
}}
>
{(field) => (
<div>
<label>
<div>确认密码</div>
<input
value={field().state.value}
onChange={(e) => field().handleChange(e.target.value)}
/>
</label>
<Index each={field().state.meta.errors}>
{(err) => <div>{err()}</div>}
</Index>
</div>
)}
</form.Field>
</div>
)
}
这同样适用于 onBlurListenTo 属性,它将在字段失焦时重新运行验证。