آموزش Props در React و نحوه انتقال داده از والد به فرزند با انواع دادهها، Destructuring، children و نکات کلیدی برای مدیریت بهتر کامپوننتها
در دنیای React، کامپوننتها مانند قطعات یک پازل هستند که برای ساخت یک برنامه کامل باید با هم ارتباط داشته باشند. ابزار اصلی این ارتباط، Props هستند. در این آموزش جامع، با مفهوم Props، نحوه استفاده، انواع دادهها و ترفندهای کاربردی آن آشنا میشوید.
Props که مخفف Properties است، یک شیء (Object) در جاوااسکریپت بوده که دادهها را از کامپوننت والد (Parent) به کامپوننت فرزند (Child) منتقل میکند. این مکانیزم مانند ارسال آرگومان به یک تابع عمل کرده و به فرزند اجازه میدهد تا بر اساس دادههای دریافتی، رفتار و ظاهر خود را تنظیم کند.
دو اصل طلایی Props:
ارسال Props مانند اضافه کردن ویژگی به تگهای HTML است:
function App() {
return (
<UserCard
name="سارا"
age={28}
isOnline={true}
onNotify={() => alert("ارسال شد!")}
/>
);
}function UserCard(props) {
return (
<div>
<h2>{props.name}</h2>
<p>سن: {props.age}</p>
<p>وضعیت: {props.isOnline ? "آنلاین 🟢" : "آفلاین 🔴"}</p>
<button onClick={props.onNotify}>ارسال پیام</button>
</div>
);
}function UserCard({ name, age, isOnline, onNotify }) {
return (
<div>
<h2>{name}</h2>
<p>سن: {age}</p>
<p>وضعیت: {isOnline ? "آنلاین 🟢" : "آفلاین 🔴"}</p>
<button onClick={onNotify}>ارسال پیام</button>
</div>
);
}✅ این روش به دلیل خوانایی بالاتر و کدنویسی کمتر، در پروژههای حرفهای بسیار رایج است.
یکی از قدرتهای React این است که هر نوع داده جاوااسکریپتی را میتوان به عنوان Props ارسال کرد:
| نوع داده | نحوه ارسال | مثال |
|---|---|---|
| رشته | مستقیم با کوتیشن | name="علی" |
| عدد | داخل آکولاد | age={25} |
| بولین | داخل آکولاد | isActive={true} |
| آرایه | داخل آکولاد | items={["خانه", "کار"]} |
| آبجکت | داخل آکولاد با دو آکولاد | user={{ id: 1, role: "admin" }} |
| تابع | داخل آکولاد | onClick={handleClick} |
| JSX | از طریق children | children={<h1>عنوان</h1>} |
children برای محتوای تو در توگاهی نیاز داریم کامپوننتهایی بسازیم که بتوانند محتوای دلخواه را درون خود دریافت کنند. این کار با children امکانپذیر است.
// کامپوننت والد
function App() {
return (
<Card>
<h2>عنوان کارت</h2>
<p>توضیحات کارت اینجا قرار میگیرد</p>
<button>مشاهده</button>
</Card>
);
}// کامپوننت فرزند (Card)
function Card({ children }) {
return (
<div>
<h1>این هم یک متن دیگر</h1>
<div>
{children} {/* کل محتوای داخل Card در اینجا نمایش داده میشود */}
</div>
</div>
);
}✅ این تکنیک برای ساخت Layout، مودالها، کارتها و کامپوننتهای wrapper بسیار کاربردی است.
با defaultProps میتوانید مقادیر پیشفرض تعریف کنید تا در صورت ارسال ندادن، خطایی رخ ندهد:
function Button({ label, variant = "primary" }) {
return <button className={`btn-${variant}`}>{label}</button>;
}برای جلوگیری از خطاهای احتمالی، از prop-types استفاده کنید:
npm install prop-typesimport PropTypes from 'prop-types';
function UserCard({ name, age, isOnline }) {
// ...
}
UserCard.propTypes = {
name: PropTypes.string.isRequired, // اجباری
age: PropTypes.number, // اختیاری
isOnline: PropTypes.bool,
};اگر تعداد Props زیاد است، میتوانید از Spread Operator استفاده کنید:
const userData = { name: "احمد", age: 30, city: "تهران" };
<UserCard {...userData} />
// معادل: <UserCard name="احمد" age={30} city="تهران" />import React from 'react';
// کامپوننت فرزند
function ProductCard({ title, price, isDiscount, children, onBuy }) {
return (
<div className={`product-card ${isDiscount ? "discount" : ""}`}>
<h3>{title}</h3>
<p>قیمت: {isDiscount ? price * 0.8 : price} تومان</p>
{isDiscount && <span className="badge">تخفیف ویژه</span>}
<div className="product-actions">
{children}
<button onClick={onBuy}>خرید</button>
</div>
</div>
);
}
// کامپوننت والد
function App() {
const handleBuy = () => alert("محصول به سبد خرید اضافه شد");
return (
<ProductCard
title="لپتاپ ایسوس"
price={25000000}
isDiscount={true}
onBuy={handleBuy}
>
<span>⭐ ۴.۵ ستاره</span>
</ProductCard>
);
}
export default App;| ویژگی | Props | State |
|---|---|---|
| مالکیت | والد | خود کامپوننت |
| قابلیت تغییر | غیرقابل تغییر (Immutable) | قابل تغییر (Mutable) |
| کاربرد | انتقال داده به فرزند | مدیریت دادههای داخلی |
| دسترسی | از بالا به پایین | فقط در همان کامپوننت |
Props قلب ارتباطات در React هستند. با تسلط بر Props میتوانید:
به یاد داشته باشید که Props همیشه فقط خواندنی هستند و هر گونه تغییر باید در State یا والد مدیریت شود. با رعایت اصول مطرح شده، کدهای تمیز و حرفهای بنویسید.