MoonBit native headless form state library (architecture inspired by TanStack Form)
| 包 | 依赖 | 说明 |
|---|---|---|
| core | 零 | 状态机、Key/Lens、MetaStore、订阅、Clock、Validator、提交编排 |
| rules | 零 | required/min/max/length/pattern/contains/自定义闭包 |
| schema | vendor moonschema | moonschema 适配(JSON-Pointer 错误路径 → 字段错误槽) |
| react | tiye/react | FieldBridge + use_field(js 目标) |
| lens-gen | 零 | .mbti 驱动的访问器代码生成器(增量增强) |
| examples/login | 全部 | 登录表单示例(headless 验证可跑) |
struct Login {
email : String
password : String
} derive(Eq, Debug)
fn email_l() -> @core.Lens[Login, String] {
@core.field("email", v => v.email, (v, e) => { ..v, email: e })
}
let form = @core.FormApi::make({ email: "", password: "" })
let email = form.field(
email_l(),
on_change_validate=@rules.required().then(@rules.min_length(3)),
)
email.mount()
email.set_value("ab") // → errors: ["Must be at least 3 characters"]
email.handle_blur() // → touched + blurred
form.handle_submit(submit_options=...) // 校验拦截 / 提交生命周期fn friends_l() -> @core.Lens[Form, Array[Friend]] = ...
form.push_value(friends_l(), friend)
form.remove_value(friends_l(), 0) // friends[1].name 的错误迁移到 friends[0].name
form.swap_values(friends_l(), 0, 2)let clock = @core.VirtualClock::make()
let form = @core.FormApi::make(values).with_clock(clock.clock())
let field = form.field(
email_l(),
on_change_async_debounce_ms=500,
on_change_async_validate=@core.async_validator(...),
)
field.set_value("x")
clock.run_all() // 防抖窗口 + 校验完成,一次推进let bridge = @formreact.FieldBridge::make(form, email_l())
let state = @react.use_sync_external_store(subscribe..., () => bridge.state())
// state.value / state.errors / state.is_touched ...moon test --target js # 192 tests(含上游译文)
moon test --target wasm # 同
moon check --target native # native 可编译(跑 test 需本机 C 编译器)
moon run src/examples/login --target js # 示例验收Install
Download zipMoonBit native headless form state library (architecture inspired by TanStack Form)