#yew-component #forms #model-view-controller #validation #opinionated #html #map

yew_form

将 MVC 带入 Yew!一组具有轻微偏见的 Yew 组件,用于将模型映射和验证到 HTML 表单

7 个版本

0.1.7 2020 年 9 月 2 日
0.1.5 2020 年 7 月 16 日
0.1.4 2020 年 3 月 5 日
0.1.2 2020 年 2 月 26 日

#1632 in 网页编程

每月 38 次下载
用于 yew_form_derive

MIT 许可证

30KB
797

License:MIT License:Apache

Yew Form

将 MVC 带入 Yew!一组具有轻微偏见的 Yew 组件,用于将模型映射和验证到 HTML 表单。

在线演示

支持

  • 与结构体双向绑定(支持嵌套结构体)
  • 验证(使用 Keats Validator)
  • 目前仅支持 Stringbool 字段。更多功能即将推出

用法

Cargo.toml

[dependencies]
validator = "0.10"
validator_derive = "0.10"
yew = "0.12"
yew_form = "0.1"
yew_form_derive = "0.1.4"

main.rs

#[macro_use]
extern crate validator_derive;
extern crate yew_form;
#[macro_use]
extern crate yew_form_derive;

示例

考虑以下模型

#[derive(Model, Validate, PartialEq, Clone)]
struct Address {
    #[validate(length(min = 1, message="Street is required"))]
    street: String,
    #[validate(length(min = 1, message="City name is required"))]
    city: String,
    #[validate(regex(path="PROVINCE_RE", message="Enter 2 digit province code"))]
    province: String,
    postal_code: String,
    country: String,
}

#[derive(Model, Validate, PartialEq, Clone)]
struct Registration {
    #[validate(length(min = 1, message="First name is required"))]
    first_name: String,
    #[validate(length(min = 1, message="Last name is required"))]
    last_name: String,
    quantity: u32,
    price: f64,
    #[validate]
    address: Address,
    #[validate(custom = "must_be_true")]
    accept_terms: bool,
}

可以使用以下定义将结构体绑定到 Yew 表单

struct App {
    form: Form<Registration>,
    ...
}

目前,需要按照以下方式实例化 Form

fn create(_props: Self::Properties, link: ComponentLink<Self>) -> Self {
    // Create model initial state
    let model = Registration {
        first_name: String::from("J-F"),
        last_name: String::from("Bilodeau"),
        address: Address {
            street: String::new(),
            city: String::from("Ottawa"),
            province: String::from("ONT"),
            postal_code: String::from("K2P 0A4"),
            country: String::new(),
        },
    };

    Self {
        form: Form::new(model),
        ...
    }
    ...

可以按照以下方式向表单添加字段

<Field<Registration> form=&self.form field_name="first_name" oninput=self.link.callback(|_: InputData| AppMessage::Update) />
...
<Field<Registration> form=&self.form field_name="address.street" oninput=self.link.callback(|_: InputData| AppMessage::Update) />
...
<CheckBox<Registration> field_name="accept_terms" form=&self.form />

Field 组件负责在 struct Registration 和 HTML <input> 之间进行双向绑定

当用户编辑表单或程序化时,将自动进行验证。

if self.form.validate() {
    ...
}

待办事项/愿望清单

  • 添加文档(进行中)
  • 从模型中移除 clone 要求
  • 为模型添加 derive 以移除对 vec! 的需要
  • 使 oninput 可选
  • Field 更新时,让 Yew 更新视图
  • 需要向 Field 添加额外的 HTML 属性
  • 移除硬编码的 Bootstrap 样式
  • 支持额外的类型,如 i32
  • 支持 Vec<T>
  • 支持 Rust 稳定版

变更日志

0.1.7

  • 从代码中删除 #![feature(get_mut_unchecked)] (感谢 L0g4n

0.1.6

  • 删除了不安全代码
  • 更新文档中的 yew_form 版本

0.1.5

  • 更新到 Yew 0.17

0.1.4

  • 为 FieldValue 添加了泛型实现以支持 i32bool 等...

0.1.3

重大变更

  • 添加了 #[derive(Model)]
  • 不需要手动将字段向量传递给 Form::new()

0.1.2

  • 添加了复选框

0.1.1

  • 使 Field::oninput 可选

(用 ❤️ 用 Rust 制作)

依赖项

~9.5MB
~199K SLoC