interface Test { firstName: string; }
const form = useForm<Test>({ defaultValues: { firstName: "default", }, onSubmit: async ({ value }) => { console.log(value); }, });
<form.Field name="firstName" //... />
firstName
为name
,那么至少需要修改三次,这极大的增加了代码的不稳定性const define = v.object({ firstName: v.optional(v.string(), "default") });
type Define=v.InferOutput<typeof define> // 等价于 type Define = { v1: string; };
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
的字段顺序,则可以参照 MDNv.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"), );
Angular
,Vue
,React
,Svelte
,Solid
![]() | 1 gkinxin 52 天前 还是 antd 的表单好用 |
2 wszgrcy929 OP @gkinxin 此表单库支持多种框架,并且不限表单库,更容易实现复杂逻辑,自带强类型 如果说仅仅是一些普通的表单.当然不需要 并且此定义可以直接用于后端,也就是说如果是一个全栈项目,那么只要实现一个定义,既可以显示表单,又可以创建实体,同时对传入的数据,还能自动进行验证 |