Skip to content

Commit e5c325f

Browse files
author
Abolfazl Rezvani Naraqi
authored
Merge pull request #358 from faeghe-hajiabadi/traslation/fa-thnking-in-react
fixed error in p tag
2 parents 146c94b + d6ae53c commit e5c325f

File tree

1 file changed

+50
-47
lines changed

1 file changed

+50
-47
lines changed

src/content/learn/thinking-in-react.md

Lines changed: 50 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
---
22
title: تفکر به سبک ری‌اکت
33
---
4-
<Intro dir="rtl">
4+
<Intro>
55
کتابخانه‌ی ری‌اکت می‌تواند نگاه شما به طراحی‌هایی که می بینید و برنامه‌هایی که می‌سازید را٬ تغییر دهد.وقتی یک رابط کاربری را با ری‌اکت می‌سازید، ابتدا آن را به قسمت‌هایی به نام کامپوننت‌ها تقسیم می‌کنید.
66
سپس، وضعیت‌های بصری مختلف را برای هر یک از کامپوننت‌هایتان توصیف می‌کنید. در نهایت، کامپوننت‌های خود را به گونه‌ای با یکدیگر ارتباط می‌دهید که داده از طریق آنها جابه‌جا شود. در اینجا ما مراحل ساخت یک جدول با قابلیت سرچ اطلاعات را با شما برای هدف اموزش به اشتراک می‌گذاریم
77
</Intro>
88
## Start with the mockup {/*start-with-the-mockup*/}
9-
<p dir="rtl">
9+
1010
تصور کنید شما همین الان دیتایی از طریق ای پی آی و فایل ماکآپ را از دیزاینر دارید. فایل دیتا٬ اطلاعاتی مثل فایل زیر را شامل می‌شود:
11-
</p>
11+
1212

1313
```json
1414
[
@@ -30,30 +30,29 @@ title: تفکر به سبک ری‌اکت
3030
{"category": "Vegetables", "price": "$1", "stocked": true, "name": "Peas"}
3131
]
3232
```
33-
<p dir="rtl">
33+
3434
خروجی فایل شبیه تصویر زیر است:
35-
</p>
35+
3636

3737
<img
38-
src="/images/docs/s_thinking-in-react_ui.png"
38+
src="/images/docs/s_thinking-in-react_ui_outline.png"
3939
width="300"
4040
style={{margin: '0 auto'}}
4141
/>
4242
برای پیاده سازی هر دیزاینی ما این پنج قدم را برمی داریم:
4343

4444
## Step 1: Break the UI into a component hierarchy {/*step-1-break-the-ui-into-a-component-hierarchy*/}
45-
<p dir="rtl">
45+
4646
اول دور هر کامپوننت و زیر کامپوننت در دیزاین خط بکشید و برای آنها اسم بگذارید. اگر با یک طراح همکاری می‌کنید، ممکن است او این کامپوننت‌ها را در ابزار طراحی خود قبلاً نامگذاری کرده باشد. از او بپرسید!
4747
بسته به بکگراند شما، می‌توانید به روش‌های مختلف درباره‌ی تقسیم یک طراحی به کامپوننت‌ها فکر کنید.
48-
</p>
48+
4949
- **برنامه‌نویسی**--از تکنیک‌های مشابه برای تصمیم‌گیری در مورد اینکه آیا باید یک تابع یا شیء جدید ایجاد کنید استفاده کنید
5050
یکی از این تکنیک‌ها اصل single responsibility است، به این معنی که یک کامپوننت بهتر است تنها یک کار را انجام دهد. اگر کامپوننت به طور مداوم بزرگتر شود، باید به زیرکامپوننت‌های کوچکتر تجزیه شود.
5151
[single responsibility principle](https://en.wikipedia.org/wiki/Single_responsibility_principle)
5252

5353
- **CSS**--بررسی کنید که برای چه عناصری از کلاس‌ها استفاده خواهید کرد. (با این حال، کامپوننت‌ها کمتر جزئیات ریز دارند.)
5454

55-
- **design**--
56-
در نظر بگیرید که چگونه لایه‌های طراحی را سازماندهی خواهید کرد
55+
- **design**--در نظر بگیرید که چگونه لایه‌های طراحی را سازماندهی خواهید کرد
5756
اگر فایل جیسون شما ساختار مناسبی داشته باشد، اغلب متوجه می شوید که به طور طبیعی با ساختار کامپوننت‌های رابط کاربری شما همخوانی دارد. این به این دلیل است که مدل‌های رابط کاربری و داده اغلب همان معماری اطلاعاتی را دارند - به اصطلاح، همان شکل. رابط کاربری خود را به
5857
کامپوننت‌ها تقسیم کنید، به گونه‌ای که هر کامپوننت با یک قسمت از مدل داده شما مطابقت داشته باشد
5958

@@ -66,7 +65,7 @@ title: تفکر به سبک ری‌اکت
6665
<CodeDiagram flip>
6766

6867
<img
69-
src="/images/docs/s_thinking-in-react_ui_outline.png"
68+
src="/images/docs/s_thinking-in-react_ui.png"
7069
width="500"
7170
style={{margin: '0 auto'}}
7271
/>
@@ -80,11 +79,13 @@ title: تفکر به سبک ری‌اکت
8079
</CodeDiagram>
8180

8281
</FullWidth>
83-
<p dir="rtl">
84-
اگر به کامپوننت ۳(جدول محصولات) نگاه کنید، می‌بینید که هدر جدول (شامل برچسب‌های "نام" و "قیمت") قسمت جداگانه‌ای نیست. این مسئله از سلیقه‌ای است و می‌توانید هر دو را انتخاب کنید. در این مثال، این بخش جزء کامپوننت ۳است زیرا داخل لیست کامپوننت ۳ ظاهر می‌شود. با این حال، اگر این هدر به طور پیچیده‌تری رشد کند (مثلاً اگر مرتب‌سازی را اضافه کنید)، می‌توانید آن را به عنوان یک کامپوننت جداگانه با نام(هدر جدول محصولات) جابجا کنید.
82+
83+
84+
اگر به کامپوننت ۳(جدول محصولات) نگاه کنید، می‌بینید که هدر جدول (شامل برچسب‌های "نام" و "قیمت") قسمت جداگانه‌ای نیست. این مسئله سلیقه‌ای است و می‌توانید هر دو را انتخاب کنید. در این مثال، این بخش جزء کامپوننت ۳است زیرا داخل لیست کامپوننت ۳ ظاهر می‌شود. با این حال، اگر این هدر به طور پیچیده‌تری رشد کند (مثلاً اگر مرتب‌سازی را اضافه کنید)، می‌توانید آن را به عنوان یک کامپوننت جداگانه با نام(هدر جدول محصولات) جابجا کنید.
85+
8586

8687
هم‌اکنون که اجزای ماک‌اپ را شناسایی کرده‌اید، آن‌ها را به صورت سلسله‌مراتبی قرار دهید. کامپوننتی که در داخل یک کامپوننت دیگر در نمونه طراحی ظاهر می‌شوند، باید به عنوان زیرمجموعه در سلسله‌مراتب ظاهر شوند.
87-
</p>
88+
8889

8990
- `FilterableProductTable`
9091
- `SearchBar`
@@ -100,7 +101,7 @@ title: تفکر به سبک ری‌اکت
100101

101102
[state](/learn/state-a-components-memory) لینک به
102103

103-
</p>
104+
</p>
104105

105106
<Sandpack>
106107

@@ -216,76 +217,77 @@ td {
216217
<p dir="rtl">
217218
بعد ساختن کامپوننت‌های خود، شما یک کتابخانه از کامپوننت‌های قابل استفاده مجدد خواهید داشت که مدل داده‌های شما را نمایش می‌دهند. به دلیل اینکه این برنامه از نوع استاتیک است، کامپوننت‌ها فقط JSX را بازمی‌گردانند. کامپوننت‌، در بالای سلسله‌مراتب (FilterableProductTable) مدل داده‌های شما را به عنوان یک ویژگی دریافت می‌کند. این با نام "جریان داده یک‌طرفه" شناخته می‌شود زیرا داده‌ها از کامپوننت‌ه بالاتر در سلسله‌مراتب به کامپوننت‌های پایین‌تر در درخت جریان می‌یابند
218219
</p>
219-
<Pitfall dir="rtl">
220+
<Pitfall>
220221
در این نقطه، شما نباید از هیچ مقدار وضعیتی استفاده کنید. این مرحله برای مرحله بعدی است!
221222
</Pitfall>
222223

223224
## Step 3: Find the minimal but complete representation of UI state {/*step-3-find-the-minimal-but-complete-representation-of-ui-state*/}
224-
<p dir="rtl">
225+
225226
برای ایجاد تعامل در رابط کاربری، باید به کاربران امکان تغییر مدل داده‌های زیرین خود را بدهید. برای این کار از وضعیت (state) استفاده خواهید کرد.
226-
</p>
227+
227228
<p dir="rtl">
228229
وضعیت را به عنوان مجموعه حداقلی از داده‌های تغییر پذیری تصور کنید که برنامه شما نیاز دارد که به خاطر بسپارد. مهم‌ترین اصل در ساختاردهی وضعیت، حفظ اصل DRY (Don't Repeat Yourself) است. [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) کمترین حالتی که نیازهای برنامه‌ی شما از state دارد را تعیین کنید و سایر موارد را به صورت درخواستی محاسبه کنید. به عنوان مثال، اگر در حال ساختن یک لیست خرید هستید، می‌توانید موارد را به صورت یک آرایه در state ذخیره کنید. اگر می‌خواهید تعداد موارد در لیست را نشان دهید، تعداد موارد را به عنوان یک مقدار وضعیت جدید درنظر نگیرید - در عوض، طول آرایه‌تان را بخوانید.
229230
</p>
230-
<p dir="rtl"> حالا به تمام قسمت های دیتا در این اپلیکیشن نگاه کنید:</p>
231+
حالا به تمام قسمت های دیتا در این اپلیکیشن نگاه کنید:
232+
231233
1-FilterableProductTable
232234
2-SearchBar
233235
3-ProductTable
234236
4-ProductCategoryRow
235237
5-ProductRow
236-
<p dir="rtl">
238+
237239
کدام یکی از این‌ها state هستند؟
238240
اول آنهایی که نیستند را مشخص میکنیم:
239-
</p>
240-
<li dir="rtl">
241+
242+
<li>
241243
ایا در طول زمان **بدون تغییر** خواهد ماند؟ اگر بله پس استیت نیست-
242244
آیا **از یک کامپوننت والد** با پراپس پاس داده شده؟ اگر بله پس استیت نیست-
243245
ایا میتوانید آن را خودتان به دست بیاورید؟ **براساس استیت فعلی یا پراپس کامپوننت** اگر بله پس قطعا استیت نیست!-
244246
</li>
245247

246-
<p dir="rtl">
248+
247249
هرچه به جز این حالت ها باشد٬ استیت است
248250
state
249-
</p>
250-
<p dir="rtl"> یکبار دیگر باهم مرور کنیم:</p>
251-
<p dir="rtl">
251+
252+
یکبار دیگر باهم مرور کنیم:
253+
252254
آیا **از یک کامپوننت والد** با پراپس پاس داده شده؟ اگر بله پس استیت نیست-
253255
ایا میتوانید آن را خودتان به دست بیاورید؟ **براساس استیت فعلی یا پراپس کامپوننت** اگر بله پس قطعا استیت نیست!-
254-
</p>
255-
<ol dir="rtl">
256+
257+
<ol>
256258
<li>اگر اصل لیست محصولات به عنوان پراپس پاس داده شده٬ پس استیت یا وضعیت نیست</li>
257259
<li>متن جستجو به نظر استیت است چرا که به مرور زمان تغییر میکند و ما نمیتوانیم آن را محاسبه کنیم</li>
258260
<li>مقدار چک باکس یک استیت است زیرا محاسبه نمیشود و به مرور زمان تغییر میکند</li>
259261
<li>لیست محصولات فیلتر شده استیت نیست٬ زیرا میتوانیم آن را حساب کنیم! تنها به لیست اولیه و مقداری که کاربر جستجو کرده به همراه مقدار تکس باکس نیاز داریم </li>
260262
</ol>
261-
<p>
262-
یعنی ما فقط متن جستجو شده و مقدار تکست باکس را به عنوان استیت نگه میداریم :)
263-
</p>
263+
264+
یعنی ما فقط متن جستجو شده و مقدار تکست باکس را به عنوان استیت نگه میداریم
265+
264266
<DeepDive>
265267

266268
### Props vs State {/*props-vs-state*/}
267-
<div dir="rtl">
268-
<p dir="rtl">
269+
270+
269271
دو نوع مدل دیتا در ری اکت داریم: وضعیت (state) و (props).
270272
این دو باهم تفاوت زیادی دارند:
271-
</p>
273+
272274

273275
[**پراپس** شبیه ارگیومنت هایی که به تایع پاس میدهید](/learn/passing-props-to-a-component) . آنها به کامپوننت والد اجازه می دهند که دیتا را به فرزند خود پاس دهد و ظاهر آن را دستکاری کند. مثلا: یک `form` میتواند رنگ
274276
را به عنوان پراپس به کامپوننت ‍‍‍`Button` پاس دهد.
275277
- [**استیت** مثل حافظه ی یک کامپوننت است](/learn/state-a-components-memory) به کامپوننت این امکان را میدهد تا تغییرات اطلاعات را ثبت کند و به آنها پاسخ مناسب دهد. مثلا کامپوننت دکمه میتواند تغییراتی مثل رفتن موس روی خود را در استیت ثبت کند
276-
</div>
278+
277279

278280
</DeepDive>
279-
<p dir="rtl">
281+
280282
پراپ‌ها (Props) و استیت‌ها (State) متفاوت هستند، اما با هم کار می‌کنند. یک کامپوننت والد (Parent) اغلب برخی اطلاعات را در استیت نگه می‌دارد (تا بتواند آن‌ها را تغییر دهد) و به عنوان پراپ به کامپوننت‌های فرزند (Child) ارسال می‌کند. اگر هنوز تفاوت بین آن‌ها برای اولین بار کاملاً روشن نشده باشد، مشکلی ندارد. برای کامل شدن درک این موضوع، نیاز به تمرین کمی دارد!
281-
</p>
282-
</DeepDive>
283+
284+
283285

284286
## Step 4: Identify where your state should live {/* step-4-identify-where-your-state-should-live */}
285-
<p dir="rtl">
287+
286288
بعد از شناسایی داده‌های حداقلی مرتبط با برنامه‌ی شما، نیاز دارید تعیین کنید که کدام کامپوننت مسئول تغییر این داده‌هاست، یا به عبارتی، مالک (owns) این داده‌ها است. به یاد داشته باشید: ری‌اکت از جریان داده‌ی یک طرفه استفاده می‌کند و داده‌ها را از کامپوننت والد به کامپوننت‌های فرزند در سلسله‌مراتب ارسال می‌کند. ممکن است اولیه‌اش که کدام کامپوننت باید مالک داده‌هایی باشد که در اختیار دارد، به وضوح نباشد. اگر تازه با این مفهوم آشنا شده‌اید، ممکن است چالش برانگیز باشد، اما با دنبال کردن این
287-
</p>
288-
<p dir="rtl">
289+
290+
289291
برای هر قطعه از استیت (state) در برنامه‌ی شما:
290292

291293
*تمام* کامپوننت‌هایی که بر اساس آن استیت چیزی را رندر می‌کنند را شناسایی کنید.
@@ -295,21 +297,20 @@ state
295297
همچنین می‌توانید استیت را در یکی از کامپوننت‌های بالاتر از کامپوننت مشترک آن‌ها قرار دهید.
296298
اگر نمی‌توانید کامپوننتی پیدا کنید که استیت را به صورت منطقی مدیریت کند، می‌توانید یک کامپوننت جدید را که تنها برای نگه‌داری استیت ایجاد شده باشد بسازید و آن را در جایی در سلسله‌مراتب بالاتر از کامپوننت مشترک قرار دهید.
297299
در مرحله‌ی قبلی، دو قطعه از استیت را در این برنامه پیدا کردید: متن ورودی جستجو و مقدار چک‌باکس. در این مثال، همیشه همراه یکدیگر ظاهر می‌شوند، بنابراین منطقی است که آن‌ها را در یک جایگاه قرار دهید
298-
</p>
300+
299301

300302
حالا بیایید از راهبرد ما مسئله را بررسی کنیم
301-
<p dir="rtl">
303+
302304
شناسایی کامپوننت‌هایی که از استیت استفاده می‌کنند: ***
303305

304306
ProductTable نیاز دارد که لیست محصولات را بر اساس این استیت (متن جستجو و مقدار چک‌باکس) فیلتر کند. ***
305307
SearchBar نیاز دارد که این استیت (متن جستجو و مقدار چک‌باکس) را نمایش دهد. ***
306308
یافتن پدر مشترک آن‌ها: اولین کامپوننت والد که هر دو کامپوننت با هم به اشتراک می‌گذارند، FilterableProductTable است. ***
307309
تصمیم برای محل قرارگیری استیت: ما مقادیر متن فیلتر و وضعیت چک‌باکس را در FilterableProductTable نگه‌داری خواهیم کرد. ***
308310
بنابراین مقادیر استیت در FilterableProductTable قرار خواهند گرفت.
309-
</p>
310-
<p dir="rtl">
311+
311312
استیت را درون کامپوننتی که [`useState()` Hook.](/reference/react/useState) دارد اضافه کنید. Hookها توابه خاصی هستند که به شما اجازه می‌دهند تا قدرت ری‌اکت را درونشان قلاب کنید. دو متغییر استیت در بالای `FilterableProductTable`تعریف و مقدار پیش‌فرض آنها را مشخص کنید:
312-
</p>
313+
313314

314315
```js
315316
function FilterableProductTable({ products }) {
@@ -460,7 +461,9 @@ td {
460461
461462
</Sandpack>
462463
463-
<p dir="rtl"> توجه کنید که هنوز ویرایش فرم کار نمی‌کند. یک خطا در کنسول محیط آزمایشی بالا وجود دارد که دلیل آن را توضیح می‌دهد.</p>
464+
465+
توجه کنید که هنوز ویرایش فرم کار نمی‌کند. یک خطا در کنسول محیط آزمایشی بالا وجود دارد که دلیل آن را توضیح می‌دهد.
466+
464467
<ConsoleBlock level="error">
465468
466469
You provided a \`value\` prop to a form field without an \`onChange\` handler. This will render a read-only field.

0 commit comments

Comments
 (0)