Form

The Form component wires HTML forms to #[submit] handlers with progressive enhancement.

LIVE

#[submit] Form

Basic form

#[data]
struct GreetForm {
    name: String,
}

#[submit]
async fn greet(form: GreetForm, _req: &FlowRequest)
    -> Result<GreetResult, SubmitError>
{
    if form.name.trim().is_empty() {
        return Err(SubmitError::new("Fix errors")
            .field("name", "Required"));
    }
    Ok(GreetResult { message: format!("Hello, {}!", form.name) })
}

view! {
    <Form submit={greet}>
        <input name="name" type="text" required />
        <button type="submit">"Greet"</button>
    </Form>
}

Progressive enhancement

Form renders method="POST" and action="/_resuma/submit/:name". Without JavaScript, the browser submits normally. With the runtime loaded, submit is intercepted for SPA-style updates.

Client-side feedback

When the runtime intercepts submit, responses include ok, value, error, and field_errors. Use js! for optimistic UI updates after submit.

See also

Submit handler details on Actions (submits).