شروع سریع
به داکیومنت ریاکت خوشامدید. این صفحه به شما مقدمهای به ۸۰ درصد از مفاهیم ریاکت که روزانه استفاده میکنید ٬میدهد.
You will learn
- چطور کامپوننت ها را درست کنید و نست کنید
- چطور مارکاپ و استایل اضافه کنید
- چطور دیتا را نمایش دهید
- چطور شروط و لیست ها را رندر کنید
- چطور به رویدادها پاسخ دهید و اسکرین را اپدیت کنید
- چطور دیتا را بین دو کامپوننت به اشتراک بگذارید
ایجاد و نست کامپوننتها
برنامههای React از مؤلفهها ساخته میشوند. یک مؤلفه قطعهای از رابط کاربری (UI) است که منطق و ظاهر خود را دارد. یک مؤلفه میتواند به اندازه یک دکمه کوچک یا به اندازه یک صفحه کامل باشد.
کامپوننتهای ریاکت توابع جاوااسکریپتی هستند که مارکاپ برمیگردانند
function MyButton() {
return (
<button>I'm a button</button>
);
}
MyButton
را تعریف کرده اید٬ میتوانید آن را درون کامپوننت دیگری استفاده کنید.حالا که شما
export default function MyApp() {
return (
<div>
<h1>Welcome to my app</h1>
<MyButton />
</div>
);
}
<MyButton />
با حرف بزرگ شروع میشود. پس از این طریق میدانید که یک کامپوننت ریاکت است. کامپوننتهای ری اکت همیشه باید با حروف بزرگ شروع شوند٬ درصورتی که تگهای اچتیام ال با حروف کوچک.توجه کنید که
به نتیجه نگاه کنید:
function MyButton() { return ( <button> I'm a button </button> ); } export default function MyApp() { return ( <div> <h1>Welcome to my app</h1> <MyButton /> </div> ); }
کلمات کلیدی export default
مؤلفه اصلی در این فایل را مشخص میکنند. اگر با بخشی از دستورات جاوااسکریپت آشنا نیستید، MDN و javascript.info منابع عالی برای مراجعه هستند.
نوشتن markup با JSX
نحوهٔ نشانهگذاری کدی که در بالا دیدهاید، JSX نام دارد. استفاده از آن اختیاری است، اما بیشتر پروژههای React به دلیل راحتیاش از JSX استفاده میکنند. تمامی ابزارهایی که ما برای توسعه محلی توصیه میکنیم از ابتدا JSX را پشتیبانی میکنند.
JSX سختگیرانهتر از HTML است. شما باید تگها را مانند <br />
ببندید. همچنین مؤلفه شما نمیتواند چندین تگ JSX را برگرداند. شما باید آنها را درون یک والد مشترک، مثل <div>...</div>
یا یک بستهبندی خالی <>...</>
قرار دهید:
function AboutPage() {
return (
<>
<h1>About</h1>
<p>Hello there.<br />How do you do?</p>
</>
);
}
اگر بخواهید تعداد زیادی از کدهای HTML را به JSX تبدیل کنید، میتوانید از یک تبدیلکننده آنلاین استفاده کنید.
اضافه کردن استایل
در React، شما یک کلاس CSS را با استفاده از className
مشخص میکنید. این به همان شکلی کار میکند که ویژگی class
در HTML کار میکند.
<img className="avatar" />
سپس شما قوانین سیاساس را در یک فایل جدا برای آن مینویسید
/* In your CSS */
.avatar {
border-radius: 50%;
}
React تعیین نمیکند که چگونه فایلهای CSS را اضافه کنید. در سادهترین حالت، شما یک تگ <link>
به HTML خود اضافه میکنید. اگر از یک ابزار ساخت یا یک چارچوب (framework) استفاده میکنید، به مستندات آن مراجعه کنید تا یاد بگیرید چگونه یک فایل CSS را به پروژه خود اضافه کنید.
نمایش اطلاعات
JSX به شما این امکان را میدهد که نشانهگذاری (markup) را در داخل جاوااسکریپت قرار دهید. کرلی بریسز به شما امکان میدهد که به جاوااسکریپت برگردید تا بتوانید یک متغیر از کد خود تعبیه کنید و آن را به کاربر نمایش دهید. به عنوان مثال، این دستور user.name
را نمایش میدهد:
return (
<h1>
{user.name}
</h1>
);
شما همچنین میتوانید از ویژگیهای JSX به جاوااسکریپت “بپریدید”، اما باید از کرلی بریسز به جای نقلقول استفاده کنید. به عنوان مثال، className="avatar"
رشته "avatar"
را به عنوان کلاس CSS منتقل میکند، اما src={user.imageUrl}
مقدار متغیر جاوااسکریپت user.imageUrl
را میخواند و سپس این مقدار را به عنوان ویژگی src
منتقل میکند:
return (
<img
className="avatar"
src={user.imageUrl}
/>
);
شما میتوانید عبارات پیچیدهتری را هم درون کرلی بریسز JSX قرار دهید، به عنوان مثال، اتصال رشته را نیز میتوانید انجام دهید:
const user = { name: 'Hedy Lamarr', imageUrl: 'https://i.imgur.com/yXOvdOSs.jpg', imageSize: 90, }; export default function Profile() { return ( <> <h1>{user.name}</h1> <img className="avatar" src={user.imageUrl} alt={'Photo of ' + user.name} style={{ width: user.imageSize, height: user.imageSize }} /> </> ); }
در مثال بالا، style={{}}
نه نوعی دستور خاص است، بلکه یک شی {}
معمولی درون کرلی بریسز JSX است. شما میتوانید ویژگی style
را استفاده کنید زمانی که استایلهای شما به متغیرهای جاوااسکریپت وابسته هستند.
Conditional rendering
در React، نه ترکیب نحوی خاصی برای نوشتن شرایط وجود دارد. به جای آن، شما از تکنیکهای همانند نوشتن کد جاوااسکریپت عمومی استفاده میکنید. به عنوان مثال، میتوانید از دستور if
برای اضافه کردن JSX به صورت شرطی استفاده کنید:
let content;
if (isLoggedIn) {
content = <AdminPanel />;
} else {
content = <LoginForm />;
}
return (
<div>
{content}
</div>
);
اگر ترجیح میدهید کد خود را متداولتر نوشته نمایید، میتوانید از اپراتور شرطی ?
استفاده کنید. بر خلاف if
، این اپراتور درون JSX کار میکند:
<div>
{isLoggedIn ? (
<AdminPanel />
) : (
<LoginForm />
)}
</div>
وقتی شاخه else
نیاز ندارید، همچنین میتوانید از نحوهی کوتاهتر عبارت &&
منطقی استفاده کنید:
<div>
{isLoggedIn && <AdminPanel />}
</div>
تمامی این روشها نیز برای مشخص کردن ویژگیها به صورت شرطی کار میکنند. اگر با برخی از این نحوهنویسیهای جاوااسکریپت آشنا نیستید، میتوانید با همیشه استفاده از if...else
شروع کنید.
نمایش لیستها
برای رندر کردن لیستهای مؤلفهها، شما به ویژگیهای جاوااسکریپت مانند حلقه for
و تابع map()
آرایه اعتماد خواهید کرد.
برای مثال٬ فرض کنید ارایه ای از محصولات داریم:
const products = [
{ title: 'Cabbage', id: 1 },
{ title: 'Garlic', id: 2 },
{ title: 'Apple', id: 3 },
];
در داخل مؤلفهتان، از تابع map()
برای تبدیل یک آرایه از محصولات به یک آرایه از موارد <li>
استفاده کنید:
const listItems = products.map(product =>
<li key={product.id}>
{product.title}
</li>
);
return (
<ul>{listItems}</ul>
);
توجه داشته باشید که موارد <li>
دارای ویژگی key
هستند. برای هر مورد در یک لیست، باید یک رشته یا یک عدد ارائه دهید که این مورد را به صورت منحصر به فرد میان همکاران خود شناسایی کند. معمولاً، یک کلید باید از دادههای شما، مانند یک شناسه پایگاهداده، مشتق شود. React از کلیدهای شما برای شناختن چه اتفاقی میافتد، اگر بعداً موارد را درج، حذف یا مرتبسازی کنید.
const products = [ { title: 'Cabbage', isFruit: false, id: 1 }, { title: 'Garlic', isFruit: false, id: 2 }, { title: 'Apple', isFruit: true, id: 3 }, ]; export default function ShoppingList() { const listItems = products.map(product => <li key={product.id} style={{ color: product.isFruit ? 'magenta' : 'darkgreen' }} > {product.title} </li> ); return ( <ul>{listItems}</ul> ); }
پاسخدهی به وقایع
شما میتوانید با تعریف توابع دستگیرنده رویداد درون مؤلفههای خود به رویدادها پاسخ دهید:
function MyButton() {
function handleClick() {
alert('You clicked me!');
}
return (
<button onClick={handleClick}>
Click me
</button>
);
}
توجه داشته باشید که onClick={handleClick}
پرانتز در انتهای خود ندارد! تابع دستگیرنده رویداد را فراخوانی نکنید: شما تنها باید آن را پاس دهید. React هنگامی که کاربر دکمه را کلیک میکند، تابع دستگیرنده رویداد شما را فراخوانی میکند.
به روزرسانی صفحه
بسیار اوقات، شما میخواهید مؤلفهتان برخی اطلاعات را “یادآوری” کند و نمایش دهد. به عنوان مثال، شاید بخواهید تعداد باری که یک دکمه کلیک شده را محاسبه کنید. برای انجام این کار، به مؤلفهتان وضعیت (state) اضافه کنید.
ابتدا، useState
را از React وارد کنید:
import { useState } from 'react';
حالا میتوانید یک متغیر وضعیت (state variable) را درون مؤلفهتان اعلام کنید:
function MyButton() {
const [count, setCount] = useState(0);
// ...
از useState
دو چیز دریافت خواهید کرد: وضعیت فعلی (count
) و تابعی که به شما امکان بهروزرسانی آن را میدهد (setCount
). شما میتوانید به آنها هر نامی دهید، اما عرفا به نوشتن [چیزی، setچیزی]
عمل میکنند.
اولین باری که دکمه نمایش داده میشود، count
برابر با 0
خواهد بود چرا که شما 0
را به useState()
پاس دادهاید. وقتی میخواهید وضعیت را تغییر دهید، تابع setCount()
را فراخوانی کنید و مقدار جدید را به آن بدهید. با کلیک بر روی این دکمه، شمارنده افزایش مییابد:
function MyButton() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
}
return (
<button onClick={handleClick}>
Clicked {count} times
</button>
);
}
React تابع مؤلفه شما را دوباره فراخوانی خواهد کرد. این بار، count
برابر با 1
خواهد بود. سپس به 2
خواهد رسید و به همین ترتیب.
اگر شما چندین بار همان مؤلفه را رندر کنید، هر کدام وضعیت خود را خواهند داشت. هر دکمه را به تنهایی کلیک کنید:
import { useState } from 'react'; export default function MyApp() { return ( <div> <h1>Counters that update separately</h1> <MyButton /> <MyButton /> </div> ); } function MyButton() { const [count, setCount] = useState(0); function handleClick() { setCount(count + 1); } return ( <button onClick={handleClick}> Clicked {count} times </button> ); }
توجه داشته باشید که هر دکمه وضعیت count
خود را “یاد میآورد” و بر روی دکمههای دیگر تأثیر نمیگذارد.
استفاده از هوکها
توابعی که با use
آغاز میشوند به نام هوکها شناخته میشوند. useState
یک هوک تعبیهشده است که توسط React ارائه شده است. شما میتوانید هوکهای دیگر تعبیهشده را در مرجع API پیدا کنید. همچنین میتوانید هوکهای خودتان را با ترکیب هوکهای موجود بسازید.
هوکها محدودتر از توابع دیگر هستند. شما تنها میتوانید هوکها را در بالای مؤلفههای خود (یا هوکهای دیگر) فراخوانی کنید. اگر میخواهید useState
را در یک شرط یا حلقه استفاده کنید، یک مؤلفه جدید استخراج کرده و آن را در آنجا قرار دهید.
به اشتراکگذاری دیتا بین کامپوننتها
در مثال قبلی، هر MyButton
وضعیت مستقل خود را داشت و هنگام کلیک بر روی هر دکمه، تنها count
برای دکمه مورد نظر تغییر میکرد:
به هر حال، بسیار اوقات شما نیاز دارید که مؤلفهها اطلاعات را به اشتراک بگذارند و همواره همراه بهروز شوند.
برای اینکه هر دو مؤلفه MyButton
از یک count
مشترک نمایش دهند و همزمان بهروز شوند، باید وضعیت را از دکمههای فردی به “بالا” به مؤلفه نزدیکتری انتقال دهید که تمام آنها را شامل میشود.
در این مثال، مؤلفه MyApp
است:
حالا وقتی بر روی هر دکمه کلیک میکنید، count
در MyApp
تغییر میکند، که باعث تغییر هر دو count
در MyButton
خواهد شد. اینجا چگونه میتوانید این موضوع را در کد بیان کنید:
ابتدا، وضعیت را به بالا انتقال دهید از MyButton
به MyApp
:
export default function MyApp() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
}
return (
<div>
<h1>Counters that update separately</h1>
<MyButton />
<MyButton />
</div>
);
}
function MyButton() {
// ... we're moving code from here ...
}
سپس، وضعیت را به پائین ارسال کنید از MyApp
به هر MyButton
، همراه با دستگیرنده کلیک مشترک. شما میتوانید اطلاعات را با استفاده از پرانتز زیگزاگ JSX به MyButton
منتقل کنید، به همان نحوی که قبلاً با تگهای تعبیهشده مانند <img>
انجام دادهاید:
export default function MyApp() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
}
return (
<div>
<h1>Counters that update together</h1>
<MyButton count={count} onClick={handleClick} />
<MyButton count={count} onClick={handleClick} />
</div>
);
}
اطلاعاتی که به این شکل به پائین ارسال میکنید ویژگیها (props) نامیده میشوند. اکنون مؤلفه MyApp
حاوی وضعیت count
و دستگیرنده رویداد handleClick
است و هر دوی آنها را به عنوان ویژگی به هر یک از دکمهها ارسال میکند.
سرانجام، MyButton
را تغییر دهید تا ویژگیهایی که از مؤلفه والد خود به آن منتقل کردهاید را بخواند:
function MyButton({ count, onClick }) {
return (
<button onClick={onClick}>
Clicked {count} times
</button>
);
}
وقتی روی دکمه کلیک میکنید، دستگیرنده onClick
فعال میشود. هر onClick
ویژگی دکمه به تابع handleClick
داخل MyApp
تنظیم شده است، بنابراین کد داخل آن اجرا میشود. این کد setCount(count + 1)
را فراخوانی میکند و متغیر وضعیت count
را افزایش میدهد. مقدار جدید count
به عنوان ویژگی به هر دکمه ارسال میشود، بنابراین همه آنها مقدار جدید را نمایش میدهند. این به نام “انتقال وضعیت به بالا” خوانده میشود. با انتقال وضعیت به بالا، شما آن را بین مؤلفهها به اشتراک گذاشتهاید.
import { useState } from 'react'; export default function MyApp() { const [count, setCount] = useState(0); function handleClick() { setCount(count + 1); } return ( <div> <h1>Counters that update together</h1> <MyButton count={count} onClick={handleClick} /> <MyButton count={count} onClick={handleClick} /> </div> ); } function MyButton({ count, onClick }) { return ( <button onClick={onClick}> Clicked {count} times </button> ); }
Next Steps
تا این لحظه، شما اصول اساسی نوشتن کد React را میشناسید!
برای قرار دادن آنها در عمل و ساخت اولین نرمافزار کوچک خود با React، آموزش را بررسی کنید.