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 context(self, props):
return {}

def client(self):
return {
"state": {
"name": "",
"email": "",
"submitted": False,
"error": "",
},
}

def setName(self):
self.state.name = ""

def setEmail(self):
self.state.email = ""

def submit(self):
self.state.submitted = True

def clearError(self):
self.state.error = ""
</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 feedbackself.set("submitted", True)