尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

React Suite 与 Formik 集成实战指南:用 useFormik 构建带校验的表单

发布时间:2026/9/27 21:20:20

资讯中心
01
ARTICLE

React Suite 与 Formik 集成实战指南:用 useFormik 构建带校验的表单

React Suite 与 Formik 集成实战指南:用 useFormik 构建带校验的表单
前端UI组件【免费下载链接】rsuite A suite of React components .项目地址https://gitcode.com/gh_mirrors/rs/rsuite点击查看免费下载本文是一份以 React Suite 官方文档中 Formik 集成指南为主体的实战教程。React Suite 提供了一套完整的数据录入Data Entry组件与表单布局组件而 Formik 负责表单状态、校验与提交逻辑——两者结合可以快速搭建体验一致、逻辑清晰的表单。读完本文你将掌握使用useFormik驱动Input、DatePicker、Rate等 React Suite 组件并学会通过手写validate函数或 Yup 模式来构建表单校验。为什么选择 Formik React Suite 的组合React Suite 的表单体系Form、Form.Control等本身自带受控状态与校验能力但当你需要更细粒度的状态控制、与第三方校验库如 Yup、Zod深度集成或希望把表单状态逻辑抽离到组件外部时Formik 是一个成熟的选择。从文档的定位看这种组合方式遵循一个简单原则表单的状态与校验交给 Formik渲染交给 React Suite。你只需要用useFormik维护values、errors、handleSubmit等状态把 Formik 的值通过value属性传给 React Suite 组件用formik.setFieldValue接收 React Suite 组件回调出的新值。React Suite 文档中为这一集成专门提供了沙盒依赖配置见 docs/pages/components/form-formik/index.tsx其中声明的版本为formik ^2.4.5与yup ^1.3.3可作为你新建项目时的版本参考。快速上手useFormik Input这是整个集成方式的最小骨架。官方文档usage.md给出的示例用Input组件创建一个简单的名称输入表单import { useFormik } from formik; import { Input, Button } from rsuite; const App () { const formik useFormik({ initialValues: { name: }, onSubmit: values { console.log(values); } }); return ( form onSubmit{formik.handleSubmit} Input namename value{formik.values.name} onChange{value { formik.setFieldValue(name, value); }} / Button typesubmitSubmit/Button /form ); };这段代码的三个关键点handleSubmit挂在原生form上useFormik返回的handleSubmit会阻止浏览器默认提交行为并在校验通过后触发你在配置中传入的onSubmit回调。注意这里用的是原生form而不是 React Suite 的Form组件——两种方式在后续示例中都会出现。值写入用setFieldValueReact Suite 的Input在onChange回调中直接传出新值字符串而不是原生事件对象。因此要把这个值写回 Formik正确的做法是onChange{value formik.setFieldValue(name, value)}。这也解释了为什么不能直接复用 Formik 默认的handleChange——两者的回调签名不一致。name属性保持一致namename用于标识字段方便在values、errors、touched中按字段名取用。基础实例多字段表单与 VStack 布局在只有一个字段的基础上官方文档的基础实例扩展为name与email两个字段并用 React Suite 的VStack组件做纵向布局import { useFormik } from formik; import { Input, Button, Stack } from rsuite; const App () { const formik useFormik({ initialValues: { name: , email: }, onSubmit: values { alert(JSON.stringify(values, null, 2)); } }); return ( form onSubmit{formik.handleSubmit} VStack spacing{10} Input namename placeholderName value{formik.values.name} onChange{value { formik.setFieldValue(name, value); }} / Input nameemail placeholderEmail value{formik.values.email} onChange{value { formik.setFieldValue(email, value); }} / Button appearanceprimary typesubmit Submit /Button /VStack /form ); };这里引入的VStack是 React Suite 的垂直排列布局组件spacing{10}控制子元素之间的间距Button使用appearanceprimary渲染为主题色实心按钮typesubmit使其成为表单的提交按钮。表单验证手写 validate 函数Formik 原生支持在配置中传入一个validate函数它接收当前的values返回一个errors对象。官方文档的验证示例同时展示了错误信息的展示方式import { useFormik } from formik; import { Input, Button, Form } from rsuite; const Field ({ error, ...rest }) { return ( Form.Group Input {...rest} / Form.ErrorMessage show{!!error} placementbottomStart {error} /Form.ErrorMessage /Form.Group ); }; const App () { const formik useFormik({ initialValues: { name: , email: }, validate: values { const errors {}; if (!values.name) { errors.name Required; } if (!values.email) { errors.email Required; } else if (!/^[A-Z0-9._%-][A-Z0-9.-]\.[A-Z]{2,4}$/i.test(values.email)) { errors.email Invalid email address; } return errors; }, onSubmit: values { alert(JSON.stringify(values, null, 2)); } }); return ( Form onSubmit{formik.handleSubmit} Form.Stack fluid Field namename placeholderName value{formik.values.name} error{formik.errors.name} onChange{value formik.setFieldValue(name, value)} / Field nameemail placeholderEmail value{formik.values.email} error{formik.errors.email} onChange{value formik.setFieldValue(email, value)} / Button appearanceprimary typesubmit Submit /Button /Form.Stack /Form ); };自定义 Field 封装组件的设计示例中定义了一个本地Field组件它把「输入控件 错误信息」打包成标准结构这也是多个示例复用同一套代码的关键Form.GroupReact Suite 中为表单提供结构的布局单元内部通过FormGroupContext传递自动生成的controlId用于关联Form.Control的id与Form.ControlLabel的htmlFor并生成对应的aria-labelledby/aria-describedby见 src/FormGroup/FormGroup.tsx 的useUniqueId(rs-, controlIdProp)逻辑。Form.ErrorMessage错误提示气泡show控制是否显示placementbottomStart指定气泡出现在输入框下方左侧。从 src/FormErrorMessage/FormErrorMessage.tsx 的源码可以看到show为true时才渲染包裹层并通过data-placement与箭头元素呈现带小箭头的提示气泡当show为false时组件返回null完全不占位。Form.Stack fluidForm.Stack是基于 Flexbox 的快捷布局组件见 src/FormStack/FormStack.tsx支持horizontal/vertical/inline三种layoutfluid让表单元素在垂直布局下占满容器宽度。验证触发时机与 errors 传递validate函数在字段值变化、失焦以及提交时都会被 Formik 调用只要返回值中存在某个字段的错误formik.errors中就会携带对应信息。示例通过error{formik.errors.name}把错误传给FieldField再以show{!!error}决定是否渲染Form.ErrorMessage。使用 Yup 进行模式校验当表单校验规则变多时手写validate函数会越来越繁琐。Yup 是用于运行时值解析与校验的模式构建器Formik 对其有内置支持只需传入validationSchema配置项。官方文档的 yup-schema-validation.md 示例与上一节完全等价import { useFormik } from formik; import { Input, Button, Form } from rsuite; import * as Yup from yup; const Field ({ error, ...rest }) { return ( Form.Group Input {...rest} / Form.ErrorMessage show{!!error} placementbottomStart {error} /Form.ErrorMessage /Form.Group ); }; const validationSchema Yup.object().shape({ name: Yup.string().required(Required), email: Yup.string().email(Invalid email address).required(Required) }); const App () { const formik useFormik({ initialValues: { name: , email: }, validationSchema, onSubmit: values { alert(JSON.stringify(values, null, 2)); } }); return ( Form onSubmit{formik.handleSubmit} Form.Stack fluid Field namename placeholderName value{formik.values.name} error{formik.errors.name} onChange{value formik.setFieldValue(name, value)} / Field nameemail placeholderEmail value{formik.values.email} error{formik.errors.email} onChange{value formik.setFieldValue(email, value)} / Button appearanceprimary typesubmit Submit /Button /Form.Stack /Form ); };对比两种校验写法维度手写validate函数validationSchema Yup代码组织校验逻辑内联在useFormik配置中校验规则声明为独立 schema可复用、可测试字段规则逐字段手写 if/elseYup.string().email().required()链式声明适用场景简单表单、依赖业务上下文的自定义逻辑规则较多的表单、与类型定义共享 schema两种方式产出的errors对象结构一致因此Field组件的消费方式完全相同。Zod 偏好者如果你更喜欢使用 Zod可以考虑使用社区提供的适配器 zod-formik-adapter它提供了类似的 schema 桥接能力用法与 Yup 集成接近。其他数据录入组件DatePicker 与 RateReact Suite 中所有数据录入组件都可以与 Formik 组合使用。官方文档的 other-input-components.md 演示了DatePicker与Rate的接入方式其亮点在于把Field扩展为支持as属性——用哪个组件渲染由调用方决定import { useFormik } from formik; import { Input, Button, Form, DatePicker, Rate } from rsuite; import * as Yup from yup; const Field ({ error, as: Component Input, ...rest }) { return ( Form.Group Component {...rest} / Form.ErrorMessage show{!!error} placementbottomStart {error} /Form.ErrorMessage /Form.Group ); }; const validationSchema Yup.object().shape({ date: Yup.date().required(Date is required), rating: Yup.number() .required(Rating is required) .min(2, Rating must be at least 2) .max(5, Rating must be at most 5) }); const App () { const formik useFormik({ initialValues: { date: new Date(), rating: 3 }, validationSchema, onSubmit: values { alert(JSON.stringify(values, null, 2)); } }); return ( Form onSubmit{formik.handleSubmit} Form.Stack fluid Field as{DatePicker} namedate value{formik.values.date} error{formik.errors.date} onChange{value formik.setFieldValue(date, value)} / Field as{Rate} namerating coloryellow value{formik.values.rating} error{formik.errors.rating} onChange{value formik.setFieldValue(rating, value)} / Button appearanceprimary typesubmit Submit /Button /Form.Stack /Form ); };这段示例的进阶点as属性让 Field 通用化const Field ({ error, as: Component Input, ...rest })将传入的组件重命名为Component并渲染默认回退到Input。name、value、error、onChange等剩余属性自动透传给目标组件因此同一个Field可以承载任意数据录入组件。DatePicker的值类型是日期对象initialValues中date的初始值是new Date()Yup 用Yup.date()校验DatePicker的onChange回调传出的同样是日期值直接formik.setFieldValue(date, value)即可写回。Rate是数值型录入rating的初始值是数字3Yup 用Yup.number().min(2).max(5)限制评分区间coloryellow设置星星颜色。这再次印证了集成要点——React Suite 数据录入组件的onChange回调统一直接返回新值与 Formik 的setFieldValue天然契合。从源码看这套写法的底层依据把文档中的写法与 React Suite 源码对照可以更清晰地理解为什么「值由 Formik 管理、渲染交给 React Suite」能成立Form是一个普通的表单容器从 src/Form/Form.tsx 可见FormProps基于原生FormHTMLAttributes扩展并对外暴露onSubmit回调。在 Formik 集成场景中Form onSubmit{formik.handleSubmit}只是复用了 React Suite 的样式化表单容器真正的提交逻辑完全由 Formik 接管。Form.ErrorMessage是纯展示组件src/FormErrorMessage/FormErrorMessage.tsx 中show为false时直接返回null因此可以放心地把formik.errors.xxx始终传给error由组件自行决定是否渲染气泡。Form.Stack提供布局能力src/FormStack/FormStack.tsx 中layout默认为verticalfluid让元素撑满容器宽度配合VStack/Stack可以快速搭出规整的表单版式。集成要点速查回调签名React Suite 数据录入组件的onChange直接回调新值字符串、日期对象或数字统一使用formik.setFieldValue(name, value)写回不要使用 Formik 默认的handleChange。提交formik.handleSubmit同时挂在原生form或 React SuiteForm的onSubmit上均可配置中的onSubmit回调在值合法时收到完整values。错误展示封装一个Field组件把Form.Group、输入组件、Form.ErrorMessageshow{!!error}、placementbottomStart组合起来通过as属性切换具体输入组件即可在任意表单中复用。校验方式简单规则用手写validate函数复杂表单用validationSchema Yupformik ^2.4.5/yup ^1.3.3是文档沙盒验证过的组合偏好 Zod 时可借助社区适配器。可扩展性DatePicker、Rate、Checkbox、InputNumber等所有数据录入组件都遵循同一套valueonChange(value)约定均可套用本文的Field模式。赞分享前端UI组件【免费下载链接】rsuite A suite of React components .项目地址https://gitcode.com/gh_mirrors/rs/rsuite点击查看免费下载相关推荐Formik 与 Material UI 集成实战基于 useFormik 与 Yup 构建带校验的登录表单Formik 与 Material UI 集成实战基于 useFormik 与 Yup 构建带校验的登录表单 本指南以仓库中的 examples/with mRedwood 表单实战用 redwoodjs/forms 构建带校验的 Contact 表单Redwood 表单实战用 redwoodjs/forms 构建带校验的 Contact 表单 本指南以 Redwood 教程第三章的「Building a后端前端Web框架开发工具Formik 与 Material UI 集成实战指南零桥接接入表单状态与校验Formik 与 Material UI 集成实战指南零桥接接入表单状态与校验 Formik 可以极为自然地与 Material UI 组件协同工作只需将上一篇Turborepo插件开发自定义构建任务的完整指南下一篇洛雪音乐音源配置终极指南免费打造全网音乐聚合方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。