Fomir: 又一个表单轮子 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
forsigner

Fomir: 又一个表单轮子

  •  1
     
  •   forsigner
    forsigner 2022 年 3 月 9 日 2777 次点击
    这是一个创建于 1508 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    为什么又要一个轮子?

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

    • Api 简洁,易用使用
    • 易于更新表单状态,优雅处理联动逻辑
    • 高性能,局部 render
    • 高可定制
    • 易于团队内沉淀组件

    所以我创建了一个新的表单库,并将其命名为 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

    5 条回复    2022-03-10 08:51:06 +08:00
    theohateonion
        1
    theohateonion  
       2022 年 3 月 9 日   1
    和 react-hook-form 比优势在?还有为什么会觉得写大量的 configuration 会比直接写<Input name='xxx' /> 这种代码更清晰呢?
    murmur
        2
    murmur  
       2022 年 3 月 9 日
    梦回 backbone ,为什么我需要一个一点设计和组件都不提供的表单 model 轮子
    forsigner
        3
    forsigner  
    OP
       2022 年 3 月 9 日
    @theohateonion react-hook-form 是非受控表单,复杂表单处理起来会很别扭,并不是只能写 configuration ,可以写 jsx ,例如 `<Field compOnent="Input" label="First Name" name="firstName" />`
    forsigner
        4
    forsigner  
    OP
       2022 年 3 月 9 日
    @murmur 社区最流行的表单方案一般都不提供默认 UI ,表单库专注于表单的建模,让用户能舒服处理各种场景,UI 一般是组建库的活
    theohateonion
        5
    theohateonion  
       2022 年 3 月 10 日
    @forsigner 非受控是什么意思呢?处理复杂表单别扭有具体例子吗?其实不太明白你这个表单库的卖点
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     825 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 45ms UTC 21:52 PVG 05:52 LAX 14:52 JFK 17:52
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86