کامپوننت تابعی
نام کامپوننت را با حرف بزرگ آغاز و JSX برگردانید.
function Welcome() { return <h1>سلام</h1>;}
الگوهای روزمرهٔ ساخت رابط React با کامپوننت، props، state، رویداد و افکت. کامپوننت React تابعی است که بر اساس props و state رابط را توصیف میکند. JSX به JavaScript تبدیل میشود و قواعد نوشتاری خودش را دارد. state هر render را توصیف میکند؛ برای بهروزرسانی بر پایهٔ مقدار قبلی از updater function استفاده کنید. فرم کنترلشده مقدار را در React نگه میدارد. از این صفحه بهعنوان مرجع سریع استفاده کنید و مثالها و نکتهها را با نسخهٔ ابزار، نیاز و شرایط واقعی پروژهٔ خود تطبیق دهید.
نام کامپوننت را با حرف بزرگ آغاز و JSX برگردانید.
function Welcome() { return <h1>سلام</h1>;}دادهٔ ورودی را از والد بگیرید و آن را مستقیم mutate نکنید.
type GreetingProps = { name: string };function Greeting({ name }: GreetingProps) { return <p>سلام {name}</p>;}برای حالتهای رابط، ternary یا شرط منطقی روشن بنویسید.
return ( <section> {isLoading ? <Spinner /> : <Content />} {error && <p role="alert">{error}</p>} </section>);تابع handler را به prop رویداد بدهید، نه نتیجهٔ اجرای آن را.
<button onClick={handleSave}>ذخیره</button>برای دادهٔ محلی که با تعامل تغییر میکند از state استفاده کنید.
import { useState } from "react";function Counter() { const [count, setCount] = useState(0); return <button onClick={() => setCount((value) => value + 1)}>{count}</button>;}value و onChange را با هم نگه دارید.
const [email, setEmail] = useState("");<input type="email" value={email} onChange={(event) => setEmail(event.target.value)}/>state مشترک را به نزدیکترین والد مشترک منتقل کنید.
function Parent() { const [selectedId, setSelectedId] = useState(null); return <ItemList selectedId={selectedId} onSelect={setSelectedId} />;}از شناسهٔ داده استفاده کنید؛ index برای فهرست قابلتغییر پایدار نیست.
{products.map((product) => ( <ProductCard key={product.id} product={product} />))}listener را در cleanup پاک کنید تا با renderهای بعدی تکرار نشود.
useEffect(() => { function onResize() { setWidth(window.innerWidth); } window.addEventListener("resize", onResize); return () => window.removeEventListener("resize", onResize);}, []);مقدار ساده را در render محاسبه کنید؛ برای نیازهای اندازهگیریشده memoize کنید.
const completedCount = tasks.filter((task) => task.done).length;loading، empty، error و success را جداگانه و صریح نمایش دهید.
if (isLoading) return <Spinner />;if (error) return <ErrorMessage error={error} />;if (items.length === 0) return <EmptyState />;return <ItemList items={items} />;Provider را بالای مصرفکننده قرار دهید و مقدار context را پایدار نگه دارید.
const ThemeContext = createContext("light");function App() { return ( <ThemeContext.Provider value="dark"> <Toolbar /> </ThemeContext.Provider> );}قابلیت را با ترکیب children بسازید، نه شرطهای پیچیدهٔ داخل یک کامپوننت.
function Panel({ children }) { return <section className="panel">{children}</section>;}ref را برای focus یا تعامل imperative محدود استفاده کنید.
const inputRef = useRef(null);function focusInput() { inputRef.current?.focus();}return <input ref={inputRef} />;کامپوننت تابعی را با نام PascalCase بسازید و خروجی JSX برگردانید.
دادهٔ ورودی را با props بگیرید و برای تغییرات محلی از useState استفاده کنید.
برای فهرستها کلید پایدار و یکتا بدهید؛ از index فقط برای فهرست ثابت استفاده کنید.
رویدادها را با handlerهای تابعی مانند onClick={handleClick} متصل کنید.
مقدار مشتقشده را از props و state محاسبه کنید؛ state تکراری نسازید.
از useEffect فقط برای همگامسازی با سیستم بیرونی استفاده کنید و cleanup را فراموش نکنید.
فرم کنترلشده را با value و onChange بسازید و داده را اعتبارسنجی کنید.
برای context یا state مشترک، مرز مالکیت داده و نیاز واقعی به کتابخانه را بسنجید.
کامپوننتها را بر اساس مسئولیت و رفتار قابل استفاده مجدد جدا کنید.
حالتهای loading، خالی، خطا و موفقیت را در رابط صریح نمایش دهید.
state را در نزدیکترین مالک مشترک نگه دارید و برای هر بهروزرسانی از مقدار قبلی، فرم تابعی setState(prev => ...) را بهکار ببرید.
اثر را برای event handler جایگزین نکنید؛ کار ناشی از کلیک را در handler و همگامسازی بیرونی را در effect بنویسید.