Fomir: 又一个表单轮子

2022-03-09 10:42:47 +08:00
 forsigner

最近半年,一直在做表单相关的业务,加上自己多年浸淫表单的经验,根据自己感悟,造了一个表单轮子,取名为 Fomir 。

Github 地址:https://github.com/forsigner/fomir

为什么又要一个轮子?

我尝试了很多表单库,比如 redux-form 、formik 、final-form 、react-hook-form 、formilyjs... 它们都非常优秀,但和我的理想型总是差一点。我希望有一个具有以下功能的表单库:

所以我创建了一个新的表单库,并将其命名为 Fomir

灵感

Fomir 的设计思路和灵感有很大一部分来自 slatejs,一个优秀的边界器解决方案。

特性

Schema-First

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

当然,如果你的表单界面定制性非常强,你也可以使用 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

2144 次点击
所在节点    程序员
5 条回复
theohateonion
2022-03-09 14:24:54 +08:00
和 react-hook-form 比优势在?还有为什么会觉得写大量的 configuration 会比直接写<Input name='xxx' /> 这种代码更清晰呢?
murmur
2022-03-09 14:28:00 +08:00
梦回 backbone ,为什么我需要一个一点设计和组件都不提供的表单 model 轮子
forsigner
2022-03-09 15:21:42 +08:00
@theohateonion react-hook-form 是非受控表单,复杂表单处理起来会很别扭,并不是只能写 configuration ,可以写 jsx ,例如 `<Field component="Input" label="First Name" name="firstName" />`
forsigner
2022-03-09 15:24:14 +08:00
@murmur 社区最流行的表单方案一般都不提供默认 UI ,表单库专注于表单的建模,让用户能舒服处理各种场景,UI 一般是组建库的活
theohateonion
2022-03-10 08:51:06 +08:00
@forsigner 非受控是什么意思呢?处理复杂表单别扭有具体例子吗?其实不太明白你这个表单库的卖点

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/839052

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX