HouseForm 字段联动技巧:listenTo 如何实现密码确认等跨字段校验 HouseForm 字段联动技巧listenTo 如何实现密码确认等跨字段校验【免费下载链接】houseformSimple to use React forms, where your validation and UI code live together in harmony.项目地址: https://gitcode.com/gh_mirrors/ho/houseformHouseForm 是一款将校验逻辑与 UI 代码同住一屋的 React 表单库而字段联动跨字段校验正是它最实用的高级能力之一。本篇文章将围绕 HouseForm 的listenTo属性手把手教你实现密码确认、条件字段等跨字段校验场景帮你彻底告别两个字段各校各的的尴尬局面。HouseForm 主打Simple to use React forms, where your validation and UI code live together in harmony.——校验逻辑直接写在 UI 组件旁边一个Field组件即可完成取值、渲染、校验。但当表单中两个字段相互依赖时例如密码与确认密码事情就没那么简单了。接下来我们就用listenTo轻松化解。为什么表单字段需要联动大多数表单校验是各自为政的用户名只校验用户名邮箱只校验邮箱。但真实业务中常有跨字段依赖密码与确认密码必须一致选择公司用户时才需要填写公司名称结束日期不得早于开始日期。如果不做字段联动用户先填完确认密码再回头修改密码表单里仍残留两次密码不一致的错误提示——体验很差。这就是HouseForm 跨字段校验要解决的问题。listenTo 一行代码实现字段监听HouseForm 的解决方案非常直接在Field组件上添加listenTo属性传入一个字段名数组当被监听的字段触发变更或失焦时监听方会同步重新执行对应校验。相关类型定义位于 lib/field/types.tsField nameconfirmpassword listenTo{[password]} onChangeValidate{(val, form) { if (val form.getFieldValue(password)!.value) { return Promise.resolve(true); } else { return Promise.reject(Passwords must match); } }} {/* ... */} /Field其中form.getFieldValue(password)用于在某个字段的校验函数里读取其他字段的值这正是跨字段校验的数据来源。官方对该用法的完整讲解见 linked-fields.md。实战用 listenTo 实现密码确认校验下面是一个完整的密码确认表单两步走即可搞定第一步密码字段做基础长度校验第二步确认密码字段通过listenTo{[password]}监听密码字段并在onChangeValidate中比对两个值import { Form, Field } from houseform; import { z } from zod; const App () ( Form onSubmit{(values) alert(JSON.stringify(values))} {({ submit, isValid }) ( Field namepassword onChangeValidate{z.string().min(8, 至少8个字符)} {({ value, setValue, onBlur, errors }) ( div input typepassword placeholder密码 value{value} onBlur{onBlur} onChange{(e) setValue(e.target.value)} / {errors.map((error) p key{error}{error}/p)} /div )} /Field Field nameconfirmpassword listenTo{[password]} onChangeValidate{(val, form) { if (val form.getFieldValue(password)!.value) { return Promise.resolve(true); } return Promise.reject(两次输入的密码不一致); }} {({ value, setValue, onBlur, errors, isTouched }) ( div input typepassword placeholder确认密码 value{value} onBlur{onBlur} onChange{(e) setValue(e.target.value)} / {isTouched errors.map((error) p key{error}{error}/p)} /div )} /Field button disabled{!isValid} onClick{submit}提交/button / )} /Form ); 关键点加了listenTo后只要用户修改密码字段HouseForm 就会自动重新校验确认密码字段错误提示实时刷新不再残留过期错误。listenTo 背后的工作原理listenTo的实现并不神秘核心逻辑在 lib/field/use-field-like.ts 的useListenToListenToArray函数中监听方把自己注册到被监听字段的onChangeListenerRefs、onBlurListenerRefs、onMountListenerRefs三组回调列表里当被监听字段调用setValue时通过setTimeout触发对应回调见 use-field-like.ts驱动监听方重新执行校验组件卸载时会自动清理监听器避免内存泄漏。简单说listenTo 订阅他人事件 重跑自己的校验优雅且零侵入。更多联动场景监听多个字段与条件字段listenTo支持数组一次监听多个字段比如日期区间校验Field nameendDate listenTo{[startDate]} /* ... */ /另一个常见的字段联动场景是条件显隐根据一个字段的值决定是否渲染另一个字段。你可以利用Form的value属性实现例如邮箱为 Gmail 时隐藏密码字段完整示例同样见 linked-fields.md 的 Conditional Fields 章节。使用 listenTo 的注意事项listenTo传的是字符串数组即使只监听一个字段也要写成[password]形式监听字段触发onBlur时监听方会执行自己的onBlurValidate触发onChange时执行onChangeValidate两类校验可分开配置想了解listenTo的完整 API 说明可查阅 field.md 参考文档其中对listenTo的语义有精确定义。总结HouseForm 的listenTo用一行属性就解决了表单字段联动难题无论是密码确认这类跨字段校验还是复杂的条件表单都不需要引入额外的状态管理或手工触发校验。如果你想在自己的 React 项目中亲自体验也可以直接git clone https://gitcode.com/gh_mirrors/ho/houseform查看源码与测试用例如 field.spec.tsx 中的监听场景。学会它你的表单体验将立刻上一个台阶【免费下载链接】houseformSimple to use React forms, where your validation and UI code live together in harmony.项目地址: https://gitcode.com/gh_mirrors/ho/houseform创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

最新新闻

从TCP协议到连接池:拆解一次网络连接的真实成本与性能优化

从TCP协议到连接池:拆解一次网络连接的真实成本与性能优化

1. 这篇文章真正要解决的问题 如果你是一名后端开发者,一定对“连接池”这个概念不陌生。无论是数据库连接池、HTTP连接池还是Redis连接池,我们都在项目中配置过。但你是否真的想过,为什么我们需要连接池?一次简单的TCP连接&#…

2026/8/16 18:44:41
ExtDiff 使用指南:3 步让 Word 自动对比两份文档

ExtDiff 使用指南:3 步让 Word 自动对比两份文档

ExtDiff 使用指南:3 步让 Word 自动对比两份文档 【免费下载链接】ExtDiff Compare documents using MS Word from the command line. 项目地址: https://gitcode.com/gh_mirrors/ex/ExtDiff 你有没有经历过这种崩溃瞬间:同事发来一份"改好了…

2026/8/16 18:44:40
手把手读 memleax 源码:10 个模块的分工与整体架构设计

手把手读 memleax 源码:10 个模块的分工与整体架构设计

手把手读 memleax 源码:10 个模块的分工与整体架构设计 【免费下载链接】memleax debugs memory leak of running process. Not maintained anymore, try libleak please. 项目地址: https://gitcode.com/gh_mirrors/me/memleax memleax 是一款面向运行中进程…

2026/8/16 18:44:40
JVM垃圾回收器深度解析:从算法原理到实战调优

JVM垃圾回收器深度解析:从算法原理到实战调优

1. 项目概述:为什么我们需要深入理解垃圾回收器?如果你是一名Java开发者,或者正在使用任何基于JVM的语言(比如Kotlin、Scala),那么“垃圾回收器”这个词对你来说一定不陌生。它就像是你程序背后那个默默无闻…

2026/8/16 18:44:40
7 Scenes与NRGBD数据集评测:FastVGGT跨场景性能表现

7 Scenes与NRGBD数据集评测:FastVGGT跨场景性能表现

7 Scenes与NRGBD数据集评测:FastVGGT跨场景性能表现 【免费下载链接】FastVGGT [ICLR 2026] FastVGGT: Fast Visual Geometry Transformer 项目地址: https://gitcode.com/gh_mirrors/fa/FastVGGT FastVGGT 是一款用于三维重建的视觉几何 Transformer 加速框…

2026/8/16 18:44:40
Git命令缩写配置指南:提升开发效率的实用技巧

Git命令缩写配置指南:提升开发效率的实用技巧

1. Git命令缩写:提升开发效率的必备技巧 作为开发者,我们每天都要在终端输入大量Git命令。从 git status 查看状态到 git commit -m 提交代码,这些重复性输入不仅浪费时间,还容易出错。我曾在一次紧急修复中因为手误打错命令浪…

2026/8/16 18:39:40