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 15 天前
还是 antd 的表单好用
|
2
wszgrcy929 OP @gkinxin 此表单库支持多种框架,并且不限表单库,更容易实现复杂逻辑,自带强类型
如果说仅仅是一些普通的表单.当然不需要 并且此定义可以直接用于后端,也就是说如果是一个全栈项目,那么只要实现一个定义,既可以显示表单,又可以创建实体,同时对传入的数据,还能自动进行验证 |