Next.js Forms — Controlled Inputs, Validation & Submission
"Controlled input" అంటే, input value ni React state ద్వారా control చేయడం — ప్రతి keystroke కి state update అవుతుంది:
"use client";
import { useState } from "react";
export default function ContactForm() {
const [email, setEmail] = useState("");
function handleSubmit(e: React.FormEvent) {
e.preventDefault();
console.log("Submitted:", email);
}
return (
<form onSubmit={handleSubmit}>
<input
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
placeholder="you@example.com"
/>
<button type="submit">Send</button>
</form>
);
}
e.preventDefault(): Default browser form submission (page reload) ni ఆపేస్తుంది.value={"{"}email{"}"}+onChange: Input value ni React state తో sync చేస్తుంది — "controlled" component makes it.
"use client";
import { useState } from "react";
export default function ContactForm() {
const [email, setEmail] = useState("");
const [error, setError] = useState("");
function handleSubmit(e: React.FormEvent) {
e.preventDefault();
if (!email.includes("@")) {
setError("Please enter a valid email address.");
return;
}
setError("");
console.log("Submitted:", email);
}
return (
<form onSubmit={handleSubmit}>
<input value={email} onChange={(e) => setEmail(e.target.value)} />
{error && <p style={{ color: "red" }}>{error}</p>}
<button type="submit">Send</button>
</form>
);
}
Submission successful అయిన తర్వాత, user కి confirmation చూపించి, form ni reset చేయడం good UX:
function handleSubmit(e: React.FormEvent) {
e.preventDefault();
// ... submit logic here
setSubmitted(true);
setEmail(""); // Reset the input
}
onSubmit handler లో e.preventDefault() మర్చిపోతే, browser default గా page ని full reload చేస్తుంది — React state, SPA-style navigation anni పోతాయి. Every custom form submit handler లో e.preventDefault() తప్పనిసరి.
Build a Newsletter signup form with a single email input, validating that it's not empty before showing a 'Subscribed!' message.
"use client";
import { useState } from "react";
export default function Newsletter() {
const [email, setEmail] = useState("");
const [subscribed, setSubscribed] = useState(false);
function handleSubmit(e: React.FormEvent) {
e.preventDefault();
if (email.trim() === "") return;
setSubscribed(true);
}
if (subscribed) return <p>Subscribed! 🎉</p>;
return (
<form onSubmit={handleSubmit}>
<input value={email} onChange={(e) => setEmail(e.target.value)} placeholder="Email" />
<button type="submit">Subscribe</button>
</form>
);
}
Q Controlled, uncontrolled forms madhya తేడా ఏంటి?
Controlled forms లో input value React state ద్వారా manage అవుతుంది (prathi keystroke ki re-render). Uncontrolled forms లో, DOM tానే value hold చేస్తుంది, useRef ద్వారా submit time లో matrame చదువుతారు.
Q Client-side validation చాలదా, backend validation కూడా అవసరమా?
Backend validation ఎప్పుడూ compulsory — client-side validation ni browser dev tools ద్వారా bypass చేయవచ్చు. Client validation UX కోసం matrame, security కోసం కాదు.
Q Next.js లో forms build చేయడానికి Server Actions better ah, ఈ controlled approach better ah?
Simple forms (search, filters) కి controlled state సరిపోతుంది. Database ki data save చేసే forms (signup, checkout) కి Server Actions (next chapter) better — progressive enhancement, less client JS.