Combinez sémantique native, contrôles et regroupement visuel.
Utilisez <form> pour l’envoi et Form de Liquidify pour le regroupement visuel. Form n’est pas un formulaire HTML et ne stocke aucune valeur.
import { useState } from "react"
import { Button, Form, Picker, TextField, Toggle } from "@liquidify/react"
import "@liquidify/react/styles.css"
export function AccountSettings() {
const [name, setName] = useState("")
const [plan, setPlan] = useState("free")
const [updates, setUpdates] = useState(true)
const save = () => console.log({ name, plan, updates })
return (
<form onSubmit={(event) => event.preventDefault()}>
<Form>
<Form.Section title="Profile">
<label htmlFor="account-name">Display name</label>
<TextField id="account-name" name="name" value={name} onChange={setName} />
</Form.Section>
<Form.Section title="Preferences" footer="You can change these later.">
<Picker
aria-label="Plan"
items={[
{ value: "free", label: "Free" },
{ value: "pro", label: "Pro" },
]}
value={plan}
onChange={setPlan}
/>
<Toggle aria-label="Product updates" checked={updates} onChange={setUpdates} />
</Form.Section>
</Form>
<Button variant="borderedProminent" onPress={save}>Enregistrer</Button>
</form>
)
}TextField participe à FormData via name. Gardez les valeurs de Picker, Toggle, Slider et des autres contrôles composés dans React, puis combinez-les lors de l’envoi.
Utilisez une valeur contrôlée avec onChange, ou defaultValue/defaultChecked pour un état interne. Ne changez pas de mode après le montage.
Associez les champs de texte à des libellés natifs visibles. Utilisez aria-label ou aria-labelledby pour les autres contrôles. Reliez les messages via aria-describedby, aria-invalid ou aria-errormessage selon l’API, sans dépendre uniquement de la couleur.
Consultez Formulaires et l’exemple contrôlé.