我开源了一个可能是功能最全的表单库-支持 Angular,Vue,React,Svelte,Solid - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wszgrcy929
V2EX    前端开发

我开源了一个可能是功能最全的表单库-支持 Angular,Vue,React,Svelte,Solid

  •  
  •   wszgrcy929 53 天前 1082 次点击
    这是一个创建于 53 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 地址piying-view
    • 我查看了市面上所有的表单库都有一个致命的缺点,定义多次才能实现表单
    • 比如,像下面的代码(伪代码)
    interface Test { firstName: string; } 
    const form = useForm<Test>({ defaultValues: { firstName: "default", }, onSubmit: async ({ value }) => { console.log(value); }, }); 
    <form.Field name="firstName" //... /> 
    • 众所周知,实现的越多,那么未来出现错误的概率越大
    • 像上面的场景,如果我们想修改firstNamename,那么至少需要修改三次,这极大的增加了代码的不稳定性
    • 所以我实现了一个表单库皮影.仅用一次定义,实现了以上所有逻辑
    const define = v.object({ firstName: v.optional(v.string(), "default") }); 
    • 并且,可以很容易获得类型
    type Define=v.InferOutput<typeof define> // 等价于 type Define = { v1: string; }; 

    皮影是如何实现上面的逻辑的?

    • 首先感谢valibot,上面的代码其实就是一个简单的schema定义
    • 皮影实现了一个遍历器,收集相关元数据
    • 然后将元数据转换为组件和表单配置
    • 使其可以在任何前端框架上使用

    定义是固定的,那么怎么实现布局呢?

    • 皮影实现了布局移动,通过layout方法可以将任何控件移动到可以存在子级的 schema 中
    v.intersect([ v.pipe(v.object({}), setAlias("scope1")), v.object({ key1: v.pipe( v.object({ test1: v.pipe(v.optional(v.string(), "value1"), layout({ keyPath: ["#", "@scope1"] })), }), ), }), ]); 
    • 也就是说,定义虽然是固定的,但是在视图中是可以自由决定位置的,做到了定义与视图位置分离
    • 关于object的字段顺序,则可以参照 MDN

    如何进行更加高级的布局?

    • 我们都知道,有时候不仅仅要显示字段,可能还需要更多额外的功能
    • 比如控件的标签,验证,悬停提示,则可以通过包装器实现
    v.pipe(v.number(), v.title("k2-label"), setWrappers(["label"])); 
    • 而如果要修改空间组的样式,则可以自定义组件

      虽然包装器也可以用于控件组,但是直接自定义会更方便些

    v.pipe( v.object({ k1: v.pipe(v.string(), v.title("k1-label"), setWrappers(["label"])), k2: v.pipe(v.number(), v.title("k2-label"), v.minValue(10), setWrappers(["label", "validator"])), }), setComponent("fieldset"), ); 

    如何自定义包装器/组件?

    • 上面的一些代码,我并没有说是应用于哪个前端框架,因为它们都是通用的
    • 而包装器和组件的定义却是每个框架各有不同的方法
    • 大家可以查看快速开始查找自己所使用的框架的定义方法.

    现在是否可以使用?

    2 条回复    2025-08-20 20:11:54 +08:00
    gkinxin
        1
    gkinxin  
       52 天前
    还是 antd 的表单好用
    wszgrcy929
        2
    wszgrcy929  
    OP
       52 天前
    @gkinxin 此表单库支持多种框架,并且不限表单库,更容易实现复杂逻辑,自带强类型
    如果说仅仅是一些普通的表单.当然不需要
    并且此定义可以直接用于后端,也就是说如果是一个全栈项目,那么只要实现一个定义,既可以显示表单,又可以创建实体,同时对传入的数据,还能自动进行验证
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     862 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 20:33 PVG 04:33 LAX 13:33 JFK 16:33
    Do have faith in what you're doing.
    ubao 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