` استفاده کنید:](/reference/react/Fragment#rendering-a-list-of-fragments)
```js
import { Fragment } from 'react';
@@ -393,46 +392,46 @@ const listItems = people.map(person =>
);
```
-Fragments disappear from the DOM, so this will produce a flat list of ``, `
`, `
`, `
`, and so on.
+فرگمنتها از DOM ناپدید میشوند، بنابراین این کار یک لیست صاف از `
`, `
`, `
`, `
`, و به همین ترتیب تولید خواهد کرد.
-### Where to get your `key` {/*where-to-get-your-key*/}
+### کجا باید `کلید` خود را بگیرید؟ {/*where-to-get-your-key*/}
-Different sources of data provide different sources of keys:
+منابع مختلف داده، منابع مختلفی برای کلیدها فراهم میکنند:
-* **Data from a database:** If your data is coming from a database, you can use the database keys/IDs, which are unique by nature.
-* **Locally generated data:** If your data is generated and persisted locally (e.g. notes in a note-taking app), use an incrementing counter, [`crypto.randomUUID()`](https://developer.mozilla.org/en-US/docs/Web/API/Crypto/randomUUID) or a package like [`uuid`](https://www.npmjs.com/package/uuid) when creating items.
+* **دادهها از یک پایگاه داده:** اگر دادههای شما از یک پایگاه داده میآید، میتوانید از کلیدها/شناسههای پایگاه داده استفاده کنید که به طور طبیعی منحصر به فرد هستند.
+* **دادههای تولید شده به صورت محلی:** اگر دادههای شما به صورت محلی تولید و ذخیره میشود (مثلاً یادداشتها در یک اپلیکیشن یادداشتبرداری)، از یک شمارنده افزایشی، [`crypto.randomUUID()`](https://developer.mozilla.org/en-US/docs/Web/API/Crypto/randomUUID) یا یک پکیج مانند [`uuid`](https://www.npmjs.com/package/uuid) هنگام ایجاد آیتمها استفاده کنید.
-### Rules of keys {/*rules-of-keys*/}
+### قوانین کلیدها {/*rules-of-keys*/}
-* **Keys must be unique among siblings.** However, it’s okay to use the same keys for JSX nodes in _different_ arrays.
-* **Keys must not change** or that defeats their purpose! Don't generate them while rendering.
+* **کلیدها باید در میان دسته خود منحصر به فرد باشند.** اما استفاده از کلیدهای مشابه برای نودهای JSX در _آرایههای متفاوت_ اشکالی ندارد.
+* **کلیدها نباید تغییر کنند** زیرا این کار هدف آنها را بیاثر میکند! از تولید آنها در حین رندرینگ خودداری کنید.
-### Why does React need keys? {/*why-does-react-need-keys*/}
+### چرا React به کلیدها نیاز دارد؟ {/*why-does-react-need-keys*/}
-Imagine that files on your desktop didn't have names. Instead, you'd refer to them by their order -- the first file, the second file, and so on. You could get used to it, but once you delete a file, it would get confusing. The second file would become the first file, the third file would be the second file, and so on.
+تصور کنید که فایلها در دسکتاپ شما نام نداشته باشند. در عوض، شما آنها را بر اساس ترتیبشان ارجاع میدهید — فایل اول، فایل دوم و به همین ترتیب. شاید به این موضوع عادت کنید، اما زمانی که یک فایل حذف شود، این موضوع گیجکننده میشود. فایل دوم به فایل اول تبدیل میشود، فایل سوم به فایل دوم و همینطور ادامه مییابد.
-File names in a folder and JSX keys in an array serve a similar purpose. They let us uniquely identify an item between its siblings. A well-chosen key provides more information than the position within the array. Even if the _position_ changes due to reordering, the `key` lets React identify the item throughout its lifetime.
+نام فایلها در یک پوشه و کلیدهای JSX در یک آرایه هدف مشابهی دارند. آنها به ما این امکان را میدهند که یک آیتم را بین همنیاکانش به طور منحصر به فرد شناسایی کنیم. یک کلید بهخوبی انتخاب شده اطلاعات بیشتری نسبت به موقعیت داخل آرایه فراهم میکند. حتی اگر _موقعیت_ به دلیل مرتبسازی تغییر کند، کلید به React این امکان را میدهد که آیتم را در طول عمر آن شناسایی کند.
-You might be tempted to use an item's index in the array as its key. In fact, that's what React will use if you don't specify a `key` at all. But the order in which you render items will change over time if an item is inserted, deleted, or if the array gets reordered. Index as a key often leads to subtle and confusing bugs.
+ممکن است وسوسه شوید که از ایندکس آیتم در آرایه به عنوان کلید آن استفاده کنید. در واقع، این همان چیزی است که React در صورتی که شما هیچ کلیدی مشخص نکنید، استفاده خواهد کرد. اما ترتیب رندر کردن آیتمها با گذشت زمان تغییر خواهد کرد اگر یک آیتم وارد شود، حذف شود یا اگر آرایه دوباره مرتب شود. استفاده از شاخص به عنوان کلید اغلب منجر به باگهای ظریف و گیجکننده میشود.
-Similarly, do not generate keys on the fly, e.g. with `key={Math.random()}`. This will cause keys to never match up between renders, leading to all your components and DOM being recreated every time. Not only is this slow, but it will also lose any user input inside the list items. Instead, use a stable ID based on the data.
+به طور مشابه، از تولید کلیدها به صورت آنی خودداری کنید، مثلاً با `key={Math.random()}`. این کار باعث میشود که کلیدها هیچ وقت بین رندرها مطابقت نداشته باشند و منجر به بازسازی تمامی کامپوننتها و DOM در هر بار رندر شود. این نه تنها کند است، بلکه هر ورودی کاربر در داخل آیتمهای لیست را نیز از دست میدهد. در عوض، از یک شناسه ثابت مبتنی بر دادهها استفاده کنید.
-Note that your components won't receive `key` as a prop. It's only used as a hint by React itself. If your component needs an ID, you have to pass it as a separate prop: ``.
+توجه داشته باشید که کامپوننتهای شما `key` را به عنوان یک پراپ دریافت نمیکنند. این فقط توسط React به عنوان یک راهنمایی استفاده میشود. اگر کامپوننت شما به یک شناسه نیاز دارد، باید آن را به عنوان یک پراپ جداگانه ارسال کنید: ``.
-On this page you learned:
+در این صفحه شما آموختید:
-* How to move data out of components and into data structures like arrays and objects.
-* How to generate sets of similar components with JavaScript's `map()`.
-* How to create arrays of filtered items with JavaScript's `filter()`.
-* Why and how to set `key` on each component in a collection so React can keep track of each of them even if their position or data changes.
+* چگونه دادهها را از کامپوننتها خارج کرده و به ساختارهای دادهای مانند آرایهها و اشیاء منتقل کنید.
+* چگونه مجموعههایی از کامپوننتهای مشابه با استفاده از متد `map()` در جاوااسکریپت ایجاد کنید.
+* چگونه آرایههایی از آیتمهای فیلتر شده با استفاده از متد `filter()` در جاوااسکریپت بسازید.
+* چرا و چگونه باید برای هر کامپوننت در یک مجموعه `key` را تنظیم کنید تا React بتواند هر کدام را پیگیری کند حتی اگر موقعیت یا دادههای آنها تغییر کند.
@@ -440,11 +439,11 @@ On this page you learned:
-#### Splitting a list in two {/*splitting-a-list-in-two*/}
+#### تقسیم یک لیست به دو بخش {/*splitting-a-list-in-two*/}
-This example shows a list of all people.
+این مثال یک لیست از تمام افراد را نشان میدهد.
-Change it to show two separate lists one after another: **Chemists** and **Everyone Else.** Like previously, you can determine whether a person is a chemist by checking if `person.profession === 'chemist'`.
+آن را تغییر دهید تا دو لیست جداگانه یکی پس از دیگری نمایش داده شود: **شیمیدانها** و **بقیه افراد**. همانطور که قبلاً اشاره شد، میتوانید تعیین کنید که آیا یک شخص شیمیدان است یا خیر با بررسی اینکه `person.profession === 'chemist'`.
@@ -535,7 +534,7 @@ img { width: 100px; height: 100px; border-radius: 50%; }
-You could use `filter()` twice, creating two separate arrays, and then `map` over both of them:
+شما میتوانید از `filter()` دوبار استفاده کنید، دو آرایه جداگانه ایجاد کرده و سپس روی هر دو آنها `map` کنید:
@@ -648,9 +647,9 @@ img { width: 100px; height: 100px; border-radius: 50%; }
-In this solution, the `map` calls are placed directly inline into the parent `` elements, but you could introduce variables for them if you find that more readable.
+در این راهحل، تماسهای `map` به طور مستقیم داخل عناصر والد `` قرار گرفتهاند، اما اگر این کار را بیشتر خوانا میبینید، میتوانید برای آنها متغیرهایی معرفی کنید.
-There is still a bit duplication between the rendered lists. You can go further and extract the repetitive parts into a `` component:
+هنوز مقداری تکرار در لیستهای رندر شده وجود دارد. شما میتوانید بیشتر پیش بروید و قسمتهای تکراری را در یک کامپوننت `` استخراج کنید:
@@ -762,9 +761,9 @@ img { width: 100px; height: 100px; border-radius: 50%; }
-A very attentive reader might notice that with two `filter` calls, we check each person's profession twice. Checking a property is very fast, so in this example it's fine. If your logic was more expensive than that, you could replace the `filter` calls with a loop that manually constructs the arrays and checks each person once.
+یک خواننده بسیار دقیق ممکن است متوجه شود که با دو فراخوانی `filter`، حرفه هر شخص را دوبار بررسی میکنیم. بررسی یک ویژگی بسیار سریع است، بنابراین در این مثال مشکلی ندارد. اگر منطق شما پیچیدهتر از این باشد، میتوانید فراخوانیهای `filter` را با یک حلقه جایگزین کنید که آرایهها را به صورت دستی میسازد و هر شخص را تنها یک بار بررسی میکند.
-In fact, if `people` never change, you could move this code out of your component. From React's perspective, all that matters is that you give it an array of JSX nodes in the end. It doesn't care how you produce that array:
+در حقیقت، اگر `people` هیچگاه تغییر نکند، میتوانید این کد را از کامپوننت خود خارج کنید. از منظر React، چیزی که اهمیت دارد این است که در نهایت یک آرایه از نودهای JSX به آن بدهید. React اهمیتی نمیدهد که چگونه این آرایه را تولید کردهاید:
@@ -882,13 +881,13 @@ img { width: 100px; height: 100px; border-radius: 50%; }
-#### Nested lists in one component {/*nested-lists-in-one-component*/}
+#### لیستهای تو در تو در یک کامپوننت {/*nested-lists-in-one-component*/}
-Make a list of recipes from this array! For each recipe in the array, display its name as an `` and list its ingredients in a ``.
+یک لیست از دستورالعملها از این آرایه بسازید! برای هر دستورالعمل در آرایه، نام آن را به صورت یک `` نمایش دهید و مواد لازم آن را در یک `` فهرست کنید.
-This will require nesting two different `map` calls.
+این نیاز به تو در تو کردن دو فراخوانی `map` مختلف دارد.
@@ -926,7 +925,7 @@ export const recipes = [{
-Here is one way you could go about it:
+در اینجا یکی از روشهایی که میتوانید برای انجام آن استفاده کنید آورده شده است:
@@ -972,13 +971,13 @@ export const recipes = [{
-Each of the `recipes` already includes an `id` field, so that's what the outer loop uses for its `key`. There is no ID you could use to loop over ingredients. However, it's reasonable to assume that the same ingredient won't be listed twice within the same recipe, so its name can serve as a `key`. Alternatively, you could change the data structure to add IDs, or use index as a `key` (with the caveat that you can't safely reorder ingredients).
+هر یک از `دستورالعملها` قبلاً شامل فیلد `id` است، بنابراین از آن برای `key` در حلقه خارجی استفاده میشود. هیچ IDای برای حلقه زدن بر روی مواد لازم وجود ندارد. با این حال، منطقی است که فرض کنید نام همان ماده غذایی در یک دستورالعمل دو بار ذکر نخواهد شد، بنابراین نام آن میتواند به عنوان `key` استفاده شود. به طور جایگزین، میتوانید ساختار داده را تغییر دهید تا ID اضافه کنید، یا از index به عنوان `key` استفاده کنید (با این هشدار که نمیتوانید مواد لازم را به طور ایمن جابهجا کنید).
-#### Extracting a list item component {/*extracting-a-list-item-component*/}
+#### استخراج یک کامپوننت آیتم لیست {/*extracting-a-list-item-component*/}
-This `RecipeList` component contains two nested `map` calls. To simplify it, extract a `Recipe` component from it which will accept `id`, `name`, and `ingredients` props. Where do you place the outer `key` and why?
+این کامپوننت `RecipeList` شامل دو فراخوانی تو در تو از `map` است. برای سادهتر کردن آن، یک کامپوننت `Recipe` استخراج کنید که مقادیر `id`، `name` و `ingredients` را به عنوان پراپ میپذیرد. `key` خارجی را کجا قرار میدهید و چرا؟
@@ -1026,7 +1025,7 @@ export const recipes = [{
-You can copy-paste the JSX from the outer `map` into a new `Recipe` component and return that JSX. Then you can change `recipe.name` to `name`, `recipe.id` to `id`, and so on, and pass them as props to the `Recipe`:
+شما میتوانید JSX مربوط به حلقه خارجی `map` را کپی کرده و در یک کامپوننت جدید به نام `Recipe` قرار دهید و آن JSX را بازگردانید. سپس میتوانید `recipe.name` را به `name`، `recipe.id` را به `id` و به همین ترتیب تغییر دهید و آنها را به عنوان پراپ به `Recipe` ارسال کنید:
@@ -1078,15 +1077,15 @@ export const recipes = [{
-Here, `` is a syntax shortcut saying "pass all properties of the `recipe` object as props to the `Recipe` component". You could also write each prop explicitly: ``.
+در اینجا، `` یک میانبر سینتکسی است که میگوید "تمام ویژگیهای شیء `recipe` را به عنوان پراپ به کامپوننت `Recipe` ارسال کن". شما میتوانید هر پراپ را به طور صریح هم بنویسید: ``.
-**Note that the `key` is specified on the `` itself rather than on the root `` returned from `Recipe`.** This is because this `key` is needed directly within the context of the surrounding array. Previously, you had an array of `
`s so each of them needed a `key`, but now you have an array of `
`s. In other words, when you extract a component, don't forget to leave the `key` outside the JSX you copy and paste.
+**توجه داشته باشید که `key` روی خود `` مشخص شده است نه روی `` ریشهای که از `Recipe` بازگردانده میشود.** این به این دلیل است که این `key` مستقیماً در زمینه آرایه اطراف مورد نیاز است. قبلاً شما یک آرایه از `
`ها داشتید که هر کدام به یک `key` نیاز داشتند، اما حالا یک آرایه از `
`ها دارید. به عبارت دیگر، وقتی یک کامپوننت را استخراج میکنید، فراموش نکنید که `key` را خارج از JSX که کپی و جایگذاری کردهاید بگذارید.
-#### List with a separator {/*list-with-a-separator*/}
+#### لیست با یک جداکننده {/*list-with-a-separator*/}
-This example renders a famous haiku by Tachibana Hokushi, with each line wrapped in a `` tag. Your job is to insert an `
` separator between each paragraph. Your resulting structure should look like this:
+این مثال یک هایکو مشهور از تاکیبانا هوکوشی را رندر میکند، به طوری که هر خط در یک تگ `` قرار دارد. وظیفه شما این است که یک جداکننده `
` بین هر پاراگراف وارد کنید. ساختار نهایی شما باید به این شکل باشد:
```js
@@ -1098,7 +1097,7 @@ This example renders a famous haiku by Tachibana Hokushi, with each line wrapped
```
-A haiku only contains three lines, but your solution should work with any number of lines. Note that `
` elements only appear *between* the `` elements, not in the beginning or the end!
+یک هایکو تنها سه خط دارد، اما راهحل شما باید با هر تعداد خط کار کند. توجه داشته باشید که عناصر `
` تنها باید *بین* عناصر `` ظاهر شوند، نه در ابتدای آنها و نه در انتهای آنها!
@@ -1141,17 +1140,17 @@ hr {
-(This is a rare case where index as a key is acceptable because a poem's lines will never reorder.)
+(این یک مورد نادر است که استفاده از index به عنوان `key` قابل قبول است زیرا خطوط یک شعر هرگز جابهجا نمیشوند.)
-You'll either need to convert `map` to a manual loop, or use a Fragment.
+شما باید یا `map` را به یک حلقه دستی تبدیل کنید، یا از یک Fragment استفاده کنید.
-You can write a manual loop, inserting `
` and `...
` into the output array as you go:
+شما میتوانید یک حلقه دستی بنویسید و به طور همزمان `
` و `...
` را به آرایه خروجی اضافه کنید:
@@ -1206,9 +1205,9 @@ hr {
-Using the original line index as a `key` doesn't work anymore because each separator and paragraph are now in the same array. However, you can give each of them a distinct key using a suffix, e.g. `key={i + '-text'}`.
+استفاده از اندیس خط اصلی به عنوان `key` دیگر کار نمیکند زیرا اکنون هر جداکننده و پاراگراف در همان آرایه قرار دارند. با این حال، شما میتوانید به هر کدام یک `key` متمایز بدهید با استفاده از پسوند، مثلاً `key={i + '-text'}`.
-Alternatively, you could render a collection of Fragments which contain `
` and `...
`. However, the `<>...>` shorthand syntax doesn't support passing keys, so you'd have to write `` explicitly:
+به طور جایگزین، میتوانید مجموعهای از Fragments را رندر کنید که شامل `
` و `...
` هستند. با این حال، سینتاکس میانبر `<>...>` پشتیبانی از ارسال `key` را ندارد، بنابراین باید به صورت صریح از `` استفاده کنید:
@@ -1254,7 +1253,7 @@ hr {
-Remember, Fragments (often written as `<> >`) let you group JSX nodes without adding extra ``s!
+یادآوری: Fragments (که معمولاً به صورت `<> >` نوشته میشوند) به شما این امکان را میدهند که گرههای JSX را بدون افزودن `
` اضافی گروهبندی کنید!