前端UI组件【免费下载链接】react-final-form High performance subscription-based form state management for React项目地址https://gitcode.com/gh_mirrors/re/react-final-form点击查看免费下载useField()是 React Final Form 提供的核心 React Hook用于在函数组件中注册字段、订阅字段状态并返回可直接绑定到输入控件的input对象与描述字段状态的meta对象。本文以 docs/api/useField.md 为骨架结合仓库源码 src/useField.ts、src/types.ts 与测试用例 src/useField.test.js深入讲解其签名、全部配置项、重渲染机制与典型实战模式。Hook 签名与基本用法useField()从react-final-form包中导出见 src/index.tsimport { useField } from react-final-form其 TypeScript 签名为(name: string, config: UseFieldConfig) FieldRenderPropsuseField()接收两个参数name必填string字段的名称。支持使用点号与方括号语法dot-and-bracket syntax引用深层嵌套值例如clients[0].address.street。字段注册、取值、订阅都以该名称为依据。config可选UseFieldConfig一个与FieldProps结构几乎完全一致、只是不含name的配置对象。在源码 src/types.ts 中UseFieldConfig定义如下export interface UseFieldAutoConfig { afterSubmit?: () void; allowNull?: boolean; beforeSubmit?: () void | false; component?: RenderablePropsany[component]; data?: Recordstring, any; defaultValue?: any; format?: (value: any, name: string) any; formatOnBlur?: boolean; initialValue?: any; isEqual?: (a: any, b: any) boolean; multiple?: boolean; parse?: (value: any, name: string) any; type?: string; validate?: FieldValidatorany; validateFields?: string[]; value?: any; } export interface UseFieldConfig extends UseFieldAutoConfig { subscription?: FieldSubscription; }useField()返回FieldRenderProps即包含input与meta两个成员的对象。它会管理你所使用它的组件的重渲染只有当通过useField()订阅的字段状态发生变化时组件才会重新渲染。这正是 React Final Form 高性能订阅式状态管理的核心所在。useField()在内部也被Field/组件所使用参见 docs/api/Field.md 与 src/Field.tsx。因此凡是可以使用Field/的场景几乎都可以用useField()以 Hook 方式实现适合在自定义函数组件中直接构建字段。返回值input与metauseField()返回的FieldRenderProps分为两部分类型定义见 src/types.ts 中的FieldRenderPropsinput包含name、onBlur、onChange、onFocus、value等应直接绑定到输入组件上的属性可直接展开到input/input {...input} /。meta描述字段状态的元数据包括active、dirty、error、initial、invalid、modified、pristine、submitError、submitFailed、submitSucceeded、submitting、touched、valid、validating、visited等。在源码 src/useField.ts 中meta对象通过addLazyFieldMetaState(meta, state)构建实现见 src/getters.ts它使用Object.defineProperty定义惰性 getter将meta的属性访问直接映射到 Final Form 的字段状态快照上。注意meta中的字段是否出现取决于你是否通过subscription订阅了对应的状态项。未订阅的状态不会触发重渲染也可能不会出现在meta中。默认订阅全部字段状态。input对象上的onChange、onBlur、onFocus均通过useConstantCallback包装保证跨渲染保持同一函数实例。测试用例见 src/useField.test.js 中的 should give same instance of handlers as value changes验证了即使字段值、名称或类型发生变化onChange/onFocus/onBlur始终是同一引用这对依赖函数引用的 memoized 子组件非常友好。默认的format与parse在 src/useField.ts 中定义了两个默认行为const defaultFormat (value: any, _name: string) value undefined ? : value; const defaultParse (value: any, _name: string) value ? undefined : value;format把表单存储值转换为输入框显示值。默认将undefined转换为以保证受控输入controlled inputs正常工作。若想禁用此行为可传入恒等函数v v此时需自行确保输入是受控的。parse把输入框产生的值转换为表单存储值。默认将转换为undefined。若希望表单中保留可传入恒等函数v v。两者通常成对使用例如把 JavaScript 的Date对象格式化为本地化日期字符串再在解析时转换回Date。配置项详解useField()的config支持以下配置完整字段列表与类型可对照 src/types.ts 与 docs/types/FieldProps.mdsubscription{ [string]: boolean }可选高级用法。指定订阅哪些字段状态。默认订阅全部字段状态源码中通过fieldSubscriptionItems构建全量订阅对象。如果提供了订阅组件只会在这些状态发生变化时重渲染。测试用例 should allow for creation of render-controlled components 演示了useField(name, { subscription: { dirty: true } })只订阅dirty状态组件仅在 dirty 标志变化时重渲染。initialValueany字段的初始值。此值用于与当前值比较以计算dirty与pristine。该值会覆盖传给整个表单的initialValues中对应的值。若希望字段创建时就处于dirty状态可配合defaultValue使用initialValue作为初始值defaultValue作为字段创建时的值。源码中对initialValue有专门的处理逻辑src/useField.ts初始化状态时优先使用表单initialValues中的值通过getIn支持嵌套路径对应 issue #1050 的修复其次才回退到字段级initialValue当initialValueprop 变化时如父组件保存成功后传回新的初始值会通过重新注册字段来更新表单的initialValues使字段在值与新初始值一致时重新变为 pristine对应 issue #988 的修复。defaultValueany字段创建时的值。通常你应该使用initialValue而不是defaultValue。defaultValue只在需要让字段创建时就处于dirty状态即值与初始值不同时才使用。allowNullboolean可选默认false。默认情况下如果字段值是nullReact Final Form 会将其转换为以确保受控输入。当传入true时useField()会把null值原样返回给你。源码中还处理了allowNull与formatOnBlur、初始值为null时的边界情况保持null不被格式化掉。format(value: any, name: string) any可选。接收表单值中的字段值与字段名称返回要展示给输入框的值。常与parse配合使用。formatOnBlurboolean可选默认false。为true时format只在字段失焦时调用为false时format在每次渲染时调用。源码中formatOnBlur为true时beforeSubmit阶段会先对字段值做一次格式化再提交src/useField.ts 中register回调的beforeSubmit分支onBlur回调中会直接从 Final Form 读取最新字段值并格式化后写回避免因onChange后立即onBlur而使用到过期的闭包状态。parse(value: any, name: string) any可选。接收输入框产生的值与字段名称转换为要存储到表单中的值。常见用法包括把字符串转换为Number、解析本地化日期为Date对象等。validate(value: ?any, allValues: Object, meta: ?FieldState) ?any可选。字段级校验函数接收字段值、表单所有值以及字段的meta信息返回错误值无效时或undefined值有效时。在注册字段时通过getValidator: () configRef.current.validate传递给 Final Formsrc/useField.ts。⚠️ 注意为允许内联箭头函数形式的校验函数字段默认不会在validate函数引用变化时重新渲染。如果需要在运行时替换校验函数需同时更新其他属性如key来触发重渲染。validateFieldsstring[]可选。指定该字段变化时要校验的其他字段名称数组undefined该字段变化时校验所有字段[]该字段变化时仅调用该字段自身的字段级校验指定其他字段名该字段变化时校验这些字段以及该字段自身。⚠️ 同样为允许内联[]语法validateFields变化时默认不触发重渲染如需更新需借助key等其他属性。isEqual(a: any, b: any) boolean可选默认。用于判断两个值是否相等影响dirty、pristine、dirtySinceLastSubmit等状态的计算也用于initialValue变化检测与setState前的浅比较。afterSubmit() void可选。提交成功完成后通知字段的回调。beforeSubmit() void | false可选。在调用onSubmit之前调用的函数。若返回false则中止提交若某个字段的beforeSubmit返回false提交在第一个返回false的字段处中止其他字段的beforeSubmit可能不会被调用。component与typecomponentinput | select | textarea或任意 React 组件类型。传入 HTML 输入字符串时React Final Form 会以React.createElement渲染该元素传入自定义组件时组件接收FieldRenderProps。type设为checkbox或radio时React Final Form 会以复选框或单选按钮的方式管理值并在input对象中提供checked布尔值。type/component为select且multiple为true时初始化值默认会被规范为[]见 src/useField.ts 初始化逻辑。multipleboolean可选。仅在使用componentselect且需要多选时有用。会以input.multiple的形式添加到输入组件上。valueany可选。仅用于复选框和单选按钮且必须同时提供typeradio或typecheckbox单选按钮value即该单选按钮的值。仅当此处值表单中该字段的值时按钮渲染为checked。复选框带value当value包含在字段值的数组中时复选框为checked勾选将该值加入数组取消勾选将其移除。复选框不带value字段值为 truthy 时checked勾选置true取消置false。源码中getInputValue与getInputCheckedsrc/useField.ts实现了上述逻辑对 checkbox/radioinput.value返回该输入自身代表的值_value选中状态由checked属性表达。dataObject可选。供 mutators 存放任意值的初始状态。重渲染控制原理useField()的高性能特性来自两个层面的机制1. 订阅式更新通过form.registerField(name, callback, subscription, ...)src/useField.ts向 Final Form 注册字段并传入subscription声明的订阅项。Final Form 只在被订阅的状态发生变化时才通知回调回调内部再用shallowEqualsrc/shallowEqual.ts与当前状态做浅比较只有确实变化时才触发setState避免无谓重渲染。2. 惰性metameta通过 getter 惰性读取src/getters.ts对象访问开销极低。注册发生在useEffect中首次渲染之后避免在渲染期间调用setState并在清理函数中调用返回的unregister完成注销注册依赖[name, data, defaultValue, initialValue]这些值变化时会重新注册src/useField.ts。测试用例 should track field state 验证了字段值变化时监听组件只做最小次数的重渲染。useField()通过useForm(useField)src/useForm.ts获取表单上下文若在Form/之外使用会抛出错误。测试用例 should warn if not used inside a form 验证了该错误信息为useField must be used inside of a Form component。实战示例基础文本输入import { useField } from react-final-form const MyTextField ({ name }) { const { input, meta } useField(name) return ( div label{name}/label input {...input} / {meta.touched meta.error span{meta.error}/span} /div ) }订阅最小化只关注dirty状态const DirtyIndicator ({ name }) { const { meta } useField(name, { subscription: { dirty: true } }) return span{meta.dirty ? 已修改 : 未修改}/span }自定义组件无component/render/children的渲染方式const MyField ({ name }) { const { input, meta } useField(name) return ( div input {...input} placeholder{name} / {meta.error span{meta.error}/span} /div ) } // 使用 // Form onSubmit{onSubmit} // {() ( // form // MyField namefirstName / // /form // )} // /Form更多可直接参考仓库中的示例例如字段级校验示例 examples/field-level-validation/index.js、失焦格式化示例 examples/format-on-blur/index.js 以及使用自定义校验引擎的 examples/custom-validation-engine/index.js。与Field/的关系Field/组件src/Field.tsx文档见 docs/api/Field.md在内部即使用useField()实现字段注册与状态订阅。二者的差异主要体现在 API 形式上Field/通过component/render/children三种方式渲染适合声明式 JSX 场景useField()直接在函数组件体内使用返回值可用于任意自定义逻辑且天然支持 Hooks 组合如与React.memo、useMemo结合做精细的重渲染控制。从类型定义看FieldProps继承UseFieldConfigsrc/types.ts即Field/的所有配置项与useField()的config完全兼容二者可以互相转换按项目风格选择即可。小结useField()是 React Final Form 面向 Hook 时代的核心 API以(name, config) FieldRenderProps的简洁签名完成字段注册、状态订阅、受控输入绑定与重渲染管理。理解其subscription、format/parse、allowNull、formatOnBlur、validateFields等配置的底层行为均可对照 src/useField.ts 源码验证可以帮助你在大型表单中精确控制渲染次数构建高性能、可复用的字段组件。赞分享前端UI组件【免费下载链接】react-final-form High performance subscription-based form state management for React项目地址https://gitcode.com/gh_mirrors/re/react-final-form点击查看免费下载相关推荐TanStack Preact Form useField Hook 完全指南字段状态管理、验证与响应式原理TanStack Preact Form useField Hook 完全指南字段状态管理、验证与响应式原理 useField 是 tanstack/pre前端UI组件123云盘免费会员解锁脚本3分钟开启完整VIP特权体验123云盘免费会员解锁脚本3分钟开启完整VIP特权体验 还在为123云盘的各种限制而烦恼吗想要享受高速下载、大文件传输、无广告浏览等VIP特权却不想付费今前端React Hook Form 中文指南高性能 React 表单状态管理与校验实战React Hook Form 中文指南高性能 React 表单状态管理与校验实战 导读 本文以 React Hook Form 项目的中文 README前端上一篇如何用 CLIP 实现零样本图像分类类名写成一句话不标一张图也能出第一次预测下一篇终极指南如何利用Apache Fury实现Java/Python/C/Golang跨语言高效序列化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
三步搭好 Sunshine 自托管游戏串流:免费低延迟私人云游戏平台 三步搭好 Sunshine 自托管游戏串流:免费低延迟私人云游戏平台 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine
Sunshine 是一个自托管游戏串流服务器,把你自己的 PC 变成 Moonlight… · 2026/9/28 2:57:58
rsuite InlineEdit 集成 DatePicker 实战:在页面内实现日期内联编辑 前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 本文基于 rsuite 官方文档中 InlineEdit DatePicker 示例(见 InlineEdit 文档页࿰… · 2026/9/28 2:57:58
devenv 配置 PureScript 开发环境:purs、Spago 与 LSP 全选项解析与源码原理 开发工具CLI 【免费下载链接】devenv Fast, Declarative, Reproducible, and Composable Developer Environments using Nix 项目地址: https://gitcode.com/gh_mirrors/de/devenv 点击查看 免费下载 在基于 Nix 的声明式开发环境工具 devenv 中,只需要… · 2026/9/28 2:57:57
顺义本土正骨名医——苏荫来的故事 在顺义本地骨伤正骨领域,有这样一位深耕三十余年的实力派老医者,一身古法正骨手艺,一手传承绝活,专治各类筋骨伤痛,凭借精准的手法、扎实的疗效、踏实的行医作风,深得邻里百姓信赖与认可。他就是杏园金方首… · 2026/9/28 3:29:27
2026实测百度网盘直链助手脚本,速度超越PanDownload工具 随着我们手头的各种文档和视频资料越来越大,网盘在数据流转中扮演的角色也越来越重要。不管是工作交接还是备份生活点滴,它都帮了我们不少忙。
不过在日常使用中,偶尔遇到下载变慢也确实会让人感到有些苦恼。面对这种现象我们除了可以配合Pa… · 2026/9/28 3:29:08
剪映操作|输入文字后,能不能自动生成虚拟主播、配音和字幕 适用对象:AI视频生成任务的创作者。本文只处理“输入文字后,能不能自动生成虚拟主播、配音和字幕?”这一件事。先确定这一条要解决什么先给结论:处理“输入文字后,能不能自动生成虚拟主播、配音和字幕?”&a… · 2026/9/28 3:28:21
运算符 文件操作 6 运算符:算数运算: - * / % ////:整除%:求余比较运算:> < > < !赋值运算 : - *a21
b2
a,bb,a#只适合python
print(a)#2
print(b)#21逻辑运算:and or not当and,or… · 2026/9/28 3:27:47
字符集和编码 bytes 5 字符集和编码ascii——编排了128个文字字符,只需要7个0和1就可以表示了——1 byte8 bitANSI——每个字符 16 bit,2byteGBK编码Unicode:万国码utf-8:最短的字节长度8 英文:8bit,1 byte总结:as… · 2026/9/28 3:27:28
高效获取STM32开发参考方案:摆脱资料海洋,聚焦可落地项目 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/28 3:19:17
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
制作网页比较方便的软件怎么选?一文搞懂避坑指南 制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25