رندر مشروط (Conditional Rendering) یک مفهوم مهم در React است که به توانایی نمایش یا عدم نمایش یک بخش از رابط کاربری به ازای یک شرط خاص اشاره دارد. این کار معمولاً با استفاده از دستورات شرطی مانند `if` یا `ternary operator` انجام میشود. در زیر چند رویکرد برای رندر مشروط در React آورده شده است:
```jsx import React from 'react'; const ConditionalComponent = ({ condition }) => { if (condition) { return <p>This is rendered when the condition is true.</p>; } else { return <p>This is rendered when the condition is false.</p>; } } export default ConditionalComponent; ```
استفاده از ternary operator
یک روش کوتاهتر برای رندر شرطی در React است. این رویکرد از یک عبارت شرطی به نام ternary operator
(یا عملگر سه گانه - سه تایی) استفاده میکند که یک عبارت شرطی را ارزیابی کرده و بسته به نتیجه آن یکی از دو انتخاب را انجام میدهد.
در مثال زیر، یک کامپوننت ساده به نام ConditionalComponent
نوشته شده است. این کامپوننت یک ویژگی به نام condition
دریافت میکند و بسته به مقدار این ویژگی، یک متن مشخص را رندر میکند:
```jsx import React from 'react'; const ConditionalComponent = ({ condition }) => ( condition ? ( <p>This is rendered when the condition is true.</p> ) : ( <p>This is rendered when the condition is false.</p> ) ); export default ConditionalComponent; ```
در اینجا:
condition ? (/* true case */) : (/* false case */)
نشاندهنده ternary operator
است. اگر condition
درست (true) باشد، بخشی که درون پرانتز اول قرار دارد اجرا میشود (در اینجا یک تگ p
با متن "This is rendered when the condition is true")، در غیر این صورت بخشی که درون پرانتز دوم قرار دارد اجرا میشود (یک تگ p
با متن "This is rendered when the condition is false").
این رویکرد خوانایی کد را افزایش میدهد و در صورتی که شرط ساده باشد، اغلب ترجیح داده میشود.
این کد یک کامپوننت ری اکت به نام `ConditionalComponent` ایجاد میکند که بر اساس یک شرط ورودی به نام `condition`، یک متغیر به نام `content` را تعریف میکند. سپس از این متغیر برای تعیین اینکه کدام بخش از JSX باید رندر شود، استفاده میکند.
در اینجا متغیر `content` شامل یک عبارت JSX است که اگر شرط `condition` صحیح باشد، یک پاراگراف متن "This is rendered when the condition is true" را نمایش میدهد؛ در غیر این صورت، یک پاراگراف متن "This is rendered when the condition is false" را نمایش میدهد.
سپس در قسمت `return`، کد از متغیر `content` برای رندر کردن محتوا درون یک `<div>` استفاده میکند. به این ترتیب، اگر `condition` صحیح باشد، پاراگراف مربوط به حالت صحیح درون یک `<div>` رندر میشود و اگر `condition` غیرصحیح باشد، پاراگراف مربوط به حالت غیرصحیح درون یک `<div>` رندر میشود.
از این کامپوننت میتوان در دیگر کامپوننتها یا صفحات React استفاده کرد تا به صورت شرطی، بسته به شرایط مختلف، محتواها را نمایش دهد.
```jsx import React from 'react'; const ConditionalComponent = ({ condition }) => { const content = condition ? <p>This is rendered when the condition is true.</p> : <p>This is rendered when the condition is false.</p>; return <div>{content}</div>; } export default ConditionalComponent; ```
مورد چهارم که با استفاده از &&
انجام میشود، یک روش کمی خلاصهتر از ternary operator
برای رندر شرطی در React است. این رویکرد از &&
به عنوان یک عامل مدارکوتاه (short-circuit) استفاده میکند.
در مثال زیر، یک کامپوننت ساده به نام ConditionalComponent
نوشته شده است. این کامپوننت یک ویژگی به نام condition
دریافت میکند و اگر condition
درست (true) باشد، یک متن مشخص را رندر میکند:
```jsx import React from 'react'; const ConditionalComponent = ({ condition }) => ( <div> {condition && <p>This is rendered when the condition is true.</p>} </div> ); export default ConditionalComponent; ```
در اینجا:
{condition && <p>This is rendered when the condition is true.</p>}
نشاندهنده استفاده از &&
به عنوان یک عامل مدارکوتاه است. اگر condition
درست (true) باشد، عبارت سمت راست عملگر &&
اجرا میشود (در اینجا یک تگ p
با متن "This is rendered when the condition is true")، در غیر این صورت، عبارت سمت راست اجرا نمیشود و چیزی رندر نمیشود.
استفاده از &&
به این دلیل کارآمد است که اگر condition
یا شرط برقرار نباشد یعنی false باشد، اجرا متوقف شده و مقدار بعد از &&
برگردانده نمیشود (مدارکوتاه)، بنابراین میتوان از این خاصیت برای رندر مشروط استفاده کرد.
در همه موارد بالا، محتوای قابل نمایش بر اساس شرط ارائه شده به کامپوننت تصمیمگیری شده و به عنوان بخشی از رابط کاربری رندر میشود یا نمیشود، بسته به این که شرط درست باشد یا خیر. این ساختارها به توسعهدهندگان امکان اعمال منطق مختلف در قسمتهای مختلفی از برنامه را میدهند.
کامپوننتهای شما معمولاً بسته به شرایط مختلف نیاز به نمایش چیزهای مختلفی دارند. در React، میتوانید JSX را با استفاده از دستورات جاوا اسکریپت مانند دستورات if، &&
و عملگرهای ? :
به صورت مشروط رندر کنید.
یاد خواهید گرفت
نحوه برگرداندن JSX های مختلف بسته به شرایط
نحوه گنجاندن یا حذف مشروط یک قطعه از JSX
میانبرهای نحوی مشروط معمولی که در پایگاه های کد React با آنها مواجه خواهید شد
فرض کنید یک کامپوننت PackingList
دارید که چندین Item
را رندر می کند، که می تواند به عنوان بسته بندی شده یا نشده علامت گذاری شود:
function Item({ name, isPacked }) { return <li className="item">{name}</li>; } export default function PackingList() { return ( <section> <h1>Sally Ride's Packing List</h1> <ul> <Item isPacked={true} name="Space suit" /> <Item isPacked={true} name="Helmet with a golden leaf" /> <Item isPacked={false} name="Photo of Tam" /> </ul> </section> ); }
توجه داشته باشید که در برخی از Item
های کامپوننت، prop پراپ isPacked
به true
تنظیم شده است به جای اینکه false
باشد. هدف این است که یک علامت تیک (✔) به آیتمهای بسته بندی شده اضافه کنید یعنی اگر پراپ آیتمی برابرisPacked={true}
باشد پس باید آن آیتم با این مقدار پراپ تیک بخورد.
if (isPacked) { return <li className="item">{name} ✔</li>; } return <li className="item">{name}</li>;
اگر پراپ isPacked برابر true است ، این کد ساختار JSX متفاوتی را برمی گرداند. با این تغییر، برخی از موارد در انتها علامت چک می گیرند:
function Item({ name, isPacked }) { if (isPacked) { return <li className="item">{name} ✔</li>; } return <li className="item">{name}</li>; } export default function PackingList() { return ( <section> <h1>Sally Ride's Packing List</h1> <ul> <Item isPacked={true} name="Space suit" /> <Item isPacked={true} name="Helmet with a golden leaf" /> <Item isPacked={false} name="Photo of Tam" /> </ul> </section> ); }
در کدسندباکس میتوانید این کد را ویرایش کنید و تغییرات را پیگیری کنید:
https://codesandbox.io/s/optimistic-meitner-ccxmw8?file=/App.js
تفسیر کد بالا:
این کد دو کامپوننت React تعریف میکند: `Item` و `PackingList`.
کامپوننت `Item` یک کامپوننت تابعی است که با دو پارامتر `name` و `isPacked` فراخوانی میشود. این کامپوننت یک شرط اجرا میکند. اگر `isPacked` برابر با `true` باشد، یک `<li>` (آیتم لیست) با کلاس "item" و محتوای `{name} ✔` ایجاد میکند (که `✔` نمایانگر این است که آیتم بسته بندی شده است)؛ در غیر این صورت، یک `<li>` با کلاس "item" و محتوای `{name}` ایجاد میشود. در هر دو حالت، یک `<li>` به عنوان خروجی تابع باز میگردد.
کامپوننت `PackingList` یک کامپوننت تابعی است که یک `<section>` شامل یک `<h1>` (عنوان) و یک `<ul>` (لیست نامرتب) ایجاد میکند.
درون `<ul>`، سه نمونه از کامپوننت `Item` با ویژگیهای مختلف فراخوانی میشوند. دو آیتم اول (`Space suit` و `Helmet with a golden leaf`) با `isPacked` برابر با `true` و آیتم سوم (`Photo of Tam`) با `isPacked` برابر با `false` فراخوانی میشوند.
به این ترتیب، `PackingList` یک لیست ایجاد میکند که هر آیتم آن با استفاده از کامپوننت `Item` ، شرطی بر اساس ویژگی `isPacked` را اجرا میکند و متن مناسب را نمایش میدهد.
اگر میخواهید کد بالا را از نزدیک ببینید و تغییر دهید اینجا در کدسندباکس ببینید.
https://codesandbox.io/s/optimistic-meitner-ccxmw8?file=/App.js
توجه کنید که چگونه با جاوا اسکریپت و عبارات if و
return
منطق انشعابی ایجاد می کنید. در React، جریان کنترل (مانند شرطی ها) توسط جاوا اسکریپت مدیریت می شود.