
最近半年,一直在做表单相关的业务,加上自己多年浸淫表单的经验,根据自己感悟,造了一个表单轮子,取名为 Fomir 。
Github 地址:https://github.com/forsigner/fomir
我尝试了很多表单库,比如 redux-form 、formik 、final-form 、react-hook-form 、formilyjs... 它们都非常优秀,但和我的理想型总是差一点。我希望有一个具有以下功能的表单库:
所以我创建了一个新的表单库,并将其命名为 Fomir。
Fomir 的设计思路和灵感有很大一部分来自 slatejs,一个优秀的边界器解决方案。
Fomir 通过传递一个 Form schema 来构建表单, Form schema 是一棵树。Form schema 非常灵活,您可以通过它构建任何表单。
表单中的一切都是状态,改变表单状态非常容易。当您创建复杂业务逻辑表单时,它非常有用。
在某些情况下,表单性能非常重要。Fomir 表单状态管理基于发布订阅的,因此性能很好。当你更新单个字段时,它不会重新渲染整个表单。
在 fomir 中,Form shema 中的 component 属性决定如何渲染表单字段。Fomir 将促使你创建一些表单组件,例如 Input 、Select 、DatePicker... 这将使您在团队中轻松共享表单组件。
fomir 使用 schema 构建表单,因此 fomir 在低代码场景中非常容易使用。当你想创建类似 Form builder 这些东西时,Fomir 可能是一个不错的选择。
Fomir Form 通过 Typescript 提供强类型,让您在编码时捕捉常见错误,并提供编码智能感知。
核心库 fomir 与框架无关, fomir-react 是 react binding 库:
npm install fomir fomir-react 最基本用法,使用 useForm Api:
function BasicForm() { const form = useForm({ onSubmit(values) { alert(JSON.stringify(values, null, 2)) console.log('values', values) }, children: [ { label: 'First Name', name: 'firstName', component: 'Input', value: '', }, { label: 'Last Name', name: 'lastName', component: 'Input', value: '', }, { component: 'Submit', text: 'submit', }, ], }) return <Form form={form} /> } 当然,如果你的表单界面定制性非常强,你也可以使用 jsx:
function BasicForm() { const form = useForm({ onSubmit(values) { alert(JSON.stringify(values, null, 2)) console.log('values', values) }, }) return ( <Form form={form}> <h2>Basic Info</h2> <Box bgGray100 rounded p3 mb4> <Field compOnent="Input" label="First Name" name="firstName" /> <Field compOnent="Input" label="Last Name" name="lastName" /> </Box> <h2>Extra Info</h2> <Box bgGray100 rounded p3 mb4> <Field compOnent="Input" label="Email" name="email" /> <Field compOnent="Textarea" label="Bio" name="bio" /> </Box> <button>Submit</button> </Form> ) } 更详细的使用方法请参见文档:fomir.vercel.app。
1 theohateonion 2022 年 3 月 9 日 和 react-hook-form 比优势在?还有为什么会觉得写大量的 configuration 会比直接写<Input name='xxx' /> 这种代码更清晰呢? |
2 murmur 2022 年 3 月 9 日 梦回 backbone ,为什么我需要一个一点设计和组件都不提供的表单 model 轮子 |
3 forsigner OP @theohateonion react-hook-form 是非受控表单,复杂表单处理起来会很别扭,并不是只能写 configuration ,可以写 jsx ,例如 `<Field compOnent="Input" label="First Name" name="firstName" />` |
5 theohateonion 2022 年 3 月 10 日 @forsigner 非受控是什么意思呢?处理复杂表单别扭有具体例子吗?其实不太明白你这个表单库的卖点 |