Skip to main content

Form Handling

A controlled form with input binding, validation state, and submit feedback.

Component

components/ContactForm/ContactForm.lspa

<python>
class ContactForm(Component):
def setup(self, props):
state = {"name": "", "email": "", "submitted": False, "error": ""}

def setName():
state["name"] = ""

def setEmail():
state["email"] = ""

def submit():
state["submitted"] = True

def clearError():
state["error"] = ""

return {
"props": props,
"state": state,
"data": {},
"actions": {
"setName": setName,
"setEmail": setEmail,
"submit": submit,
"clearError": clearError,
},
"lifecycle": {},
}
</python>

<template>
<form class="form">
<div l-if="state.submitted" class="form__success">
Thank you!
</div>

<div l-else>
<label>
Name
<input type="text" :value="state.name" @input="setName" />
</label>

<label>
Email
<input type="email" :value="state.email" @input="setEmail" />
</label>

<p l-if="state.error" class="form__error">{{ state.error }}</p>

<button type="button" @click="submit">Send</button>
</div>
</form>
</template>

State machine view

Patterns used

PatternHow
Controlled input:value="state.name" + @input="setName"
Conditional sectionl-if="state.submitted" / l-else
Error displayl-if="state.error"
Submit feedbackaction callable updates state.submitted