To manage validation across multiple fields in a form, wrap your fields in a FieldContextProvider. This allows you to trigger validation for the entire group of fields.
Each input component (like Input, Select, Slider, etc.) accepts a rules prop containing a vector of specific rule types (e.g., InputRule, SelectRule). You can also provide custom validation logic using a .validator() method which returns a Result<(), FieldValidationState::Error>.
To trigger validation manually (for example, on a submit button click), use FieldContextInjection::expect_context() to access the context and call .validate().
view! {
<form>
<FieldContextProvider>
<Field label="Username" name="username">
<Input rules=vec![InputRule::required(true.into())]/>
</Field>
<Field label="SpinButton" name="spinbutton">
<SpinButton
step_page=1
rules=vec![SpinButtonRule::validator(move |v, _| {
if v % 2 == 0 {
Err(FieldValidationState::Error("It has to be odd!".to_string()))
} else {
Ok(())
}
})]
/>
</Field>
<Button
button_type=ButtonType::Submit
on_click={
let field_context = FieldContextInjection::expect_context();
move |e: ev::MouseEvent| {
if !field_context.validate() {
e.prevent_default();
}
}
}
>
"Submit"
</Button>
</FieldContextProvider>
</form>
}