# Hook Form React This library is a lightweight, dependency-free solution for form validation and submission designed specifically for React applications.The following component libraries have been adapted: `Next UI`, `Ant Design`, and `MUI`. 该库是一个专为 React 应用设计的轻量级、无依赖的表单验证和提交解决方案。目前已适配完成一下组件库`Next UI`、`Ant Design`、`MUI`。 **推荐直接看示例**:这里更新是最即时的,也是推荐的使用方式。 中文 | [English](https://github.com/luoanb/hook-form-react/blob/main/README.en.md) | [API](https://luoanb.github.io/hook-form-react/) | [GitHub](https://github.com/luoanb/hook-form-react) | [示例:Stackblitz](https://stackblitz.com/~/github.com/luoanb/hook-form-react-example) | [示例:GitHub](https://github.com/luoanb/hook-form-react-example) 基于 React Hooks 和 TypeScript 开发,旨在提供一个简洁、高效且易于扩展的方式来处理表单验证和提交,无论是在简单还是复杂的表单场景中都能灵活应对。本库的设计哲学是兼容性和扩展性,理念是支持开发者以最少的代码实现最丰富的功能,核心不绑定任何 UI 组件库,从而支持所有 React 组件库;对第三方组件库的支持以独立模块方式实现。 ## 特点 - **零依赖**:避免了因引入外部依赖而可能导致的项目膨胀和兼容性问题。 - **高度可扩展**:可通过简单配置应对各种验证规则和表单场景,满足不同需求。 - **TypeScript 支持**:充分利用 TypeScript 提供的类型检查,增强代码的可读性和可维护性。 - **通用性**:适配所有 UI 组件库,为 React 开发者提供统一的表单处理解决方案。 - **文档支持**:使用 TypeDoc 生成详尽的文档,帮助开发者更好地理解和使用库中的功能。 - **灵活的打包支持**:使用 Rollup 进行打包,支持 UMD、CommonJS 和 ES 模块格式,以适配不同的使用场景和环境。 ## 安装 ```shell # pnpm pnpm add hook-form-react # yarn yarn add hook-form-react # npm npm i hook-form-react ``` ## 使用 ### 基础用法 提供了辅助工具,可以使得开发更快捷,同时不丢失高度的可定制性 ```tsx // 提供了辅助工具,可以使得开发更快捷,同时不丢失高度的可定制性 import { Button, Input } from '@nextui-org/react' import { useAttr, useFormData, Verifications } from 'hook-form-react' export const Example = () => { const formData = useFormData( { password: '', username: '' }, { // 支持多个校验 password: [ // 自带验证器必填校验 // 开发者也可以自行在项目中补充其它验证规则,具体请看开发者文档(待补充) Verifications.required() ], username: [ // 自带验证器的必填校验 + 自定义提示 Verifications.required('用户账户不能为空') ] } ) // 使用组件快速绑定hook const attr = useAttr(formData) const submit = async () => { const isValid = await formData.doAllValidate() console.log('submit:isValid: ', isValid) if (isValid) { console.log('formValue', formData.value) } } return (
formData.pushValue('username', e.target.value)} // isInvalid={formData.errors.username?.isInvalid} // errorMessage={formData.errors.username?.msg} > formData.pushValue('password', e.target.value)} >
) } ``` ### 嵌套对象表单 新增一个 hook `useSubFormData`用于处理嵌套表单,原则上可以处理任意层数的对象嵌套(也就是无限套娃)。 ```ts // useSubFormData const value10Form = useSubFormData(formData.formData, 'value10', { haha: [Verifications.required(), Verifications.email()] }) /** * 嵌套对象的表单组件需要用它来绑定 */ const attrValue10 = useAttr(value10Form) // 提交 const submit = async () => { const isValid = await formData.doAllValidate() // 嵌套表单需要单独验证 const isValidValue10 = await value10Form.doAllValidate() console.log('submit:isValid: ', isValid, isValidValue10) if (isValid && isValidValue10) { //顶层form能拿到所有value console.log('formValue', formData.value) } } // 重置 const reset = () => { formData.reset() // 错误状态得单独重置 value10Form.formErrors.reset() } ``` ## 版本说明 - **Next 后续版本计划** 1. **文档优化**: 后续会提高文档触达性,包括对各个 API 的使用示例, 还有各个组件库在使用过程中的一些细节处理 2. **稳定性优化**: 优化一些组件库的稳定性, 优化一些组件库的体验 3. **移动端/小程序组件库支持**: `hook-form-react`模块化且足够轻量(`10k左右`),可满足在小程序中使用, 后续会考虑`Taro`小程序组件库的适配. 4. **完善开发文档**: 基于可拔插的设计原则, `hook-form-react` 在新增第三方组件库适配、新增自定义验证都是一件简单的事情, 后续将会持续完善开发文档, 以帮助开发者基于项目需求定制的使用`hook-form-react`. **V3.0.0** 1. 重构 API 方法, 名称更简洁和规范 (和以前的不再兼容), 具体以 API 说明为准 2. 验证自动触发, 目前支持三种验证触发模式: 'change','blur','safeChange' ```typescript /** * 验证触发器 */ export enum Trigger { /** 变量值更新时触发 */ 'change' = 'change', /** 输入框失去焦点触发 */ 'blur' = 'blur', /** 安全的变量值更新触发(仅在输入框聚焦时变量变更才会触发) */ 'safeChange' = 'safeChange' } ``` 3. 验证规则精简, 去除不常用的验证规则. - **v2.3.0** 1. **MUI 组件**:完成`MUI`组件库适配, 使用请看 [示例](https://stackblitz.com/~/github.com/luoanb/hook-form-react-example) - **v2.2.0** 1. **Antd 组件**:表单组件已经适配完成,(截止到当前版本,我们已经适配完` Next UI`、`Antd `两个组件库), `import { Antd_5 } from 'hook-form-react/Antd_5'`,对于`antd`的适配的所有内容都包含在这里,和核心库隔离。使用示例请参考 [示例:Stackblitz](https://stackblitz.com/~/github.com/luoanb/hook-form-react-example) - **v2.1.0** 1. 修复立即赋值,立即验证时,获取不到最新的表单数据的问题(React.useState 异步执行导致的 bug), 新增两个方法:`doValidateImme` `doAllValidateImme`,当发现使用`doValidate`,`doAllValidate`存在问题时,相应替换一下对应的方法,原则上推荐优先使用`doValidate`,`doAllValidate`。 - **v2.0.2** 1. 自定义校验规则,`execute?: (value: V, content: any) => Promise` ,添加`content`参数用于获取表单上下文数据 - **v2.0.0** 1. 新增对象嵌套型表单的支持,具体可查看[Stackblitz](https://stackblitz.com/~/github.com/luoanb/hook-form-react-example) 2. 添加 Stackblitz 示例项目(需要科学上网) - **v1.0.0** 1. 重构了验证规则实现类,使用会更友好,同时新增几个常用验证规则 [所有的常用验证规则](https://luoanb.github.io/hook-form-react/classes/Verifications.html)。验证规则并未完全经过测试,有问题欢迎@我。 2. **NextUI 组件**:目前所有表单已经适配完成 [所有已适配组件](https://luoanb.github.io/hook-form-react/classes/NextUI_2_2.html) (如有遗漏后续会补上,@手动 dog,嘿嘿) 3. 修复类型声明不准确问题。 4. 添加测试项目,用于验证功能 - **v0.5.x (底层实现预览)** 1. 底层框架已实现,使用体验顺畅,可直接[往下看高级用法]() 2. 整体拓展性良好,组件库相关代码和表单核心代码是完全隔离的,这为今后支持不同的组件库打下基础。 3. 表单数据状态,表单异常状态完全可控,可以根据业务定制逻辑。 4. 验证规则也是统一实现,拓展和自定义都很方便。 5. 零依赖项,纯 hooks。 ## 组件库支持情况 - 【90 分】 NextUI 体验良好,且有问题会及时修复(自己也在用) - 【80 分】 MUI 在 MUI 自己不支持表单验证的前提下,使用 hook-form-react 也是不会错的,至少相对于 react-hook-form,它没有一堆复杂的概念不是吗。 - 【80 分】 Antd 组件自有表单使用体验不错的,优选选自有表单吧,(后续适配主要考虑双组件库情况)。 - 【60 分】 ...... ## API 参考 本节应详细介绍库中提供的 Hooks、函数及其参数、返回值类型和使用示例,以便开发者能够快速上手并有效利用库的功能。 [API](https://luoanb.github.io/hook-form-react/) ## 贡献指南 我们欢迎并鼓励社区成员对本项目做出贡献,无论是通过提交错误报告、功能请求还是直接提交代码。请参阅我们的贡献指南了解更多信息。 ## 许可证 该项目采用 MIT 许可证,详情请见[LICENSE](./LICENSE)文件。