最近半年,一直在做表单相关的业务,加上自己多年浸淫表单的经验,根据自己感悟,造了一个表单轮子,取名为 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-03-09 14:24:54 +08:00 1
和 react-hook-form 比优势在?还有为什么会觉得写大量的 configuration 会比直接写<Input name='xxx' /> 这种代码更清晰呢?
|
2
murmur 2022-03-09 14:28:00 +08:00
梦回 backbone ,为什么我需要一个一点设计和组件都不提供的表单 model 轮子
|
3
forsigner OP @theohateonion react-hook-form 是非受控表单,复杂表单处理起来会很别扭,并不是只能写 configuration ,可以写 jsx ,例如 `<Field component="Input" label="First Name" name="firstName" />`
|
4
forsigner OP @murmur 社区最流行的表单方案一般都不提供默认 UI ,表单库专注于表单的建模,让用户能舒服处理各种场景,UI 一般是组建库的活
|
5
theohateonion 2022-03-10 08:51:06 +08:00
@forsigner 非受控是什么意思呢?处理复杂表单别扭有具体例子吗?其实不太明白你这个表单库的卖点
|