#leptos #web #html #wasm

leptos_form_tool

为 leptos 创建表单的声明式方法

3 个不稳定版本

0.2.1 2024 年 7 月 31 日
0.2.0 2024 年 7 月 31 日
0.1.0 2024 年 6 月 19 日

#1458 in 网页编程

Download history 183/week @ 2024-06-17 9/week @ 2024-06-24 233/week @ 2024-07-29 31/week @ 2024-08-05

264 每月下载量

MIT/Apache

130KB
2.5K SLoC

leptos_form_tool

crates.io docs.rs

leptos 的声明式表单创建方法。

leptos_form_tool 允许您以声明式的方式定义表单。需要一个文本框?只需在表单构建器上调用 .text_input。然后,分别定义一个 FormStyle 来指定该文本框应该如何渲染。这有几个优点

  • 将表单布局与其渲染和样式分离
  • 允许快速切换不同的样式

验证

您可能会问,为什么不直接使用组件呢?

创建 leptos_form_tool 的最大原因是支持验证字段。这种验证逻辑可能相当复杂,例如,您可能希望在用户点击提交时在客户端执行验证,以便立即向用户提供关于任何无效输入的反馈。但您通常还希望在服务器上执行相同的验证,以保护不受来自您的客户端或未启用 WASM 的用户的请求。

此外,您可能希望根据另一个控制器的值更改一个控制器的验证。例如,您可能想确保“日”字段在有效的范围内,但这个范围取决于用户在“月”字段中的选择。或者您可能想确保“确认密码”字段与“密码”字段匹配。leptos_form_tool 使这变得容易,因为您提供的验证函数作用于整个表单的数据。

有时您可能不想显示某些控件,并且这些控件的验证只能在它们可见时进行。

lepos_form_tool 会为您处理所有这些。

FormStyle

为了定义表单可能使用的所有组件的渲染方式,您需要定义一个实现 FormStyle 特性的类型。这个特性为表单可能需要渲染的每个控件都有一个方法。要使用这种新样式,只需更改您的表单的 Style 关联特性为您的新类型即可。

实际上,这比那要复杂一点...

为了给自定义样式提供更多的自由度,以便根据每个控件独立配置其渲染方式,样式将定义一个关联的类型(通常是枚举),称为 StylingAttributes。可以通过在控件构建器上调用 .style(/* style */) 来向控件添加样式属性。这些样式属性在渲染该控件时对 FormStyle 实现是可访问的。

因此,替换样式也要求替换所有的 .style() 调用。

构建器

leptos_form_tool 大量使用了构建器模式。您将通过在构建器上调用方法来构建表单、控件,有时甚至验证函数,构建器根据您提供的值构建对象。

上下文

有时,您可能希望能够使用表单上下文中的某些内容来渲染表单。例如,您可能希望使用用户的令牌作为上下文,如果他们是管理员,则仅渲染表单的一部分。或者,您可能需要动态获取某个下拉列表的选项。表单的上下文是解决这些问题的方案。

在表单上,您定义关联的类型 Context。然后,每次构建一个 Form 时,都必须提供该上下文。上下文可用于构建表单,并可以改变要渲染的控件。每个控件构建器函数(例如 .text_input())都有一个上下文变体(例如 .text_input_cx()),允许您在构建该控件时使用上下文。

为了避免很多麻烦,上下文一旦传递到表单就不可变。然而,您可以在上下文中使用 leptos 信号,因为您不需要可变访问来调用信号的 get/set。

由于上下文可以改变表单的渲染方式以及显示/隐藏的控件(从而改变要验证的控件),因此需要在服务器端验证表单数据时使用上下文。通常,在服务器上验证表单时,您应该传递与客户端相同的上下文,以确保验证逻辑相同。如果您确信更改上下文不会改变任何验证,则可以在服务器和客户端使用不同的上下文。

需要注意的是,对于不显示的控件(例如,.show_when(/* condition */) 的条件评估为 false),该字段的验证不会运行。

自定义组件

leptos_form_tool 支持在用户空间中定义自定义组件。这使 leptos_form_tool 能够不受限制地执行操作。表单构建器上有 custom_* 方法,允许您添加组件。

入门指南

通过示例学习,请参阅 示例项目

要遵循入门指南,请参阅 getting_started.md

兼容性

form_tool 版本 leptos 版本
0.1.0 0.6
0.2.0 0.6

贡献

要贡献,请分叉存储库并创建一个 PR。如果您发现一个错误,请随时打开一个 issue。

通过贡献,您同意您的更改受以下许可协议的约束:/LICENSE

依赖项

~20-32MB
~524K SLoC