MoonBit native headless form state library (architecture inspired by TanStack Form)
Dependencies
# 核心包 + 内置规则(零第三方依赖)
moon add 2d5rrr333/moonform/core
moon add 2d5rrr333/moonform/rules// moon.mod.json 中出现:
"deps": { "2d5rrr333/moonform": "0.1.1" }// 按需在包的 moon.pkg 中引入:
{
"import": [
"2d5rrr333/moonform/core",
"2d5rrr333/moonform/rules"
]
}| 包 | 依赖 | 说明 |
|---|---|---|
| core | 零 | 状态机、Key/Lens、MetaStore、订阅、Clock、Validator、提交编排 |
| rules | 零 | required/min/max/length/pattern/contains/equals/non_blank/numeric/must_be_true/自定义闭包 |
| 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() -> 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 handle = @formreact.use_field_handle(bridge)
let state = @react.use_sync_external_store(
() => handle.subscribe(),
() => handle.get_snapshot(),
)
// state.value / state.errors / state.is_touched ...moon test --target js # 210 tests(含上游译文 + 文档测试)
moon test --target wasm # 205 tests
moon test --target native # CI 已验证(GitHub Actions 五作业全绿)
moon run src/examples/login --target js # 示例验收Install
Download zipMoonBit native headless form state library (architecture inspired by TanStack Form)
Dependencies