conform.guide
Open in
urlscan Pro
2606:4700:3031::ac43:ac15
Public Scan
URL:
https://conform.guide/
Submission: On November 22 via manual from US — Scanned from DE
Submission: On November 22 via manual from US — Scanned from DE
Form analysis
0 forms found in the DOMText Content
███████╗ ██████╗ ███╗ ██╗ ████████╗ ██████╗ ███████╗ ███╗ ███╗ ██╔═════╝ ██╔═══██╗ ████╗ ██║ ██╔═════╝ ██╔═══██╗ ██╔═══██╗ ████████║ ██║ ██║ ██║ ██╔██╗██║ ███████╗ ██║ ██║ ███████╔╝ ██╔██╔██║ ██║ ██║ ██║ ██║╚████║ ██╔════╝ ██║ ██║ ██╔═══██╗ ██║╚═╝██║ ╚███████╗ ╚██████╔╝ ██║ ╚███║ ██║ ╚██████╔╝ ██║ ██║ ██║ ██║ ╚══════╝ ╚═════╝ ╚═╝ ╚══╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝enja Getting Started / Overview Getting Started * Overview * Tutorial * Upgrading to v1 * GitHub Guides * Validation * Nested object and Array * Intent button * Accessibility * Checkbox and Radio Group * File Upload Integration * UI Libraries * Remix * Next.js API Reference * useForm * useField * useFormMetadata * useInputControl * FormProvider * FormStateInput Utilities * getFormProps * getFieldsetProps * getInputProps * getSelectProps * getTextareaProps * getCollectionProps Schema related * parseWithZod * parseWithYup * getZodConstraint * getYupConstraint OVERVIEW Conform is a type-safe form validation library utilizing web fundamentals to progressively enhance HTML Forms with full support for server frameworks like Remix and Next.js. #FEATURES * Progressive enhancement first APIs * Type-safe field inference * Fine-grained subscription * Built-in accessibility helpers * Automatic type coercion with Zod #THE GIST Conform gives you control over the form submission lifecycle from client to the server and exposes the form state through the useForm() hook. It does not restrict your form's markup and works with any valid HTML form. The form value will be captured from the DOM using the FormData Web API and is synced through event delegation. 1import { useForm } from '@conform-to/react'; 2import { parseWithZod } from '@conform-to/zod'; 3import { z } from 'zod'; 4import { login } from './your-auth-library'; 5import { useActionResult, redirect } from './your-server-framework'; 6 7// Define a schema for your form 8const schema = z.object({ 9 username: z.string(), 10 password: z.string(), 11}); 12 13// Optional: Server action handler 14export async function action({ request }) { 15 const formData = await request.formData(); 16 const submission = parseWithZod(formData, { schema }); 17 18 // Send the submission back to the client if the status is not successful 19 if (submission.status !== 'success') { 20 return submission.reply(); 21 } 22 23 const session = await login(submission.value); 24 25 // Send the submission with addional error message if login fails 26 if (!session) { 27 return submission.reply({ 28 formErrors: ['Incorrect username or password'], 29 }); 30 } 31 32 return redirect('/dashboard'); 33} 34 35// Client form component 36export default function LoginForm() { 37 // Grab the last submission result if you have defined a server action handler 38 // This could be `useActionData()` or `useFormState()` depending on the framework 39 const lastResult = useActionResult(); 40 const [form, fields] = useForm({ 41 // Configure when each field should be validated 42 shouldValidate: 'onBlur', 43 // Optional: Required only if you're validating on the server 44 lastResult, 45 // Optional: Client validation. Fallback to server validation if not provided 46 onValidate({ formData }) { 47 return parseWithZod(formData, { schema }); 48 }, 49 }); 50 51 return ( 52 <form method="post" id={form.id} onSubmit={form.onSubmit}> 53 <div>{form.errors}</div> 54 <div> 55 <label>Username</label> 56 <input type="text" name={fields.username.name} /> 57 <div>{fields.username.errors}</div> 58 </div> 59 <div> 60 <label>Password</label> 61 <input type="password" name={fields.password.name} /> 62 <div>{fields.password.errors}</div> 63 </div> 64 <button>Login</button> 65 </form> 66 ); 67} Type "/" to search ⚲ On this page * Features * The Gist Related links * Edit this page © 2024 Edmund Hung