Skip to content

Commit 10f435d

Browse files
fixed error in p tag
1 parent d6caf1c commit 10f435d

File tree

1 file changed

+44
-44
lines changed

1 file changed

+44
-44
lines changed

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

Lines changed: 44 additions & 44 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,11 @@ title: تفکر به سبک ری‌اکت
8079
</CodeDiagram>
8180

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

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

8988
- `FilterableProductTable`
9089
- `SearchBar`
@@ -100,7 +99,7 @@ title: تفکر به سبک ری‌اکت
10099

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

103-
</p>
102+
</p>
104103

105104
<Sandpack>
106105

@@ -216,76 +215,77 @@ td {
216215
<p dir="rtl">
217216
بعد ساختن مؤلفه‌های خود، شما یک کتابخانه از مؤلفه‌های قابل استفاده مجدد خواهید داشت که مدل داده‌های شما را نمایش می‌دهند. به دلیل اینکه این برنامه از نوع استاتیک است، مؤلفه‌ها فقط JSX را بازمی‌گردانند. مؤلفه در بالای سلسله‌مراتب (FilterableProductTable) مدل داده‌های شما را به عنوان یک ویژگی دریافت می‌کند. این با نام "جریان داده یک‌طرفه" شناخته می‌شود زیرا داده‌ها از مؤلفه بالاتر در سلسله‌مراتب به مؤلفه‌های پایین‌تر در درخت جریان می‌یابد
218217
</p>
219-
<Pitfall dir="rtl">
218+
<Pitfall>
220219
در این نقطه، شما نباید از هیچ مقدار وضعیتی استفاده کنید. این مرحله برای مرحله بعدی است!
221220
</Pitfall>
222221

223222
## 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">
223+
225224
برای ایجاد تعامل در رابط کاربری، باید به کاربران امکان تغییر مدل داده‌های زیرین خود را بدهید. برای این کار از وضعیت (state) استفاده خواهید کرد.
226-
</p>
225+
227226
<p dir="rtl">
228227
وضعیت را به عنوان مجموعه حداقلی از داده‌های تغییر پذیری تصور کنید که برنامه شما نیاز دارد که به خاطر بسپارد. مهم‌ترین اصل در ساختاردهی وضعیت، حفظ اصل DRY (Don't Repeat Yourself) است. [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) کمترین حالتی که نیازهای برنامه‌ی شما از state دارد را تعیین کنید و سایر موارد را به صورت درخواستی محاسبه کنید. به عنوان مثال، اگر در حال ساختن یک لیست خرید هستید، می‌توانید موارد را به صورت یک آرایه در state ذخیره کنید. اگر می‌خواهید تعداد موارد در لیست را نشان دهید، تعداد موارد را به عنوان یک مقدار وضعیت جدید درنظر نگیرید - در عوض، طول آرایه‌تان را بخوانید.
229228
</p>
230-
<p dir="rtl"> حالا به تمام قسمت های دیتا در این اپلیکیشن نگاه کنید:</p>
229+
حالا به تمام قسمت های دیتا در این اپلیکیشن نگاه کنید:
230+
231231
1-FilterableProductTable
232232
2-SearchBar
233233
3-ProductTable
234234
4-ProductCategoryRow
235235
5-ProductRow
236-
<p dir="rtl">
236+
237237
کدام یکی از این‌ها state هستند؟
238238
اول آنهایی که نیستند را مشخص میکنیم:
239-
</p>
240-
<li dir="rtl">
239+
240+
<li>
241241
ایا در طول زمان **بدون تغییر** خواهد ماند؟ اگر بله پس استیت نیست-
242242
آیا **از یک کامپوننت والد** با پراپس پاس داده شده؟ اگر بله پس استیت نیست-
243243
ایا میتوانید آن را خودتان به دست بیاورید؟ **براساس استیت فعلی یا پراپس کامپوننت** اگر بله پس قطعا استیت نیست!-
244244
</li>
245245

246-
<p dir="rtl">
246+
247247
هرچه به جز این حالت ها باشد٬ استیت است
248248
state
249-
</p>
250-
<p dir="rtl"> یکبار دیگر باهم مرور کنیم:</p>
251-
<p dir="rtl">
249+
250+
یکبار دیگر باهم مرور کنیم:
251+
252252
آیا **از یک کامپوننت والد** با پراپس پاس داده شده؟ اگر بله پس استیت نیست-
253253
ایا میتوانید آن را خودتان به دست بیاورید؟ **براساس استیت فعلی یا پراپس کامپوننت** اگر بله پس قطعا استیت نیست!-
254-
</p>
255-
<ol dir="rtl">
254+
255+
<ol>
256256
<li>اگر اصل لیست محصولات به عنوان پراپس پاس داده شده٬ پس استیت یا وضعیت نیست</li>
257257
<li>متن جستجو به نظر استیت است چرا که به مرور زمان تغییر میکند و ما نمیتوانیم آن را محاسبه کنیم</li>
258258
<li>مقدار چک باکس یک استیت است زیرا محاسبه نمیشود و به مرور زمان تغییر میکند</li>
259259
<li>لیست محصولات فیلتر شده استیت نیست٬ زیرا میتوانیم آن را حساب کنیم! تنها به لیست اولیه و مقداری که کاربر جستجو کرده به همراه مقدار تکس باکس نیاز داریم </li>
260260
</ol>
261-
<p>
262-
یعنی ما فقط متن جستجو شده و مقدار تکست باکس را به عنوان استیت نگه میداریم :)
263-
</p>
261+
262+
یعنی ما فقط متن جستجو شده و مقدار تکست باکس را به عنوان استیت نگه میداریم
263+
264264
<DeepDive>
265265

266266
### Props vs State {/*props-vs-state*/}
267-
<div dir="rtl">
268-
<p dir="rtl">
267+
268+
269269
دو نوع مدل دیتا در ری اکت داریم: وضعیت (state) و (props).
270270
این دو باهم تفاوت زیادی دارند:
271-
</p>
271+
272272

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

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

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

291291
تمام کامپوننت‌هایی که بر اساس آن استیت چیزی را رندر می‌کنند را شناسایی کنید.
@@ -295,18 +295,18 @@ state
295295
همچنین می‌توانید استیت را در یکی از کامپوننت‌های بالاتر از کامپوننت مشترک آن‌ها قرار دهید.
296296
اگر نمی‌توانید کامپوننتی پیدا کنید که استیت را به صورت منطقی مدیریت کند، می‌توانید یک کامپوننت جدید را که تنها برای نگه‌داری استیت ایجاد شده باشد بسازید و آن را در جایی در سلسله‌مراتب بالاتر از کامپوننت مشترک قرار دهید.
297297
در مرحله‌ی قبلی، دو قطعه از استیت را در این برنامه پیدا کردید: متن ورودی جستجو و مقدار چک‌باکس. در این مثال، همیشه همراه یکدیگر ظاهر می‌شوند، بنابراین منطقی است که آن‌ها را در یک جایگاه قرار دهید
298-
</p>
298+
299299

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

304304
ProductTable نیاز دارد که لیست محصولات را بر اساس این استیت (متن جستجو و مقدار چک‌باکس) فیلتر کند. ***
305305
SearchBar نیاز دارد که این استیت (متن جستجو و مقدار چک‌باکس) را نمایش دهد. ***
306306
یافتن پدر مشترک آن‌ها: اولین کامپوننت والد که هر دو کامپوننت با هم به اشتراک می‌گذارند، FilterableProductTable است. ***
307307
تصمیم برای محل قرارگیری استیت: ما مقادیر متن فیلتر و وضعیت چک‌باکس را در FilterableProductTable نگه‌داری خواهیم کرد. ***
308308
بنابراین مقادیر استیت در FilterableProductTable قرار خواهند گرفت.
309-
</p>
309+
310310

311311
Add state to the component with the [`useState()` Hook.](/reference/react/useState) Hooks are special functions that let you "hook into" React. Add two state variables at the top of `FilterableProductTable` and specify their initial state:
312312

@@ -457,7 +457,7 @@ td {
457457
</Sandpack>
458458
459459
Notice that editing the form doesn't work yet. There is a console error in the sandbox above explaining why:
460-
<p dir="rtl"> توجه کنید که هنوز ویرایش فرم کار نمی‌کند. یک خطا در کنسول محیط آزمایشی بالا وجود دارد که دلیل آن را توضیح می‌دهد.</p>
460+
توجه کنید که هنوز ویرایش فرم کار نمی‌کند. یک خطا در کنسول محیط آزمایشی بالا وجود دارد که دلیل آن را توضیح می‌دهد.
461461
<ConsoleBlock level="error">
462462
463463
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)