<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: FrontEndi</title>
    <description>The latest articles on DEV Community by FrontEndi (@frontendi).</description>
    <link>https://dev.to/frontendi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1162770%2F8bf7ca7f-6c0c-4d5b-8684-42c927e8abb0.png</url>
      <title>DEV Community: FrontEndi</title>
      <link>https://dev.to/frontendi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frontendi"/>
    <language>en</language>
    <item>
      <title>هوک useRef ری اکت و بررسی تخصصی React.useRef</title>
      <dc:creator>FrontEndi</dc:creator>
      <pubDate>Fri, 10 Nov 2023 18:32:37 +0000</pubDate>
      <link>https://dev.to/frontendi/hwkh-useref-ry-kht-w-brrsy-tkhssy-reactuseref-og2</link>
      <guid>https://dev.to/frontendi/hwkh-useref-ry-kht-w-brrsy-tkhssy-reactuseref-og2</guid>
      <description>&lt;p&gt;تو این مقاله میخوایم به بررسی تخصصی هوک useRef ری اکت و کاربردش در زمینه دسترسی به Element های موجود در DOM بپردازیم. با فِرانت اِندی همراه باشید 🙂&lt;/p&gt;

&lt;p&gt;تو مقاله های قبلی راجب هوک useState و هوک useReducer صحبت کردیم و دیدیم زمانیکه مقادیرشون تغییر میکنه ، کامپوننت ما re-Render میشه ! اما شاید بخوایم یک مقدار ذخیره شده رو تغییر بدیم بطوریکه کامپوننت ما re-Render نشه!&lt;/p&gt;

&lt;p&gt;اینجاست که هوک ()useRef میاد وسط 🙂 البته کاربرد های دیگه مثل دسترسی به Element های موجود در DOM هم داره که در ادامه بصورت تخصصی بررسیشون میکنیم.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hiKeIKeq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c2bksscxrbbjacdvf6jc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hiKeIKeq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c2bksscxrbbjacdvf6jc.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;هوک useRef ری اکت چیست ؟&lt;/p&gt;

&lt;p&gt;هوک useRef یکی از هوک های معرفی شده توسط تیم React هست که در نسخه 16.8 معرفی شد.&lt;/p&gt;

&lt;p&gt;هوک useRef در React دو کاربرد اصلی داره :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;کاربرد اصلی هوک ()useRef دسترسی به Element های موجود در DOM هست. ( اگه در مورد DOM یا Virtual Dom اطلاعاتی ندارید حتما مقاله Virtual Dom ری اکت رو مطالعه کنید )
دومین کاربرد هوک useRef که بسیار هم کاربردیه ، ذخیره یک Mutable Value بین re-Render های مختلف کامپوننت شماست.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;نگران نباشید چون قراره تو ادامه این مقاله به زبان ساده اما تخصصی کاربردشون رو بررسی کنیم.&lt;/p&gt;

&lt;p&gt;ساخت یک ref با کمک هوک ()useRef&lt;/p&gt;

&lt;p&gt;برای ایجاد یک refrence به کمک هوک useRef توی کامپوننت خودتون بصورت زیر عمل کنین :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const myRef = useRef();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;هنگام ایجاد useRef میشه یک مقدار اولیه هم بهش اختصاص داد :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const myRef = useRef('FrontEndi.com');&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;چطور از useRef استفاده کنیم ؟&lt;/p&gt;

&lt;p&gt;بطور کل برای استفاده از هوک useRef در React باید 3 مرحله زیر رو انجام داد :&lt;/p&gt;

&lt;p&gt;ساختن Ref&lt;br&gt;
&lt;code&gt;const myRef = useRef();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;اختصاص مقدار به Ref&lt;br&gt;
&lt;code&gt;myRef.current = "FrontEndi";&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;دسترسی به مقدار Ref&lt;br&gt;
&lt;code&gt;console.log(myRef.current);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;برای دسترسی به Element های موجود در Dom شما باید طبق 3 مرحله بالا عمل کنید . یعنی :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;یک ref به کمک ()useRef بسازید .
یک Element به آن ref اختصاص دهید.
حالا مطابق مرحله 3 میتوانید به Element موجود در DOM دسترسی داشته باشید.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;دسترسی به ارتفاع صفحه کاربر با useRef در ری اکت&lt;/p&gt;

&lt;p&gt;بیاید یه مثال واقعی از ref و هوک ()useRef ری اکت رو باهم بررسی کنیم.&lt;/p&gt;

&lt;p&gt;فرض کنیم تو پروژه ای هستیم که نیاز داریم ارتفاع صفحه کاربر رو بر حسب پیکسل بدست بیاریم. پس لازمه که به Element روت خودمون در DOM دسترسی داشته باشیم :&lt;/p&gt;

&lt;p&gt;`import { useEffect, useRef } from "react";&lt;/p&gt;

&lt;p&gt;export default function App() {&lt;br&gt;
  // Create Ref With useRef Hook&lt;br&gt;
  const divElement = useRef();&lt;/p&gt;

&lt;p&gt;// For Get Height of Div Element in First Render&lt;br&gt;
  useEffect(() =&amp;gt; {&lt;br&gt;
    console.log(&lt;br&gt;
      "Height of div Element Is :", divElement.current.offsetHeight&lt;br&gt;
    );&lt;br&gt;
  }, []);&lt;/p&gt;

&lt;p&gt;return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
      &lt;h1&gt; FrontEndi.com :) &lt;/h1&gt;
&lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
}`

&lt;p&gt;تو مثال بالا به اِلِمان div یک ref دادیم و میتونیم هر زمان که لازم بود در DOM بهش دسترسی داشته باشیم. ( خط 15 )&lt;/p&gt;

&lt;p&gt;این ref به کمک هوک useRef در خط 5 ساخته شده.&lt;/p&gt;

&lt;p&gt;تو خط 9 به کمک ref ساخته شده تونستیم به اِلِمان div دسترسی داشته باشیم و مقدار ارتفاعش رو ببینیم. ما اینجا خصوصیت offsetHeight رو log گرفتیم اما شما میتونید به هر خصوصیت دیگه ای دسترسی داشته باشید ( با توجه به نیازتون ).&lt;/p&gt;

&lt;p&gt;اگه میخواید از useRef در ری اکت استفاده کنید باید چند نکته مهم رو در نظر بگیرید .&lt;br&gt;
تغییر مقدار ref باعث re-Render کامپوننت نمیشه !&lt;/p&gt;

&lt;p&gt;زمانی که مقادیر useState یا useReducer رو تغییر میدیم ، کامپوننت ما re-Render میشه . اما useRef اینطور نیست !&lt;/p&gt;

&lt;p&gt;تغییر مقادیر ref باعث re-Render کامپوننت شما نمیشه .&lt;br&gt;
از مقادیر ref به عنوان Dependencies استفاده نکنید !&lt;/p&gt;

&lt;p&gt;خیلی از هوک ها در React از ما یک آرایه به عنوان Dependencies میگیرن. ( مثل هوک useEffect )&lt;/p&gt;

&lt;p&gt;اما به هیچ عنوان از مقادیر ref برای استفاده در Dependencies Array ها استفاده نکنید چون باعث ارور میشه.&lt;br&gt;
چه زمانی از useRef استفاده نکنیم ؟&lt;/p&gt;

&lt;p&gt;با اینکه هوک useRef در ری اکت یکی از هوک های بشدت کاربردی و مفیده ، ولی هرجایی نباید ازش استفاده کنیم. در واقع باید در جایی که useRef کاربرد داره ازش استفاده کنیم ، نه جای دیگری !&lt;/p&gt;

&lt;p&gt;بطور کل اگه میخواید با تغییر مقدار ذخیره شده ، کل کامپوننت شما re-Render بشه باید از هوک useState استفاده کنید اما اگه نیازی به re-Render ندارید میتونید از هوک useRef استفاده کنید.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gcBn9M4W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ejgn8j0lc6jhy56mue0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gcBn9M4W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ejgn8j0lc6jhy56mue0.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;لطفا برای مطالعه ادامه این مقاله + مثالها و تیکه کد های بیشتر روی لینک زیر کلیک کنید :&lt;br&gt;
&lt;a href="https://frontendi.com/useref-hook-react/"&gt;useRef در ریکت&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>هوک useEffect ری اکت و بررسی تخصصی React.useEffect</title>
      <dc:creator>FrontEndi</dc:creator>
      <pubDate>Fri, 10 Nov 2023 18:29:27 +0000</pubDate>
      <link>https://dev.to/frontendi/hwkh-useeffect-ry-kht-w-brrsy-tkhssy-reactuseeffect-44j2</link>
      <guid>https://dev.to/frontendi/hwkh-useeffect-ry-kht-w-brrsy-tkhssy-reactuseeffect-44j2</guid>
      <description>&lt;p&gt;هوک useEffect ری اکت یکی از حیاتی ترین هوک های React هست. حقیقتا اصلا مهم نیست که چند وقته سراغ React اومدید ، useEffect یکی از ضروری ترین مباحثی هست که هر ری اکت دِوِلوپری باید بهش تسط کامل داشته باشه !!&lt;/p&gt;

&lt;p&gt;با فِرانت اِندی همراه باشید که میخوایم این هوک خفن رو بررسی کنیم 🙂&lt;/p&gt;

&lt;p&gt;قبل از هرچیز ، بهتره ببینیم خود ری اکت چه تعریفی از این هوک خفنش داره :&lt;br&gt;
 هوک useEffect به شما امکان مدیریت Side Effect ها را میدهد ! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ptpkz-Pd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6opnqe0sor8jslt3kskx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ptpkz-Pd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6opnqe0sor8jslt3kskx.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;اما Side Effect یعنی چی ؟!&lt;/p&gt;

&lt;p&gt;خود React میگه که از هوک useEffect میشه برای مدیریت Side Effect های کامپوننت استفاده کرد.&lt;/p&gt;

&lt;p&gt;بطور ساده و خلاصه ، هر رفتار یا عملی که باعث تاثیر خارجی در Function شود را Side Effect میگوییم.&lt;/p&gt;

&lt;p&gt;تو ری اکت معمولا چنین Side Effect هایی رو داریم :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;دریافت Data از سرور :
زمانیکه ما از سرور یکسری اطلاعات دریافت میکنیم و در صفحه نمایش میدیم. این اتفاق نمونه بارز Side Effect هست.
تغییر DOM :
وقتی میخوایم یک تغییر در DOM ایجاد کنیم مثل اضافه کردن Event Listener یا تغییر Element ها. این موارد هم یک نوع Side Effect هستن.
خواندن اطلاعات از Local Storage :
خوندن اطلاعات ذخیره شده در Local Storage هم یک نوع Side Effect محسوب میشه.
چند نمونه دیگر :
اضافه کردن setTimeOut ، استفاده از سوکت و ابزار های بروزرسانی real time نیز Side Effect محسوب میشن.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;تمام موارد بالا یک نوع Side Effect هستن.&lt;/p&gt;

&lt;p&gt;در واقع Side Effect ها غیرقابل پیش بینی هستن چون با محیط خارجی در ارتباط هستن! مثلا برای صفحه وبلاگ قصد دریافت لیست مقالات از سرور را داریم اما ارور 500 دریافت میکنیم!&lt;/p&gt;

&lt;p&gt;Side Effect ها معمولا عوارض جانبی واسه اپیکیشن ما دارن مثل Memory Leaks ( پر شدن حافظه رم ) و رفتار غیرمنتظره و پیش بینی نشده.&lt;/p&gt;

&lt;p&gt;پس با توجه به عوارضی که Side Effect ها دارن ، خیلی ضروریه که بتونیم مدیریتشون کنیم!&lt;/p&gt;

&lt;p&gt;هوک useEffect ری اکت اومده تا باهاش بتونیم Side Effect های ری اکت رو مدیریت کنیم 🙂&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vXWMJ4Jj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9rg8xn4ry5nmqt7530zo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vXWMJ4Jj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9rg8xn4ry5nmqt7530zo.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;هوک useEffect ری اکت چیست ؟&lt;/p&gt;

&lt;p&gt;تو React ، هوک useEffect به ما امکان مدیریت Side Effect هارو میده ( مواردی که در بالا مثال زدیم مثل Data Fetching )&lt;/p&gt;

&lt;p&gt;همچنین هوک useEffect امکان مدیریت چرخه حیات ( lifecycle ) کامپوننت رو بهمون میده. ( مثلا اینکه زمانیکه کامپوننت ایجاد میشه ، re-Render میشه یا از DOM حذف میشه چه اتفاقی بیوفته )&lt;/p&gt;

&lt;p&gt;مدیریت چرخه حیات کامپوننت باعث میشه که رفتار کامپوننت ما قابل پیش بینی باشه.&lt;/p&gt;

&lt;p&gt;قبل از اینکه بریم هوک useEffect در ری اکت رو بررسی کنیم، باید نکته زیر رو برای خودمون یادآوری کنیم:&lt;/p&gt;

&lt;p&gt;اِفِکت ها تو ری اکت بعد از هر re-Render اتفاق میوفتن البته میشه جلوی این موضوع رو گرفت.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ouU3GqJs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5b3ziiku8qtfx6i2us2k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ouU3GqJs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5b3ziiku8qtfx6i2us2k.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;چطور از هوک useEffect استفاده کنیم ؟&lt;/p&gt;

&lt;p&gt;چگونگی استفاده از هوک useEffect در ری اکت بصورت زیر هست :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;useEffect(callback, [dependencies]);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;یا :&lt;/p&gt;

&lt;p&gt;`// 1. ایمپورت کردن هوک یوز افکت&lt;br&gt;
import { useEffect } from 'react';&lt;br&gt;
// تابع ما&lt;br&gt;
const App = () =&amp;gt; {&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;/p&gt;

&lt;p&gt;}, []);&lt;/p&gt;

&lt;p&gt;return(&lt;/p&gt;FrontEndi.com)&lt;br&gt;
}`

&lt;p&gt;تو خط 2 ما هوک useEffect رو از خود react فراخوانی کردیم.&lt;/p&gt;

&lt;p&gt;تو خط 6 داخل کامپوننت خودمون از هوک useEffect استفاده کردیم.&lt;/p&gt;

&lt;p&gt;خود هوک useEffect از ما 2 ورودی میگیره:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;اولین آرگومان یک تابع هست : 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;تابعی که به useEffect پاس میدیم یک Callback Function هست. این تابع بعد از Render کامپوننت اجرا میشه.&lt;/p&gt;

&lt;p&gt;تو این تابع میتونیم Side Effect های خودمون رو اجرا کنیم. ( مثل دریافت اطلاعات از سرور و .. )&lt;/p&gt;

&lt;p&gt;تابع callback دقیقا بعد از بروزرسانی DOM اجرا میشه. تو تیکه کد بالا یک تابع خالی به useEffect پاس دادیم اما هر نوع عملیاتی میشه داخلش نوشت.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;دومین آرگومان Dependencies هست که باید در قالب یک آرایه به useEffect پاس داده بشه : 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;دومین آرگومان که اختیاری هست ، یک آرایه هست. این آرایه وابستگی های useEffect هست.&lt;/p&gt;

&lt;p&gt;این آرایه باید شامل مقادیری باشه که میتونن رو Side Effect ما تاثیر بزارن .&lt;/p&gt;

&lt;p&gt;در واقع اگه این وابستگی ها مقدارشون تغییر کنه ، Side Effect ما مجدد اجرا میشه. به مثال زیر دقت کنید :&lt;/p&gt;

&lt;p&gt;`//  ایمپورت کردن هوک یوز افکت&lt;br&gt;
import { useEffect } from 'react';&lt;br&gt;
// کامپوننت ما&lt;br&gt;
const App = ({name,email}) =&amp;gt; {&lt;br&gt;
 // استفاده از هوک یوز افکت&lt;br&gt;
  useEffect(() =&amp;gt; {&lt;br&gt;
    axios.get('mysite.com/api // My Side Effect')&lt;br&gt;
  }, [name,email]); // useEffect Dependencies&lt;/p&gt;

&lt;p&gt;return(&lt;/p&gt;FrontEndi.com)&lt;br&gt;
}`

&lt;p&gt;تو خط 8 آرایه Dependencies رو تعریف کردیم. خط 8 این معنی رو میده که اگر مقدار name و email تغییر کردن Side Effect ما ( خط 7 ) باید مجدد اجرا بشه.&lt;/p&gt;

&lt;p&gt;اگه بخوایم دقیقتر خط 8 رو بررسی کنیم میتونیم اینو بگیم :&lt;/p&gt;

&lt;p&gt;بین re-Render های مختلف کامپوننت ، هوک useEffect مقادیر Dependencies رو چک میکنه که ببینه آیا تغییری داشتن یا نه ؟ اگه بدون تغییر بودن که هیچ. اما اگه مقدارشون تغییر پیدا کرده بود ، تابع داخل useEffect یا همون Side Effect مجدد اجرا میشه.&lt;/p&gt;

&lt;p&gt;این اتفاق خیلی خوبه چون خیلی وقت ها پیش میاد که میخوایم درصورت تغییر یک مقدار ، یک کاری رو انجام بدیم. مثلا درصورت تغییر اطلاعات کاربر ، اطلاعات جدید کاربر رو به سرور یا Local Storage بفرستیم.&lt;br&gt;
چند نکته مهم راجب useEffect ری اکت&lt;/p&gt;

&lt;p&gt;اگه قصد استفاده از useEffect در React رو دارید ، باید یکسری نکات مهم رو رعایت کنید.&lt;br&gt;
اجرا شدن useEffect بعد هر re-Render&lt;/p&gt;

&lt;p&gt;اگه آرایه Dependencies ( آرگومان دوم useEffect ) رو قرار ندید ، تابعی که داخل useEffect قرار دادید بعد از هر re-Render اجرا میشه. ( اجرا بعد از هر re-Render )&lt;br&gt;
لوپ بینهایت در useEffect !&lt;/p&gt;

&lt;p&gt;اگه هیچ Dependencies برای useEffect تعریف نکنید و داخل تابع useEffect یک State رو بروزرسانی کنید ، به این دلیل که پس از هر تغییر State یک re-Render صورت میگیره و مجدد تابع useEffect اجرا میشه و مجدد State بروزرسانی میشه ، کامپوننت شما داخل یک Loop بینهایت میوفته و برنامه شما کرش میکنه! ( Infinite Loop )&lt;/p&gt;

&lt;p&gt;تو تیکه کد زیر این مشکل واضحه :&lt;/p&gt;

&lt;p&gt;`function MyComponent() {&lt;br&gt;
  const [data, setData] = useState([])&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;br&gt;
    fetchData().then(myData =&amp;gt; setData(myData)) // اینجا استیت رو آپدیت میکنیم که باعث ری رندر میشه&lt;br&gt;
  }); // اینجا آرایه وابستگی تعریف نشده. پس بعد هر ری رندر اجرا میشه&lt;br&gt;
}`&lt;/p&gt;

&lt;p&gt;تو تیکه کد بالا اتفاق زیر میوفته :&lt;/p&gt;

&lt;p&gt;برای اولین بار Render صورت میگیره و تابع داخل useEffect اجرا میشه. داخل این تابع State رو آپدیت کردیم و چون State تغییر میکنه ، مجدد کامپوننت re-Render میشه. همین پروسه تا روز قیامت ادامه پیدا میکنه 🙂&lt;/p&gt;

&lt;p&gt;برای اینکه اتفاق بالا نیوفته ، باید یک آرایه خالی به عنوان وابستگی به useEffect پاس بدیم.&lt;/p&gt;

&lt;p&gt;زمانیکه یک آرایه خالی ( Empty Array ) به هوک useEffect پاس میدیم، باعث میشه که تابع داخل useEffect فقط بعد از اولین Render اجرا بشه. ( یعنی یکبار )&lt;/p&gt;

&lt;p&gt;مثال زیر ، شکل تصحیح شده تیکه کد بالاست :&lt;/p&gt;

&lt;p&gt;`function MyComponent() {&lt;br&gt;
  const [data, setData] = useState([])&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;br&gt;
    fetchData().then(myData =&amp;gt; setData(myData)) // ساید افکت ما&lt;br&gt;
  },[]); // آرایه خالی یعنی فقط بعد اولین رندر اجرا شو&lt;br&gt;
}`&lt;/p&gt;

&lt;p&gt;تابع CleanUp در ری اکت&lt;/p&gt;

&lt;p&gt;گاهی اوغات میخوایم وقتی کامپوننت ما از بین میره ( از DOM حذف میشه ) یک اتفاقی بیوفته.&lt;/p&gt;

&lt;p&gt;مثلا سناریویی رو در نظر بگیرید که داخل useEffect یک تایمر گذاشتیم اما کامپوننت ما از DOM حذف میشه. اتفاقی که اینجا میوفته این هست که کامپوننت ما از DOM حذف میشه اما تایمر هنوز داره کار میکنه چون clearInterval نشده!&lt;/p&gt;

&lt;p&gt;کد زیر کد مشکل دار هست چون تابع cleanUp نداره :&lt;/p&gt;

&lt;p&gt;`function Timer() {&lt;br&gt;
  const [time, setTime] = useState(0);&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;br&gt;
    setInterval(() =&amp;gt; setTime(1), 1000); // یه تایمر داریم که هر یک ثانیه یکبار اجرا میشه اما هیچموقع متوقفش نکردیم&lt;br&gt;
  }, []);&lt;br&gt;
}`&lt;/p&gt;

&lt;p&gt;مشکلی که تو تیکه کد بالا داریم این هست که :&lt;/p&gt;

&lt;p&gt;زمانیکه کامپوننت از DOM حذف میشه ، setInterval همچنان کار میکنه و setTime رو انجام میده! ( درصورتیکه کامپوننت حذف شده )&lt;/p&gt;

&lt;p&gt;این اتفاق به این دلیل میوفته که ما clearInterval نکردیم. ( تایمر رو متوقف نکردیم ) پس در اینجا به مشکل پر شدن حافظه در ری اکت بر میخوریم ( Memory Leak )&lt;/p&gt;

&lt;p&gt;برای رفع این مشکل باید یک تابع Clean Up بنویسیم. یعنی زمانیکه کامپوننت ما از DOM حذف شد یک کاری انجام بدیم.&lt;/p&gt;

&lt;p&gt;در این سناریو باید پس از حذف کامپوننت از DOM ، عملیات ClearInterval رو انجام بدیم .&lt;/p&gt;

&lt;p&gt;برای اینکه اینکار رو انجام بدیم باید داخل useEffect ، یک تابع Return کنیم :&lt;/p&gt;

&lt;p&gt;`function Timer() {&lt;br&gt;
  const [time, setTime] = useState(0);&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;br&gt;
    let interval = setInterval(() =&amp;gt; setTime(1), 1000);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return () =&amp;gt; {
  // setInterval cleared when component unmounts
  clearInterval(interval);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}, []);&lt;br&gt;
}`&lt;/p&gt;

&lt;p&gt;اگه تو useEffect یک تابع Return کنید ، خود useEffect متوجه میشه که این تابع رو فقط در زمان حذف کامپوننت از DOM باید اجرا کنه.&lt;/p&gt;

&lt;p&gt;خط 8 و 9 تیکه کد بالا فقط بعد از حذف شدن کامپوننت از DOM ، اجرا میشه.&lt;/p&gt;

&lt;p&gt;مثلا زمانیکه از کاربر از یک صفحه به صفحه دیگه منتقل میشه ، unmounted کامپوننت رخ میده خط 8 و 9 تیکه کد بالا اجرا میشه.&lt;/p&gt;

&lt;p&gt;مثال کاربردی از هوک useEffect&lt;/p&gt;

&lt;p&gt;ابتدای همین مقاله گفتیم که از هوک useEffect برای مدیریت Side Effect ها استفاده میکنیم.&lt;/p&gt;

&lt;p&gt;تو مثال زیر یک Side Effect رو تو بدنه کامپوننت اجرا کردیم که این اشتباهه. اگه از useEffect برای اجرای Side Effect ها استفاده نکنیم امکان مدیریت Side Effect هارو نداریم!&lt;/p&gt;

&lt;p&gt;&lt;code&gt;function Greet({ name }) {&lt;br&gt;
  const message =&lt;/code&gt;Hello, ${name}!`;&lt;/p&gt;

&lt;p&gt;// این بده&lt;br&gt;
  document.title = &lt;code&gt;Greetings to ${name}&lt;/code&gt;; // ساید افکت ما&lt;/p&gt;

&lt;p&gt;return &lt;/p&gt;{message};&lt;br&gt;
}`

&lt;p&gt;تو تیکه کد بالا یک Side Effect داریم .&lt;/p&gt;

&lt;p&gt;خط 5 با هر بار re-Render شدن کامپوننت اجرا میشه و این اصلا خوب نیست چون این Side Effect باید فقط درصورت تغییر مقدار name که یک Props هست ، اجرا بشه.&lt;/p&gt;

&lt;p&gt;برای رفع این مشکل و مدیریت Side Effect بطوریکه فقط درصورت تغییر Props ، رندر مجدد صورت بگیره باید بصورت زیر عمل کنیم :&lt;/p&gt;

&lt;p&gt;`import { useEffect } from 'react';&lt;/p&gt;

&lt;p&gt;function Greet({ name }) {&lt;br&gt;
  const message = &lt;code&gt;Hello, ${name}!&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;br&gt;
    // Good!&lt;br&gt;
    document.title = &lt;code&gt;Greetings to ${name}&lt;/code&gt;; الان ساید افکت ما فقط درصورت تغییر نام اجرا میشه و این عالیه&lt;br&gt;
  }, [name]);&lt;/p&gt;

&lt;p&gt;return &lt;/p&gt;{message};&lt;br&gt;
}`

&lt;p&gt;بریم چند نمونه از کاربرد هوک useEffect در React رو ببینیم …&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OIAYGUCG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6ib821bvbwt05ksvdcpy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OIAYGUCG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6ib821bvbwt05ksvdcpy.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;با هوک useEffect ری اکت چیکار میشه کرد ؟&lt;/p&gt;

&lt;p&gt;بطور خلاصه و ساده ما میتونیم با هوک useEffect ری اکت ، یکسری کارها و عملیات مواقع زیر انجام بدیم :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;هنگام ایجاد شدن کامپوننت در DOM یا همون Component did mount
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;بطور مثال وقتی کاربر وارد صفحه X شد یک پیغام بهش نشون بدیم. یا وقتی کاربر وارد صفحه فروشگاه شد ، لیست محصولات رو از سرور دریافت کنیم. بصورت زیر :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;useEffect(() =&amp;gt; {&lt;br&gt;
  // فقط زمان ایجاد کامپوننت اجرا میشم&lt;br&gt;
  document.title = 'کامپوننت ایجاد شد';&lt;br&gt;
  axios.get('/blogs') // دریافت لیست مقالات از سرور&lt;br&gt;
}, []);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;تو تیکه کد بالا ، آرایه خالی به عنوان Dependencies باعث شده که تابع فقط 1 بار پس از اولین رندر اجرا بشه و تو re-Render های بعدی کامپوننت اجرا نشه.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;هنگام تغییر مقدار Value هایی که خودمون مشخص کردیم به عنوان Dependencies ( همون Component did update )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;مثلا درصورت تغییر سبد خرید کاربر ، سبد خرید جدید رو داخل Local Storage ذخیره کنیم. ( در این صورت باید cart رو به عنوان Dependencies برای useEffect قرار بدیم تا فقط درصورت تغییر cart این اتفاق رخ بده )&lt;br&gt;
تو مثال زیر گفتیم هر زمان props تغییر کرد ، callback Function ما مجدد اجرا بشه :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;useEffect(() =&amp;gt; {&lt;br&gt;
  localstorage.SetItem('cart',JSON.stringify(cart)) // من زمانی که سبد خرید تغییر کنه اجرا میشم&lt;br&gt;
}, [cart]);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;تو Component did update یه نکته ای وجود داره. اینکه اجرای Side Effect یکبار پس از اولین Render صورت میگیره و در دفعات بعد فقط هنگام تغییر مقادیر Dependencies صورت میگیره.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;هنگام حذف شدن کامپوننت از DOM یا همون Unmounting ( بطور مثال این مرحله هنگام تغییر صفحه توسط کاربر اتفاق میوفته )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;مثلا میخوایم وقتی کاربر از فروشگاه به صفحه دیگه ای رفت ، یکسری کارها داخل صفحه فروشگاه اتفاق بیوفته.&lt;br&gt;
اگه داخل useEffect یک تابع Return کنیم ، تابع فقط پس از حذف کامپوننت از DOM اجرا میشه :&lt;/p&gt;

&lt;p&gt;`useEffect(()=&amp;gt;{&lt;/p&gt;

&lt;p&gt;return function cleanUp(){&lt;br&gt;
// من فقط بعد از حذف کامپوننت از دام اجرا میشم&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;},[])`&lt;/p&gt;

&lt;h2&gt;
  
  
  ادامه این مقاله
&lt;/h2&gt;

&lt;p&gt;لطفا برای مطالعه ادامه این مقاله + تیکه کد ها و مثالهای بیشتر روی لینک زیر کلیک کنید : &lt;/p&gt;

&lt;p&gt;&lt;a href="https://frontendi.com/useeffect-react/"&gt;useEffect در ریکت&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>هوک useReducer ری اکت و بررسی تخصصی useReducer</title>
      <dc:creator>FrontEndi</dc:creator>
      <pubDate>Fri, 10 Nov 2023 18:22:58 +0000</pubDate>
      <link>https://dev.to/frontendi/hwkh-usereducer-ry-kht-w-brrsy-tkhssy-usereducer-3j87</link>
      <guid>https://dev.to/frontendi/hwkh-usereducer-ry-kht-w-brrsy-tkhssy-usereducer-3j87</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G6sCnLT2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uksfna28hd5qxo7ubtx4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G6sCnLT2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uksfna28hd5qxo7ubtx4.png" alt="Image description" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;هوک useReducer رو میشه به عنوان یک جایگزین برای هوک useState در نظر گرفت ! در واقع هوک useReducer به ما کمک میکنه تا State های پیچیده تر کامپوننت های خودمون رو بتونیم مدیریت کنیم !&lt;/p&gt;

&lt;p&gt;اگه State شما سادس ، همون هوک useState کاملا جوابگوی نیاز شماست اما اگه State های پیچیده تری دارید بهتره که از  هوک useReducer ری اکت استفاده کنید.&lt;/p&gt;

&lt;p&gt;ترکیب useReducer و useContext یک جایگزین عالی برای Redux و MobX !&lt;/p&gt;

&lt;p&gt;اگه هوک useReducer رو با هوک useContext ترکیب کنید میشه گفت دیگه نیازی به State Managment هایی مثل Redux یا MobX ندارید!&lt;/p&gt;

&lt;p&gt;گاهی اوغات توی اپیکیشن های ری اکتی خودمون یکسری State های Global داریم. معمولا برای مدیریت این State های Global از کتابخانه هایی مثل Redux ، MobX و Recoil استفاده میکنیم .&lt;/p&gt;

&lt;p&gt;اما میشه با ترکیب useReducer و useContext این State های Global رو بطور مناسبی مدیریت کرد که دیگه نیازی به استفاده از Redux و سایر State Managment ها نداشته باشیم .&lt;/p&gt;

&lt;p&gt;البته ناگفته نماند که این موضوع کاملا بستگی به پروژه شما و نوع State های Global شما دارد.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4-IhR-6w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oxkm7ns6latjv54r3u14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4-IhR-6w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oxkm7ns6latjv54r3u14.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;هوک useReducer ری اکت چیست ؟&lt;/p&gt;

&lt;p&gt;درواقع هوک useReducer برای ذخیره کردن یک مقدار و بروزرسانی اون مقدار استفاده میشه . ( مثل هوک useState )&lt;/p&gt;

&lt;p&gt;هوک useReducer دوتا آرگومان ورودی از ما دریافت میکنه :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; اولین آرگومان یک تابع reducer هست که برای بروزرسانی مقدار ذخیره شده کاربرد داره .
 دومین آرگومان یک مقدار اولیه ( Initial State ) هست .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;هوک useReducer یک آرایه Return میکنه داخل این آرایه 2 چیز وجود داره :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;مقدار فعلی State
یک تابع Dispatch که میتونیم از این تابع برای بروزرسانی مقدار State استفاده کنیم ( با پاس دادن یک Action به این Dispatch )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;طبق صحبت هایی که تا الان کردیم ، هوک useReducer همون کاری رو انجام میده که Redux ( یک کتابخانه برای مدیریت State ) انجام میده با چند تفاوت. اما چون قصد نداریم در این مقاله به Redux بپردازیم فقط به این نکته اشاره میکنیم که مدیریت State های Global با useReducer خیلی ساده تر است اما Redux برای مدیریت State های بسیار پیچیده و سنگین مناسبتر است.&lt;br&gt;
تابع Reducer در useReducer&lt;/p&gt;

&lt;p&gt;گفتیم که هوک useReducer یک تابع reducer از ما میگیره . اما این تابع دقیقا چیه ؟&lt;/p&gt;

&lt;p&gt;خیلی ساده بخوایم reduce رو توضیح بدیم میتونیم اون رو مثل یک دستگاه قهوه ساز در نظر بگیریم :&lt;/p&gt;

&lt;p&gt;دستگاه قهوه ساز از شما پودر قهوه میگیره ، بهش آب داغ اضافه میکنه و قهوه تحویل شما میده 🙂 تابع reducer از شما State قبلی رو میگیره ، یکسری عملیات روش انجام میده و State جدید رو تحویل شما میده. &lt;/p&gt;

&lt;p&gt;هوک useReducer ری اکت مشابه همین کار رو انجام میده. هوک useReducer یک تابع reducer از ما دریافت میکنه و یک مقدار به ما Return میکنه.&lt;/p&gt;

&lt;p&gt;تیکه کد زیر یک مثال ساده از نحوه استفاده از هوک useReducer در ری اکت هست :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const [count, dispatch] = useReducer(reducer, initialState);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;تو مثال بالا به هوک useReducer دو مقدار پاس دادیم ( تابع reducer و مقدار اولیه State )&lt;/p&gt;

&lt;p&gt;خود تابع reducer ، دو مقدار از ما میگیره و یک مقدار رو Return میکنه .&lt;/p&gt;

&lt;p&gt;اولین مقدار State فعلی و دومین مقدار Action ما هست ( منظور از Action کاری هست که میخوایم انجام بدیم مثل اضافه کردن ، کم کردن و ..)&lt;/p&gt;

&lt;p&gt;یعنی تابع reducer باید بصورت زیر باشه :&lt;/p&gt;

&lt;p&gt;`const reducer=(state, action)=&amp;gt; { }&lt;/p&gt;

&lt;p&gt;dispatch({ type: 'increment' })`&lt;/p&gt;

&lt;p&gt;در واقع تابع reducer بر اساس نوع action ارسال شده بهش ، کارهایی که باید رو انجام میده.&lt;/p&gt;

&lt;p&gt;مثلا تو خط 3 بهش گفتیم increment ، پس داخل تابع reducer باید مشخص کنیم که اگر Action ما Increment بود چه اتفاقی بیوفته ( مثلا مقدار count زیاد بشه )&lt;br&gt;
مقدار InitialState در useReducer&lt;/p&gt;

&lt;p&gt;دومین آرگومانی که باید به هوک useReducer پاس بدیم ، InitialState یا همون مقدار اولیه State هست .&lt;/p&gt;

&lt;p&gt;تو مثال زیر این کار رو انجام دادیم:&lt;/p&gt;

&lt;p&gt;`const initialState = { count: 1 }&lt;/p&gt;

&lt;p&gt;const [state, dispatch] = useReducer(reducer, initialState)`&lt;/p&gt;

&lt;p&gt;تو اولین خط تیکه کد بالا ، یک Object داریم که این Object رو به عنوان مقدار اولیه به هوک useReducer دادیم.&lt;br&gt;
متود dispatch در useReducer&lt;/p&gt;

&lt;p&gt;معادل فارسی عبارت dispatch ، اعزام هست. زمانیکه میخوایم یک کار ( action ) اتفاق بیوفته ، تابع dispatch رو صدا میزنیم .&lt;/p&gt;

&lt;p&gt;خود تابع dispatch به عنوان ورودی از ما یک Object میگیره که نوع کار رو مشخص میکنه. در حقیقت Action توسط متود dispatch به reducer میرسه .&lt;/p&gt;

&lt;p&gt;خود اکشنی که به reducer میفرستیم ، مشخص کننده نوع کار هست . در حقیقت داخل تابع reducer مشخص کردیم که برای هر نوع Action چه اتفاق هایی باید بیوفته .&lt;/p&gt;

&lt;p&gt;پس از انجام عملیات dispatch با Action مدنظرمون ، Reducer کارها و محاسباتش رو انجام میده و نتیجه رو Return میکنه .&lt;/p&gt;

&lt;p&gt;Action شما باید یک Object باشه که شامل 2 مقدار Key و Payload باشه :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const INCREMENT={&lt;br&gt;
    type : "INCREMENT",&lt;br&gt;
    payload: null,&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;تو تیکه کد بالا یک Action نمونه رو میتونید ببینید . مقدار type مشخص کننده نوع کاری هست که میخوایم با dispatch کردن اون Action انجامش بدیم.&lt;/p&gt;

&lt;p&gt;داخل payload هم میتونیم اطلاعات مورد نیاز اون Action رو بریزیم. مثلا اگر یک Action برای ثبت نام کاربر داشته باشیم ، داخل payload اطلاعات کاربر رو میتونیم بریزیم مثل نام و فامیل شخص .&lt;/p&gt;

&lt;p&gt;تو تیکه کد زیر یک مثال براتون آماده کردم که از هوک useReducer برای ذخیره یک عدد استفاده کردیم.&lt;/p&gt;

&lt;p&gt;یک Action برای Reset کردن مقدار ذخیره شده داریم و یک Reducer که وظیفه دریافت Action ،انجام عملیات و return کردن مقدار جدید رو داره.&lt;br&gt;
یک مثال از هوک ()useReducer در React&lt;/p&gt;

&lt;p&gt;`// reducer Function&lt;br&gt;
function reducer(state, action) {&lt;br&gt;
  switch (action.type) {&lt;br&gt;
   // ...&lt;br&gt;
      case 'reset':&lt;br&gt;
          return { count: action.payload };&lt;br&gt;
    default:&lt;br&gt;
      throw new Error();&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
const initialCount = 0;&lt;br&gt;
// use useReducer and set reducer,initialState to it&lt;br&gt;
const [state, dispatch] = useReducer(reducer, initialCount, initFunc);&lt;/p&gt;

&lt;p&gt;// Updating State With Dispatch reset Action&lt;br&gt;
 dispatch({type: 'reset', payload: initialCount})}&amp;gt; Reset `&lt;/p&gt;

&lt;p&gt;تو خط 13 تیکه کد بالا ، با استفاده از هوک useReducer در React یک state برای ذخیره مقدار و یک dispatch برای بروزرسانی مقدار ایجاد کرده ایم .&lt;/p&gt;

&lt;p&gt;به useReducer یک مقدار اولیه دادیم به نام initialCount که مقدارش 0 هست.&lt;/p&gt;

&lt;p&gt;همچنین به useReducer یک تابع دادیم که وظیفه بررسی Action های ارسال شده بهش و Return مقدار جدید رو داره ( این تابع در خط 2 ایجاد شده )&lt;/p&gt;

&lt;p&gt;تو تابع reducer ، مقدار action.type رو چک کردیم که بتونیم با توجه به نوع action تصمیم مناسب رو بگیریم . در اینجا گفتیم اگر اکشن ما reset بود ، مقداری که داخل payload برامون فرستاده شده رو برای count قرار بده. ( چون داخل payload برای ما initialCount فرستاده شده پس مقدار 0 اینجا قرار میگیره و در نتیجه مقدار state ریست میشه )&lt;/p&gt;

&lt;p&gt;تو خط 16 هم یک دکمه برای reset کردن قرار دادیم و گفتیم اگر روی این دکمه کلیک شد ، Action مشخص شده رو dispatch کن.&lt;/p&gt;

&lt;p&gt;تو خط 16 (هنگام dispatch ) علاوه بر مشخص کردن action type ، یک action payload هم مشخص کردیم که برای reducer فرستاده بشه.&lt;br&gt;
شعور ()useReducer !&lt;/p&gt;

&lt;p&gt;هوک useReducer باشعوره . اگه مقداری که useReducer برمیگردونه ( return میکنه ) با مقدار فعلی state برابر باشه ، هیچ رندر مجددی صورت نمیگیره .&lt;br&gt;
یه مثال کامل از هوک useReducer ری اکت&lt;/p&gt;

&lt;p&gt;خب حالا که با هوک useReducer آشنا شدین ، بریم یه مثال کامل ازش ببینیم .&lt;/p&gt;

&lt;p&gt;تو این مثال میخوایم یه Counter App بسازیم.&lt;/p&gt;

&lt;p&gt;میخوایم 3 تا دکمه برای افزایش مقدار ، کاهش مقدار و ریست مقدار داشته باشیم :&lt;/p&gt;

&lt;p&gt;`import React, { useReducer } from 'react';&lt;/p&gt;

&lt;p&gt;const initialState = { count: 0 }&lt;br&gt;
 // The reducer function&lt;br&gt;
function reducer(state, action) {&lt;br&gt;
  switch (action.type) {&lt;br&gt;
    case 'increment':&lt;br&gt;
      return { count: state.count + 1 }&lt;br&gt;
    case 'decrement':&lt;br&gt;
      return { count: state.count - 1 }&lt;br&gt;
    case 'reset':&lt;br&gt;
      return {count: state.count = 0}&lt;br&gt;
    default:&lt;br&gt;
     return { count: state.count  }&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;const Counter = () =&amp;gt; {&lt;br&gt;
  const [state, dispatch] = useReducer(reducer, initialState)&lt;/p&gt;

&lt;p&gt;return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
      مقدار فعلی : {state.count}&lt;br&gt;
       &lt;br&gt;&lt;br&gt;
       &lt;br&gt;&lt;br&gt;
        dispatch({ type: 'increment' })}&amp;gt; افزایش &lt;br&gt;
        dispatch({ type: 'decrement'})}&amp;gt; کاهش &lt;br&gt;
        dispatch({ type: 'reset'})}&amp;gt; ریست &lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
};

&lt;p&gt;export default Counter;`&lt;/p&gt;

&lt;p&gt;تو مثل بالا 3 تا دکمه داریم که با کلیک کردن روی هرکدوم یک Action رو Dispatch میکنیم.&lt;/p&gt;

&lt;p&gt;دکمه افزایش برای increment کردن ، دکمه کاهش برای decrement کردن و دکمه reset برای ریست مقدار.&lt;/p&gt;

&lt;p&gt;تو خط 19 یک مقدار اولیه ( initialState ) مشخص کردیم که مقدارش 0 هست. همچنین یک تابع reducer مشخص کردیم .&lt;/p&gt;

&lt;p&gt;این تابع reducer در خط  5 تعریف شده و وظیفش بررسی کردن نوع Action ( توسط Switch ) هست و با توجه به نوع Action مقدار فعلی رو تغییر میده و مقدار جدید رو Return میکنه.&lt;/p&gt;

&lt;p&gt;ما اینجا 3 نوع Action داریم ( increment,decrement,reset ) ولی ممکنه شما نیاز به Action های بیشتر با قابلیت های بیشتری داشته باشید .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fahhDSla--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/876cnlewb946rrcfh81k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fahhDSla--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/876cnlewb946rrcfh81k.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;لطفا برای مطالعه ادامه این مقاله + تیکه کد ها و مثالهای بیشتر روی لینک زیر کلیک کنید : &lt;br&gt;
&lt;a href="https://frontendi.com/usereducer-in-react/"&gt;useReducer در ریکت&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>هوک useCallback ری اکت و بررسی تخصصی React.useCallback</title>
      <dc:creator>FrontEndi</dc:creator>
      <pubDate>Fri, 10 Nov 2023 18:19:32 +0000</pubDate>
      <link>https://dev.to/frontendi/hwkh-usecallback-ry-kht-w-brrsy-tkhssy-reactusecallback-4i92</link>
      <guid>https://dev.to/frontendi/hwkh-usecallback-ry-kht-w-brrsy-tkhssy-reactusecallback-4i92</guid>
      <description>&lt;p&gt;هوک useCallback ری اکت یکی از مهمترین هوک هایی هست که هر React Developer ، باید تسلط خوبی بهش داشته باشه . در واقع هوک useCallback تو بحث Performance به ما کمک میکنه تا سایت بهینه تری داشته باشیم.&lt;br&gt;
هوک useCallback ری اکت&lt;/p&gt;

&lt;p&gt;هوک useCallback ، توابع ( function ) های شمارو کش میکنه و در هر re-Render اون توابع مجدد ساخته ( re-Creation ) نمیشن ! و از حافظه cashe خونده میشن .&lt;/p&gt;

&lt;p&gt;هوک useCallback در ری اکت با جلوگیری از re-Render های اضافه و کاهش زمان re-Render ها باعث بهینه سازی و بهبود عملکرد اپیکیشن ما میشه.&lt;/p&gt;

&lt;p&gt;عملکرد هوک useCallback تقریبا مثل هوک useMemo هست اما تفاوت هایی باهمدیگه دارن.&lt;/p&gt;

&lt;p&gt;با فِرانت اِندی همراه باشید که میخوایم این هوک خفن رو تخصصی بررسی کنیم 🙂&lt;/p&gt;

&lt;p&gt;اما قبل از اینکه بریم سراغ هوک ()useCallback لازمه با مفهوم Functions erquality آشنا باشید .&lt;br&gt;
مفهوم Function equality به چه معناست ؟&lt;/p&gt;

&lt;p&gt;برای فهمیدن اینکه useCallback دقیقا چیکار میکنه باید دو تا مفهوم رو باهم بررسی کنیم : referential equality و function equality ..&lt;/p&gt;

&lt;p&gt;توابع یا همون Function ها تو جاوااسکریپت مثل Variable ها ( متغیر ها ) رفتار میکنن.&lt;/p&gt;

&lt;p&gt;یعنی ما همونطور که میتونیم یک متغیر رو به عنوان آرگومان به تابع پاس بدیم ، میتونیم یک تابع رو هم به عنوان آرگومان به یک تابع پاس بدیم.&lt;/p&gt;

&lt;p&gt;پس میتونیم با یک تابع مثل متغیر رفتار کنیم : یعنی به عنوان آرگومان به یک تابع بدیمش ، تابع رو تو یه تابع دیگه return کنیم ، بریزیمش داخل یک متغیر و درکل هربلایی که میشه سر یه variable اورد ، سر تابع هم میشه اورد!&lt;/p&gt;

&lt;p&gt;به مثال زیر دفت کنید تا متوجه بشید :&lt;/p&gt;

&lt;p&gt;`// Numbers function&lt;br&gt;
function sumFunctionNumbers() {&lt;br&gt;
  return (a, b) =&amp;gt; a + b;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;const function1 = sumFunctionNumbers();&lt;br&gt;
const function2 = sumFunctionNumbers();&lt;/p&gt;

&lt;p&gt;function1(2, 3);&lt;br&gt;
// expected output: 5&lt;br&gt;
function2(2, 3);&lt;br&gt;
// expected output: 5&lt;/p&gt;

&lt;p&gt;console.log(function1 === function2);&lt;br&gt;
// expected output: false`&lt;/p&gt;

&lt;p&gt;تو تیکه کد بالا یه تابع ساختیم  به اسم sumFunctionNumbers .&lt;/p&gt;

&lt;p&gt;حالا این تابع رو ریختیم داخل 2 تا متغیر به اسم function1 و function2 .&lt;/p&gt;

&lt;p&gt;تو خط 14 این 2 تابع که منطق یکسانی دارن رو باهم مقایسه کردیم ولی بهمون False برگردوند ! دلیل این موضوع این هست که این 2 تابع آدرس های متفاوتی در حافظه دارن و از دید  جاوااسکریپت با همدیگه متفاوت هستن.&lt;/p&gt;

&lt;p&gt;اما حقیقت موضوع اینه که این 2 تابع یکسان هستن ! خب حالا بریم سراغ هوک useCallback ری اکت …&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ygX2qr1O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g7j0g3ds9qy0vpvby1nv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ygX2qr1O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g7j0g3ds9qy0vpvby1nv.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;هوک useCallback چیست ؟&lt;/p&gt;

&lt;p&gt;تو ری اکت زمانیکه یک کامپوننت re-Render میشه ، تمامی function های موجود در اون کامپوننت مجدد ساخته میشن و یک جای جدید در حافظه اِشغال میکنن.&lt;/p&gt;

&lt;p&gt;هوک useCallback از تابع شما یک instance ( نمونه ) میسازه و تا زمانیکه dependencies های اون تغییر نکنه ، تو re-Render های بعدی به هیچ عنوان تابع شما مجدد ساخته نمیشه و جای جدید در حافظه اِشغال نمیکنه:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const x = useCallback(callback, dependencies)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;تو تیکه کد بالا نحوه استفاده از هوک useCallback در react مشخص شده .&lt;/p&gt;

&lt;p&gt;تو بخش callback باید تابع خودتون و تو بخش dependenies باید مواردی رو ذکر کنید که میخواید در صورت تغییر پیدا کردنشون ، تایع شما مجدد ساخته بشه. در نهایت یک تابع memo شده return میشه که داخل متغیر x ذخیره میشه .&lt;/p&gt;

&lt;p&gt;استفاده از هوک useCallback در ری اکت بشدت کاربردی و مهمه !!&lt;/p&gt;

&lt;p&gt;چون بجای ساختن function های موجود در کامپوننت در هر re-Render ، فقط زمانی که dependencies ها تغییر میکنن اون توابع مجدد ساخته میشن.&lt;/p&gt;

&lt;p&gt;تو تیکه کد زیر ما یک تابع memo شده به کمک useCallback ساختیم که در هر بار re-Render مجدد ساخته نمیشه !&lt;/p&gt;

&lt;p&gt;`const momoizedFunction = useCallback(() =&amp;gt; {&lt;br&gt;
// the callback function to be memoized&lt;br&gt;
},&lt;/p&gt;

&lt;p&gt;[]); // dependencies array`&lt;/p&gt;

&lt;p&gt;چه زمانی از هوک ()useCallback استفاده کنیم ؟&lt;/p&gt;

&lt;p&gt;هر زمان تغییر نتیجه State کامپوننت پدر ، در کامپوننت فرزند تاثیر گذار نیست باید از هوک useCallback استفاده کرد .&lt;/p&gt;

&lt;p&gt;یعنی فرض کنید State کامپوننت پدر تغییر میکند. اگر این تغییر state هیچ ارتباطی به کامپوننت فرزند ندارد باید از هوک useCallback استفاده کرد .&lt;/p&gt;

&lt;p&gt;اما درصورتیکه این تغییر State باعث تغییر نتیجه در کامپوننت فرزند میبشود ، پس نیازی به useCallback نیست و باید اجازه دهیم re-Render و re-Creation رخ دهد .&lt;br&gt;
چه زمانی از هوک ()useCallback ری اکت استفاده نکنیم ؟&lt;/p&gt;

&lt;p&gt;برخی هوک ها خیلی مفید و کاربردی هستن ولی دلیل نمیشه که ازشون هرجایی بصورت بی رویه و بدون دلیل استفاده کنیم !&lt;/p&gt;

&lt;p&gt;اتفاقا استفاده بی رویه از هوک های مفید ( مثل هوک useMemo ) قطعا تاثیرات منفی روی Performance اپیکیشن شما داره.&lt;/p&gt;

&lt;p&gt;در برخی موارد نیازی به useCallback ری اکت نیست و بهتره اجازه بدیم با هربار re-Render ، توابع ما مجدد ساخته بشن.&lt;/p&gt;

&lt;p&gt;استفاده بی رویه از هوک ()useCallback در درجه اول باعث پیچیدگی کد اپیکیشن شما میشه .&lt;/p&gt;

&lt;p&gt;ضمن اینکه با هر بار re-Render شدن کامپوننت ، useCallback اجرا میشه و Dependencies هارو چک میکنه که تغییری داشتن یا بدون تغییر بودن. همین پروسه خودش هزینه داره و زمانبر هست.&lt;/p&gt;

&lt;p&gt;تو مثال زیر نیازی به هوک useCallback در react نداریم و نباید ازش استفاده میکردیم :&lt;/p&gt;

&lt;p&gt;`export default function App() {&lt;/p&gt;

&lt;p&gt;const clickHandler = useCallback(() =&amp;gt; {&lt;br&gt;
    // handle the click event&lt;br&gt;
  }, []);&lt;/p&gt;

&lt;p&gt;return ;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;const ButtonWrapper = ({ clickHandler }) =&amp;gt; {&lt;br&gt;
  return Child Component;&lt;br&gt;
};`&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3LRTKf7M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/znj1pd6fzwnoebnhsedp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3LRTKf7M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/znj1pd6fzwnoebnhsedp.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  تفاوت useCallback و useMemo چیست ؟
&lt;/h2&gt;

&lt;p&gt;برای مطالعه ادامه این مقاله + مثالها و تیکه کد های بیشتر روی لینک زیر کلیک کنید : &lt;br&gt;
&lt;a href="https://frontendi.com/react-usecallback/"&gt;useCallback در ریکت&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>هوک useState ری اکت و بررسی تخصصی ()React.useState</title>
      <dc:creator>FrontEndi</dc:creator>
      <pubDate>Fri, 10 Nov 2023 18:16:30 +0000</pubDate>
      <link>https://dev.to/frontendi/hwkh-usestate-ry-kht-w-brrsy-tkhssy-reactusestate-8bh</link>
      <guid>https://dev.to/frontendi/hwkh-usestate-ry-kht-w-brrsy-tkhssy-reactusestate-8bh</guid>
      <description>&lt;p&gt;هوک useState ری اکت به ما این امکان رو میده که حالت ها و مقادیر کامپوننت خودمون رو در جایی ذخیره کنیم. این حالت ها (stateها) میتونن از هر نوعی ( string,number,array,object و..) باشن .&lt;/p&gt;

&lt;p&gt;با ذخیره کردن این state ها ، میتونیم تو کل اون کامپوننت ازشون مثل یه متغیر استفاده کنیم و هر زمان نیاز داشتیم مقدارشون رو بروزرسانی کنیم .&lt;/p&gt;

&lt;p&gt;هوک useState چطور کار میکنه ؟&lt;/p&gt;

&lt;p&gt;با ساختن هر state ( توسط useState ) باید یک مقدار اولیه به اون state بدید .&lt;/p&gt;

&lt;p&gt;مثلا اگه میخواید Theme اپیکیشن رو داخل state ذخیره کنید ، باید مشخص کنید که مقدار اولیه Theme چی باشه ؟!&lt;/p&gt;

&lt;p&gt;تو مثال زیر ما به کمک هوک useState حالت اپیکیشن رو ذخیره کردیم.&lt;br&gt;
(تو این مثال از theme برای دسترسی به مقدار و از setTheme برای بروز کردن مقدار استفاده میکنیم ):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const [theme,setTheme] = useState('DarkMode')&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;اگه کد بالارو کامل متوجه نشدید ، اصلا نگران نباشید و با فِرانت اِندی همراه باشید که میخوایم حسابی بررسیش کنیم 🙂&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--K0_K1WL4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/edkt3jxfopy6i5rbrmic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K0_K1WL4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/edkt3jxfopy6i5rbrmic.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;هوک useState ری اکت چیست ؟&lt;/p&gt;

&lt;p&gt;هوک useState یکی از مهمترین هوک های ری اکت هست که به ما اجازه میده حالت های کامپوننت خودمون رو ذخیره و مدیریت کنیم . حالا شاید بپرسید حالت کامپوننت یعنی چی ؟&lt;/p&gt;

&lt;p&gt;فرض کنید توی کامپوننت خودمون باید نام کاربر یا شماره تلفنش رو در جایی ذخیره کنیم . خب هرکدوم از اینها یک حالت ( state ) هستن که هوک useState ری اکت به ما امکان ذخیره و بروزرسانی این مقادیر رو میده.&lt;/p&gt;

&lt;p&gt;برای ذخیره کردن نام کاربر باید بصورت زیر عمل کنیم :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const [name,setName] = useState('احمد')&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;برای استفاده از نام کاربر تو کامپوننت خودمون ، باید از name استفاده کنیم . مثل مثال زیر :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;div&amp;gt;{name}&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;برای تغییر یا بروزرسانی مقدار name به یک مقدار جدید ( مثلا تغییر احمد به حسین ) باید بصورت زیر عمل کنیم :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;setName('حسین')&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;در واقع React.useState به ما 2 امکان میده :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;امکان خواندن مقدار ذخیره شده .
امکان بروزرسانی مقدار ذخیره شده.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;هوک useState ری اکت چه مقادیری رو میتونه ذخیره کنه ؟&lt;/p&gt;

&lt;p&gt;هوک useState در React به ما اجازه ذخیره هر نوع مقداری با هر نوعی رو میده !&lt;/p&gt;

&lt;p&gt;مثلا شما میتونید انواع مختلف دیتا های primitive مثل String , Number , Boolean رو داخلش ذخیره کنید . همچنین امکان ذخیره کردن دیتا های Complex مثل Array و Object ، تابع ، و دیتا تایپ های اختصاصی روهم دارید.&lt;/p&gt;

&lt;p&gt;یا بزارید اینجوری بگم :&lt;/p&gt;

&lt;p&gt;هرچیزی که داخل متغیر های جاوااسکریپت میتونید ذخیره کنید ، داخل State هم میتونید 🙂&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Xm7y-VT6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jptchcfrbcfwacd1n80k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xm7y-VT6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jptchcfrbcfwacd1n80k.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;اما بروزرسانی Object و Array کمی متفاوت تره !&lt;/p&gt;

&lt;p&gt;تو ری اکت انواع مختلف دیتا رو میشه بصورت مستقیم بروزرسانی کرد ( مثل مثال های بالا )&lt;/p&gt;

&lt;p&gt;اما برای Object و Array نمیشه مستقیما بروزرسانی رو انجام داد . ( بخاطر بحث immutability که بعدا راجبش صحبت میکنیم )&lt;/p&gt;

&lt;p&gt;برای بروزرسانی Object یا Array باید بصورت زیر عمل کنید :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;یک کپی از Object یا Array موجود در state بگیرید .
تغییرات خودتون رو روی اون Object یا Array کپی شده اعمال کنید .
حالا توسط setState آبجکت یا آرایه بروز شده رو در state ذخیره کنید .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;تو دستورالعمل بالا ما مستقیما مقدار State خودمون با نوع Object یا Array رو آپدیت نمیکنیم !&lt;/p&gt;

&lt;p&gt;یک کپی از اون مقدار میگیریم و هر تغییری که لازم داریم رو روی اون مقدار کپی شده لحاظ میکنیم .&lt;/p&gt;

&lt;p&gt;حالا مقدار کپی شده که تغییرات رو هم شامل شده ، توسط setState جایگزین مقدار قبلی در state میکنیم .&lt;/p&gt;

&lt;p&gt;تو مثال زیر یه State با نوع Object رو بروزرسانی میکنیم :&lt;/p&gt;

&lt;p&gt;`const [state, setState] = useState({ name: 'Fatemeh', age: 21 });&lt;/p&gt;

&lt;p&gt;const updateAge = () =&amp;gt; {&lt;br&gt;
  setState({ ...state, age: 22 });&lt;br&gt;
};`&lt;/p&gt;

&lt;p&gt;تو مثال بالا یه State داریم که یک Object به عنوان مقدار اولیه ( InitialState ) بهش دادیم . این آبجکت شامل نام و سن هست که نام از نوع رشته و سن از نوع عدد هستن.&lt;/p&gt;

&lt;p&gt;تابع updateAge برای بروزرسانی اطلاعات این State هست که داخلش setState رو صدا زدیم .&lt;/p&gt;

&lt;p&gt;با state… میتونیم یک کپی از مقدار state بگیریم ، حالا چون مقدار age تغییر کرده پس در کنارش مقدار جدید رو هم قرار میدیم .&lt;/p&gt;

&lt;p&gt;یعنی تو خط 4 گفتیم : از هرچی تو state هست یه کپی بگیر ، حالا مقدار age رو توی ورژن کپی شده تغییر بده . در نهایت با setState این مقدار بروز شده رو set کن .&lt;/p&gt;

&lt;p&gt;تو مثال زیر یه state با نوع Array رو بروزرسانی میکنیم :&lt;/p&gt;

&lt;p&gt;`const [array, setArray] = useState([1, 2, 3, 4, 5]);&lt;/p&gt;

&lt;p&gt;const addItem = () =&amp;gt; {&lt;br&gt;
  setArray([...array, 6]);&lt;br&gt;
};`&lt;/p&gt;

&lt;p&gt;تو مثال بالا یک state از نوع Array داریم .&lt;/p&gt;

&lt;p&gt;تو خط 4 یک کپی از array گرفتیم و مقدار 6 رو به این آرایه اضافه کردیم و در نهایت توسط setArray این مقدار بروزر شده رو set کردیم .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w3hqYjx3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xh879nmttinuohw3eb6r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w3hqYjx3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xh879nmttinuohw3eb6r.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;چه زمانی باید از ()React.useState استفاده کنیم ؟&lt;/p&gt;

&lt;p&gt;بطور کل زمانیکه میخوایم حالت ها یا مقادیر مرتبط به یک کامپوننت رو بصورت داخلی ذخیره کنیم ، باید از هوک ()useState استفاده کنیم .&lt;/p&gt;

&lt;p&gt;اما اگه حالت یا وضعیتی که میخوایم ذخیره کنیم داخلی نیست ، باید از State Management هایی مثل Redux استفاده کنیم. ( داخلی نیست یعنی از یه state تو کل اپیکیشن و کامپوننت های مختلف استفاده کنیم )&lt;br&gt;
چطور از ()useState استفاده کنیم ؟&lt;/p&gt;

&lt;p&gt;برای استفاده از این هوک خفن باید اون رو import کنیم ( فراخوانی کنیم ) :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;import React, { useState } from 'react';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;چه زمانی باید از ()React.useState استفاده کنیم ؟&lt;/p&gt;

&lt;p&gt;بطور کل زمانیکه میخوایم حالت ها یا مقادیر مرتبط به یک کامپوننت رو بصورت داخلی ذخیره کنیم ، باید از هوک ()useState استفاده کنیم .&lt;/p&gt;

&lt;p&gt;اما اگه حالت یا وضعیتی که میخوایم ذخیره کنیم داخلی نیست ، باید از State Management هایی مثل Redux استفاده کنیم. ( داخلی نیست یعنی از یه state تو کل اپیکیشن و کامپوننت های مختلف استفاده کنیم )&lt;br&gt;
چطور از ()useState استفاده کنیم ؟&lt;/p&gt;

&lt;p&gt;برای استفاده از این هوک خفن باید اون رو import کنیم ( فراخوانی کنیم ) :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;import React, { useState } from 'react';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;مقدار اولیه useState یا همون initialState چیه ؟&lt;/p&gt;

&lt;p&gt;همونطور که قبلا هم گفتیم ، موقع استفاده از هوک useState باید یک مقدار اولیه بهش بدیم .&lt;/p&gt;

&lt;p&gt;اما یه جاهایی از مقدار اولیه خبر نداریم !!&lt;/p&gt;

&lt;p&gt;مثلا قراره از یک API ، مقداری رو بگیرید و داخل state بعنوان initialState قرار بدید . و خب چون نمیدونیم مقداری که اون API میخواد برگردونه چیه و چقدر زمان میبره ، نمیتونیم موقع تعریف بهش مقداری رو به عنوان مقدار اولیه بدیم .&lt;/p&gt;

&lt;p&gt;در اینجا از تکنیکی به عنوان Lazily Initialize استفاده میکنیم .&lt;/p&gt;

&lt;p&gt;در واقع Lazily Initialize مواقعی کاربرد داره که مقدار اولیه ما با تاخیر باید Initialize ( مقدار دهی اولیه ) بشه .&lt;/p&gt;

&lt;p&gt;تو مثال زیر از useState استفاده کردیم اما بعنوان مقدار اولیه ، یک Function بهش دادیم :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const userDetail= () =&amp;gt; {&lt;br&gt;
   const [state,setState] = useState( () =&amp;gt; myApiCallFunction() );&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;تو مثال بالا یه نکته مهم وجود داره ، اینکه مقدار اولیه ای که با تکنیک Lazily Initialize قرار دادیم ، فقط در render اولیه قرار میگیره.&lt;/p&gt;

&lt;p&gt;بروزرسانی State با setState در ری اکت !&lt;/p&gt;

&lt;p&gt;هوک useState از ما 2 آرگومان میگیره . مقدار اول برای خواندن مقدار اون state و مقدار دوم یک تابع برای بروزرسانی مقدار اون state هست .&lt;/p&gt;

&lt;p&gt;تو مثال زیر یک کامپوننت به اسم User داریم و قراره نام کاربر رو داخل یک State به نام name ذخیره کنیم . دقت کنید که این مقدار توسط یک Input از خود کاربر دریافت میشه و توسط onChange داخل state قرار میگیره .&lt;/p&gt;

&lt;p&gt;بروزرسانی State با setState در ری اکت !&lt;/p&gt;

&lt;p&gt;هوک useState از ما 2 آرگومان میگیره . مقدار اول برای خواندن مقدار اون state و مقدار دوم یک تابع برای بروزرسانی مقدار اون state هست .&lt;/p&gt;

&lt;p&gt;تو مثال زیر یک کامپوننت به اسم User داریم و قراره نام کاربر رو داخل یک State به نام name ذخیره کنیم . دقت کنید که این مقدار توسط یک Input از خود کاربر دریافت میشه و توسط onChange داخل state قرار میگیره .&lt;/p&gt;

&lt;p&gt;`const User = () =&amp;gt; {&lt;br&gt;
  const [name,setName] = useState('');&lt;/p&gt;

&lt;p&gt;return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
      
         type="text"&lt;br&gt;
         value={name}&lt;br&gt;
          onChange={e =&amp;gt; setName(e.target.value)}&lt;br&gt;
          placeholder="نام خودتون رو وارد کنید"&lt;br&gt;
       /&amp;gt;&lt;br&gt;
      &lt;p&gt;&lt;br&gt;
        &lt;strong&gt;میباشد.{name}نام شما&lt;/strong&gt;&lt;br&gt;
      &lt;/p&gt;
&lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
}; //`

&lt;p&gt;گاهی اوغات نیاز میشه که state خودمون رو با توجه به مقدار قبلی اون state بروزرسانی کنیم .&lt;/p&gt;

&lt;p&gt;مثلا میخوایم با هربار کلیک روی دکمه ، مقدار state به علاوه 1 بشه . انجام اینکار مستلزم بررسی مقدار قبلی state هست .&lt;/p&gt;

&lt;p&gt;تو مثال زیر همون مثال بالایی رو اوردیم ، با این تفاوت که قراره با توجه به مقدار قبلی state ، عملیات setState رو انجام بدیم :&lt;/p&gt;

&lt;p&gt;`const User = () =&amp;gt; {&lt;br&gt;
  const [name,setName] = useState('');&lt;/p&gt;

&lt;p&gt;return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
      
         type="text"&lt;br&gt;
         value={message}&lt;br&gt;
          onChange={(e)=&amp;gt;setName(prev=&amp;gt;prev+e.target.value)}&lt;br&gt;
          placeholder="نام خودتون رو وارد کنید"&lt;br&gt;
       /&amp;gt;&lt;br&gt;
      &lt;p&gt;&lt;br&gt;
        &lt;strong&gt;میباشد.{name}نام شما&lt;/strong&gt;&lt;br&gt;
      &lt;/p&gt;
&lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
}; //`
&lt;h2&gt;
  
  
  استفاده از هوک useState برای ذخیره کردن Object
&lt;/h2&gt;

&lt;p&gt;برای مطالعه ادامه این مقاله + تیکه کد ها و مثالهای بیشتر در وبسایت فِرانت اِندی روی لینک زیر کلیک کنید :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://frontendi.com/react-usestate/"&gt;useState در ریکت&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>هوک useMemo و بررسی تخصصی ()React.useMemo در ری اکت</title>
      <dc:creator>FrontEndi</dc:creator>
      <pubDate>Fri, 10 Nov 2023 18:10:30 +0000</pubDate>
      <link>https://dev.to/frontendi/hwkh-usememo-w-brrsy-tkhssy-reactusememo-dr-ry-kht-12p3</link>
      <guid>https://dev.to/frontendi/hwkh-usememo-w-brrsy-tkhssy-reactusememo-dr-ry-kht-12p3</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gfIav6_w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pvz7u9er5fv7u6rn7l1n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gfIav6_w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pvz7u9er5fv7u6rn7l1n.png" alt="Image description" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;زمانیکه نسخه 16.8 ری اکت منتشر شد یه عالمه هوک باحال بهش اضافه شد مثل هوک useMemo ! در حقیقت هوک useMemo ری اکت به بهینه سازی اپیکیشن ما و بهبود Performance پروژمون کمک میکنه.&lt;/p&gt;

&lt;p&gt;امروز میخوایم بصورت تخصصی هوک useMemo ری اکت رو بررسی کنیم و ببینیم که کجاها باید از این هوک استفاده کرد و چه جاهایی نباید ازش استفاده کرد!&lt;br&gt;
اصلا Memoization چی هست و چرا باید ازش استفاده کنیم ؟&lt;/p&gt;

&lt;p&gt;زمانیکه وضعیت / state یک کامپوننت تو ری اکت تغییر میکنه ، ری اکت اون کامپوننت و همه فرزندانش ( کامپوننت های فرزند ) رو re-Render میکنه.&lt;/p&gt;

&lt;p&gt;گاهی اوغات ممکنه کامپوننت فرزند هیچ تغییری نکرده باشه ولی به این دلیل که کامپوننت پدر تغییر حالتی داشته ، ری اکت کامپوننت پدر و تمامی کامپوننت های فرزند رو re-Render میکنه ( بدون توجه به اینکه کامپوننت های فرزند بدون تغییر بودن ) &lt;/p&gt;

&lt;p&gt;چنین re-Render های بیهوده ای قطعا هزینه بر هستن و Performance اپیکیشن مارو کاهش میدن .&lt;/p&gt;

&lt;p&gt;به عنوان یک Front-End Enginner باید تمام تلاش خودمون رو بکنیم که یک اپیکیشن بهینه، با Performance عالی داشته باشیم .&lt;/p&gt;

&lt;p&gt;خود ری اکت برای حل این مشکل memo رو معرفی کرد . اگه با memo آشنایی ندارید حتما قبل از ادامه دادن این مقاله ، ابزار ()memo و بررسی تخصصی React.memo رو مطالعه کنید چون هوک useMemo بر پایه ابزار memo نوشته شده .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9YXaDFNg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ai8ae9vfbz785lq9dm40.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9YXaDFNg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ai8ae9vfbz785lq9dm40.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;هوک useMemo چیست ؟&lt;/p&gt;

&lt;p&gt;هوک useMemo در ری اکت  نتیجه یک تابع رو برای بار اول محاسبه میکنه و نتیجش رو داخل حافظش ذخیره میکنه.&lt;/p&gt;

&lt;p&gt;حالا تو re-Render های بعدی  ، اون تابع اجرا نمیشه و هیچگونه محاسبه جدیدی انجام نمیده و همون نتیجه ای که قبلا داخل حافظه ذخیره کرده بودیم رو  برمیگردونه ( تا زمانیکیه ورودی های تابع تغییر کنه )&lt;/p&gt;

&lt;p&gt;خب این فوق العادس 🙂 چرا ؟&lt;/p&gt;

&lt;p&gt;چون برخی تابع ها خیلی سنگین هستن و محاسبات پیچیده ای دارن. به کمک هوک ()useMemo میتونیم یکبار این تابع رو render کنیم و نتیجش رو داخل حافظه بسپریم. تو re-Render های بعدی دیگه این تابع محاسبه نمیشه و از همون نتیجه ای که داخل حافظه داریم استفاده میکنیم .&lt;br&gt;
با Memoization میتونی پروژت رو خیلی خیلی بهینه تر کنی !&lt;/p&gt;

&lt;p&gt;تکنیک Memoization به شما کمک میکنه Performance اپیکیشن خودتونو بشدت بهبود بدید.&lt;/p&gt;

&lt;p&gt;اما یه نکته خیلی مهم اینجا وجود داره :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4yRsdgey--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dj6fzrmj3zn8m3rlgbjx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4yRsdgey--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dj6fzrmj3zn8m3rlgbjx.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;از هوک ()useMemo فقط برای محاسبات سنگین و پیچیده استفاده کنید !&lt;/p&gt;

&lt;p&gt;از هوک useMemo فقط برای تابع هایی که محاسبات سنگین و پیچیده ای دارن استفاده کنید . فراموش نکنید که استفاده از هوک React.useMemo برای توابع ساده نتیجه عکس داره.&lt;/p&gt;

&lt;p&gt;در حقیقت خود useMemo داره یکسری محاسبات انجام میده و اگه از useMemo برای جاهایی که نیاز به Memoization نداریم استفاده کنیم ، در حقیقت کلی محاسبه اضافی به پروژمون اضافه کردیم .&lt;/p&gt;

&lt;p&gt;بطور مثال تو کامپوننت زیر از useMemo برای یک تابع خیلی ساده استفاده کردیم که اینجا اصلا نیازی به Memoization  نداریم !&lt;/p&gt;

&lt;p&gt;`const App({name, family}) {&lt;br&gt;
  const createFullName = useMemo(() =&amp;gt; {&lt;br&gt;
     return name+family&lt;br&gt;
  }, [name, family]) // اینجا مواردی  رو مشخص میکنیم که میخوایم درصورت تغییر مقدار ، تابع مجدد اجرا بشه&lt;/p&gt;

&lt;p&gt;return &lt;br&gt;
}`&lt;/p&gt;

&lt;p&gt;تو کامپوننت بالا ، تابع createFullName هزینه محاسباتی سنگینی نداره و نباید اینجا از useMemo استفاده میکردیم.&lt;/p&gt;

&lt;p&gt;اما اتفاقی که تو کامپوننت بالا میوفته این هست که نتیجه تابع createFullName یکبار محسابه میشه و تو حافظه ذخیره میشه و تا زمانی که name و family تغییری نکنن ، این تابع re-Render و محاسبه مجدد نخواهد شد.&lt;/p&gt;

&lt;p&gt;حالا بیاید به حالت ساده این کامپوننت نگاهی بندازیم :&lt;/p&gt;

&lt;p&gt;`const App({name, family}) {&lt;br&gt;
  const createFullName = ()=&amp;gt; {&lt;br&gt;
     return name+family&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return &lt;br&gt;
}`&lt;/p&gt;

&lt;p&gt;ما یه تابع رو به 2 صورت داریم . با useMemo و بدون useMemo !&lt;/p&gt;

&lt;p&gt;اما واقعا از کدوم باید استفاده کنیم ؟!&lt;/p&gt;

&lt;p&gt;پاسخ ساده به این سوال این هست که اگه محاسبه و نتیجه اون تابع ساده هست ، نیازی به useMemo ندارید اما اگه هزینه محاسباتی اون تابع بالاست ، بهتره که از useMemo استفاده کنید .&lt;/p&gt;

&lt;p&gt;همچنین همیشه به نتیجه اون تابع هم دقت کنید . اگه نتیجه اون تابع ( مقداری که return میشه ) از مقادیر ساده جاوااسکریپتی هست ( primitive ) پس نیازی به useMemo نیست ( نوع دیتا primitive مثل string , number , boolean , null ,undefind )&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b_qqglQw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tewvv6gypnyhsxk29foy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b_qqglQw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tewvv6gypnyhsxk29foy.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;نحوه استفاده از هوک ()useMemo&lt;/p&gt;

&lt;p&gt;کد زیر ، یک مثال خیلی ساده از نحوه استفاده از هوک ()useMemo در ری اکت هست :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const cachedValue = useMemo(function,dependencies)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;خود هوک useMemo ، دو مقدار اصلی از ما دریافت میکنه .&lt;/p&gt;

&lt;p&gt;مقدار اول یک تابع / Function هست و در حقیقت همون تابعی هست که هزینه محاسباتی بالایی داره و میخوایم از اجرای مجددش در هربار re-Render جلوگیری کنیم .&lt;/p&gt;

&lt;p&gt;مقدار دوم dependencies هست. تو بخش dependencies باید لیست متغیر هایی رو قرار بدیم که میخوایم با تغییر پیدا کردن مقدارشون ، تابع ما مجدد محاسبه بشه . ( با فرمت آرایه )&lt;/p&gt;

&lt;p&gt;نتیجه این function در متغیری به نام cashedValue ذخیره میشه که از اون میتونیم در هر کجا از اپیکیشن خودمون استفاده کنیم . نکته این هست که این تابع برای بار اول محاسبه میشه و مقدارش در cashedValue ذخیره میشه و تا زمانیه dependencies ها تغییر پیدا نکنن ، این تابع مجدد محاسبه نمیشه .&lt;/p&gt;

&lt;p&gt;اتفاقی که در re-Render های بعدی میوفته این هست که :&lt;/p&gt;

&lt;p&gt;ری اکت به dependencies های useMemo نگاه میکنه که ببینه آیا این dependencies ها نسبت به render قبلی فرق کردن یا نه ؟&lt;/p&gt;

&lt;p&gt;اگه تفاوتی نداشتن ، از همون مقدار memo شده ( به حافظه سپرده شده ) استفاده میکنه .&lt;/p&gt;

&lt;p&gt;اما اگه تفاوت داشتن ، مجدد اون تابع رو محاسبه میکنه.&lt;/p&gt;

&lt;h2&gt;
  
  
  تفاوت هوک useMemo با memo در ری اکت چیست ؟
&lt;/h2&gt;

&lt;p&gt;لطفا برای مطالعه ادامه این مقاله + تیکه کد ها و مثالهای بیشتر روی لینک زیر کلیک کنید : &lt;br&gt;
&lt;a href="https://frontendi.com/react-usememo-hook/"&gt;useMemo در ریکت&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ابزار ()memo و بررسی تخصصی React Memo !</title>
      <dc:creator>FrontEndi</dc:creator>
      <pubDate>Fri, 10 Nov 2023 18:07:13 +0000</pubDate>
      <link>https://dev.to/frontendi/bzr-memo-w-brrsy-tkhssy-react-memo--kea</link>
      <guid>https://dev.to/frontendi/bzr-memo-w-brrsy-tkhssy-react-memo--kea</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lysxS72v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3n14dv1zm76u1jh6ky4r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lysxS72v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3n14dv1zm76u1jh6ky4r.png" alt="Image description" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ابزار memo ری اکت یکی از مهمترین قابلیت هایی هست که تو بحث بهینه سازی میتونیم ازش استفاده کنیم.&lt;/p&gt;

&lt;p&gt;در حقیقت memo به ما اجازه میده از re-Render اضافی کامپوننت تا زمانیکه Props اون تغییری نکرده، جلوگیری کنیم.&lt;/p&gt;

&lt;p&gt;چه حسی از این بهتر که وقتی کاربر آدرس سایت شمارو میزنه کمتر از 100ms بتونه سایت رو ببینه ؟! و چه حسی بدتر از اینکه زمان Load سایت به 300ms برسه ؟&lt;/p&gt;

&lt;p&gt;قطعا نمیشه اهمیت بهینه سازی ( Performance ) تو وبسایت رو نادیده گرفت یا انکار کرد .&lt;/p&gt;

&lt;p&gt;اگه شماهم مثل من یه React Developer هستی باید با ابزار ()memo تو React خیلی خوب آشنا باشی و بدونی چطور باید ازش کمک بگیری تا بتونی Performance اپیکیشن خودت رو به حداکثر میزان ممکن برسونی 🙂&lt;/p&gt;

&lt;p&gt;چند روز پیش راجب Lazy Load تصاویر ری اکت صحبت کردیم که اونم در رابطه با Performance وبسایت های ری اکتی بود و امروز میخوایم بصورت تخصصی راجب ویژگی ()memo صحبت کنیم .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4GXZKt4M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dpj02ttgk0ro1wh3hv7f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4GXZKt4M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dpj02ttgk0ro1wh3hv7f.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;برای اینکه بدونیم ویژگی قابلیت memo چیه و چطور کار میکنه ، لازمه بدونیم دام مجازی ری اکت چطور کار میکنه . (مطالعه کنید : دام مجازی ری اکت )&lt;/p&gt;

&lt;p&gt;زمانی که حالت یکی از Element های DOM تغییر میکنه ، ری اکت اون تغییر رو render میکنه و با render قبل از تغییر مقایسه میکنه .&lt;/p&gt;

&lt;p&gt;اگه تو این مقایسه اِلِمانی تغییر کرده باشه ، Element تغییر پیدا کرده داخل  DOM بروزرسانی میشه .&lt;/p&gt;

&lt;p&gt;این اتفاق با سرعت خیلی زیادی رخ میده ، اما به کمک ابزار ()React.memo میتونیم این سرعت رو بیشتر هم بکنیم .&lt;/p&gt;

&lt;p&gt;اگر ما یک کامپوننت رو داخل ()memo بزاریم ، ری اکت اون کامپوننت رو render میکنه و نتیجه ی render رو به حافظش میسپاره !&lt;/p&gt;

&lt;p&gt;حالا اگه اون کامپوننت نیاز به re-Render داشته باشه ، ری اکت اول props های اون کامپوننت رو با props های اون کامپوننتی که تو حافظش ذخیره کرده چک میکنه.&lt;/p&gt;

&lt;p&gt;اگه props ها یکسان باشن ، ری اکت همون کامپوننتی که تو حافظش ذخیره کرده بوده رو نشون میده و دیگه re-Render صورت نمیگیره !&lt;/p&gt;

&lt;p&gt;اجازه بدید memo رو تو واقعیت ببینیم 🙂&lt;/p&gt;

&lt;p&gt;`export function Music({ title, description }) {&lt;br&gt;
  return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
      Music title: {title}&lt;br&gt;
      Desc: {description}&lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
}

&lt;p&gt;export const MemoizedMusic = React.memo(Music);`&lt;/p&gt;

&lt;p&gt;تو تیکه کد بالا ،  ما کامپوننت Music رو داخل ()React.memo قرار دادیم .&lt;/p&gt;

&lt;p&gt;اگه به خط 10 دقت کنید میبینید که React.memo(music) یک مقدار جدید Return کرده به اسم MemoizedMusic .&lt;/p&gt;

&lt;p&gt;در واقع خروجی کامپوننت MemoizedMusic  با خود کامپوننت Music کاملا یکسانه ! با این تفاوت که کامپوننت MemoizedMusic فقط یکبار render میشه و تا زمانی که props هاش تغییر نکنه ، re-Render نمیشه !&lt;/p&gt;

&lt;p&gt;اما کامپوننت Music هر بار render میشه ( فارغ از اینکه props های اون تغییر میکنه یا نه )&lt;/p&gt;

&lt;p&gt;`// اولین رندر =&amp;gt; این کامپوننت به حافظه ری اکت میره و ذخیره میشه&lt;br&gt;

  title="تنها در خانه"&lt;br&gt;
  description="فیلم خوبیه"&lt;br&gt;
/&amp;gt;&lt;/p&gt;

&lt;p&gt;// دومین رندر =&amp;gt; چون پراپس های این کامپوننت تغییر نکرده ، مجدد رندر نمیشه و از حافظه فراخوانی میشه&lt;br&gt;

  title="تنها در خانه"&lt;br&gt;
  description="فیلم خوبیه"&lt;br&gt;
/&amp;gt;`&lt;/p&gt;

&lt;p&gt;تو تیکه کد بالا ما 2 بار کامپوننت MemoizedMusic رو فراخوانی کردیم ولی فقط 1 بار render میشه .&lt;/p&gt;

&lt;p&gt;ری اکت دفعه اول که به این کامپوننت برمیخوره ، اون رو render میکنه و تو حافظه خودش نگه میداره.&lt;/p&gt;

&lt;p&gt;دفعه بعدی که همون کامپوننت رو فراخوانی کردیم ، چون props هاش تغییری نکردن ، پس مجدد رندر نمیکنه و فقط از حافظش همون رو فراخوانی میکنه .&lt;/p&gt;

&lt;p&gt;به همین سادگی شما میتونید کلی نقش مثبت تو  Performance اپیکیشن خودتون داشته باشید 🙂&lt;br&gt;
بررسی دستی یکسان بودن Props ها در memo&lt;/p&gt;

&lt;p&gt;علاوه بر اینکه ری اکت خودش میتونه اینکار رو بکنه ، شما میتونید خودتون یک Fumction اختصاصی بنویسید و اون رو به memo پاس بدید:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;React.memo(Component, [CheckPropsEqual(prevProps, nextProps)]);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;تو تیکه کد بالا ، خودمون یک کامپوننت CheckPropsEqual نوشتیم که دو Props به عنوان ورودی میگیره و چک میکنه که آیا Props ها یکسان هستند یا خیر .&lt;/p&gt;

&lt;p&gt;نتیجه باید boolean ( true/false ) باشه . نتیجه True به معنی مساوی بودن Props ها هست .&lt;/p&gt;

&lt;p&gt;چه زمانی از ()React.memo استفاده کنیم ؟&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uZXmz3jX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gh08xskqnrsnyw536h6e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uZXmz3jX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gh08xskqnrsnyw536h6e.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1 – جاهایی که فکر میکنید کامپوننت با Props های یکسان render میشه !&lt;/p&gt;

&lt;p&gt;یکی از بهترین جاهایی که میشه از react.memo استفاده کرد ،  کامپوننت هایی هستن که اغلب با Props های یکسان render میشن !&lt;/p&gt;

&lt;p&gt;بیاید یک سناریویی رو در نظر بگیریم که یک سایت مشاهده موزیک داریم که بصورت لحظه ای ، میزان نمایش دانلود موزیک رو به کاربر نشون میدیم . ( یعنی هر چند ثانیه یکبار به back-end درخواست میدیم و اطلاعات جدید رو میگیریم )&lt;/p&gt;

&lt;p&gt;&lt;code&gt;function MusicViewsRealtime({ title, releaseDate, views }) {&lt;br&gt;
  return (&lt;br&gt;
    &amp;lt;div&amp;gt;&lt;br&gt;
      &amp;lt;Music title={title} releaseDate={releaseDate} /&amp;gt;&lt;br&gt;
      Music Download: {views}&lt;br&gt;
    &amp;lt;/div&amp;gt;&lt;br&gt;
  );&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;اتفاقی که میوفته :&lt;/p&gt;

&lt;p&gt;`// بار اول&lt;br&gt;

  views={0}&lt;br&gt;
  title="Forrest Gump"&lt;br&gt;
  releaseDate="June 23, 1994"&lt;br&gt;
/&amp;gt;&lt;/p&gt;

&lt;p&gt;//بعد چند ثانیه ، بازدید ده&lt;br&gt;

  views={10}&lt;br&gt;
  title="Forrest Gump"&lt;br&gt;
  releaseDate="June 23, 1994"&lt;br&gt;
/&amp;gt;&lt;/p&gt;

&lt;p&gt;// بعد چند ثانیه ، بازدید بیست و پنج&lt;br&gt;

  views={25}&lt;br&gt;
  title="Forrest Gump"&lt;br&gt;
  releaseDate="June 23, 1994"&lt;br&gt;
/&amp;gt;&lt;/p&gt;

&lt;p&gt;// ادامه .. .`&lt;/p&gt;

&lt;p&gt;اتفاقی که میوفته این هست که مقدار views هر چند ثانیه یکبار داره آپدیت میشه و کامپوننت MusicViewsRealtime هر بار re-Render میشه . که باعث میشه کامپوننت Music هم re-Render بشه ( درصورتی که کامپوننت Music  هیچ تغییری نداشته ! )&lt;/p&gt;

&lt;p&gt;در حقیقت props های کامپوننت Music هیچ تغییری نکردن ، ولی هر دفعه داره re-Render براش رخ میده .&lt;/p&gt;

&lt;p&gt;اینجا همون جاییه که باید از React.memo استفاده کنیم :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;function MusicViewsRealtime({ title, releaseDate, views }) {&lt;br&gt;
  return (&lt;br&gt;
    &amp;lt;div&amp;gt;&lt;br&gt;
      &amp;lt;MemoizedMusic title={title} releaseDate={releaseDate} /&amp;gt;&lt;br&gt;
      Music Download: {views}&lt;br&gt;
    &amp;lt;/div&amp;gt;&lt;br&gt;
  );&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;با memo کردن کامپوننت Music ، دیگه هر  چند ثانیه یکبار re-Render نمیشه چون Props های اون تغییری نمیکنه.&lt;br&gt;
چه زمانی از ()React.memo  استفاده نکنیم ؟&lt;/p&gt;

&lt;p&gt;اگه کامپوننت شما معمولا با Props های مختلف render میشه یا خیلی سبکه ، نیازی به استفاده از memo ری اکت ندارید .&lt;/p&gt;

&lt;p&gt;چطور استفاده اشتباه از memo باعث کاهش Performance اپیکیشن میشه ؟&lt;/p&gt;

&lt;p&gt;فرض کنید یک کامپوننتی رو به memo دادید که همیشه Props های متفاوتی داره .&lt;/p&gt;

&lt;p&gt;با انجام اینکار ، ری اکت هربار که Props های این کامپوننت رو با نسخه کش شده بررسی میکنه ،همیشه به false میرسه ( یعنی Props ها متفاوت هستن ! )&lt;/p&gt;

&lt;p&gt;و خب اینجا یعنی ری اکت یک مرحله مقایسه اضافه انجام داده که خودش باعث کاهش Performance اپیکیشن میشه .&lt;/p&gt;

&lt;p&gt;نه تنها هیچ مزیتی بدست نمیارید ، کلی قضیه رو پیچیده تر هم میکنید !&lt;/p&gt;

&lt;h2&gt;
  
  
  Memo در ری اکت
&lt;/h2&gt;

&lt;p&gt;لطفا برای مطالعه ادامه این مقاله + تیکه کد و مثالهای بیشتر روی لینک زیر کلیک کنید : &lt;br&gt;
&lt;a href="https://frontendi.com/react-memo/"&gt;memo در ریکت&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>هوک useContext ری اکت و بررسی تخصصی Context API ری اکت !</title>
      <dc:creator>FrontEndi</dc:creator>
      <pubDate>Sat, 16 Sep 2023 13:14:38 +0000</pubDate>
      <link>https://dev.to/frontendi/hwkh-usecontext-ry-kht-w-brrsy-tkhssy-context-api-ry-kht--1j07</link>
      <guid>https://dev.to/frontendi/hwkh-usecontext-ry-kht-w-brrsy-tkhssy-context-api-ry-kht--1j07</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KHlQxl8B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7anjqtj9ezz422kbfkvf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KHlQxl8B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7anjqtj9ezz422kbfkvf.png" alt="Image description" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;هوک useContext ری اکت ، یکی از مهمترین و پرکاربرد ترین هوک هایی هست که هر ری اکت دِوِلوپری باید درک عمیقی نسبت بهش داشته باشه 🙂&lt;/p&gt;

&lt;p&gt;پس آماده باشید که بریم تخصصی Context Api ری اکت رو بررسی کنیم …&lt;br&gt;
هوک useContext چیست ؟&lt;/p&gt;

&lt;p&gt;قبل از هر صحبتی ، بهتره ببینیم خود React چه تعریفی از این هوک داره :&lt;br&gt;
 هوک useContext ری اکت ، یک روش برای انتقال داده ها بین کامپوننت های مختلف اپیکیشن، بدون استفاده از Props هست . &lt;/p&gt;

&lt;p&gt;انتقال داده تو ری اکت بین کامپوننت های مختلف به 2 روش انجام میشه :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p4eY-xbj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xzlk3qjwang52cplhp5r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p4eY-xbj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xzlk3qjwang52cplhp5r.png" alt="Image description" width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;به تصویر بالا دقت کنید . . .&lt;br&gt;
انتقال داده به روش React Props&lt;/p&gt;

&lt;p&gt;تو این روش اگر نیاز باشه که دیتایی رو از کامپوننت 1 به کامپوننت 4 انتقال بدیم باید مراحل زیر رو طی کنیم :&lt;/p&gt;

&lt;p&gt;انتقال Data از کامپوننت 1 به 2&lt;/p&gt;

&lt;p&gt;انتقال Data از کامپوننت 2 به 3&lt;/p&gt;

&lt;p&gt;انتقال Data از کامپوننت 3 به 4&lt;/p&gt;

&lt;p&gt;بزرگترین مشکلی که تو این روش داریم ، اینه که دیتای ما داره به کامپوننت هایی ارسال میشه که تو اون کامپوننت ها اصلا به اون دیتا ها نیاز نداریم !!&lt;/p&gt;

&lt;p&gt;در واقع تو کامپوننت 2 ما نیازی به اون دیتا ها نداریم ولی برای اینکه بتونیم دیتای خودمون رو به کامپوننت شماره 4 برسونیم ، باید از کامپوننت شماره 2 و 3 هم عبورشون بدیم .&lt;/p&gt;

&lt;p&gt;حالا فرض کنید تعداد کامپوننت های درخت ما 20 تا باشه و بخوایم یه دیتایی رو از کامپوننت 1 به آخرین فرزند این درخت ( کامپوننت 20 ) بفرستیم ، اینجوری باید اون Data رو از طریق تک تک Component ها انتقال بدیم .&lt;/p&gt;

&lt;p&gt;به اینکار میگن Props Drilling و اصلا اصلا پیشنهاد نمیشه !&lt;/p&gt;

&lt;p&gt;اما خبر خوب اینه که یه روش بهتری برای اینجور وقتا داریم به اسم Context یا همون useContext 🙂&lt;/p&gt;

&lt;h2&gt;
  
  
  انتقال داده به روش React Context
&lt;/h2&gt;

&lt;p&gt;اگه به تصویر بالا دقت کنید ، یک Context ساختیم که نقش منبع دیتا رو ایفا میکنه .&lt;/p&gt;

&lt;p&gt;حالا از تمامی کامپوننت هایی که داریم ، میتونیم به این منبع Data بصورت مستقیم دسترسی داشته باشیم .&lt;/p&gt;

&lt;p&gt;دیگه اینجا مشکل Props Drilling نداریم !&lt;/p&gt;

&lt;p&gt;خیلی راحت از کامپوننت شماره 4 به Data مورد نیاز دسترسی پیدا کردیم، بدون اینکه اون Data رو وارد کامپوننت های دیگه بکنیم .&lt;/p&gt;

&lt;p&gt;در حقیقت React Context یک روش انتقال داده بین کامپوننت های مختلف اپیکیشن شماست بدون توجه به عمق اون Component !&lt;br&gt;
موارد استفاده از Context Api کدامند ؟&lt;/p&gt;

&lt;p&gt;از Context در ری اکت برای به اشتراک گذاری دیتا های Global مثل تنظیمات کاربر ، تم ( دارک مود و لایت مود ) و … میشه استفاده کرد.&lt;/p&gt;

&lt;p&gt;ایده اصلی Context این هست که به ما اجازه میده یک مقدار رو بین کامپوننت های مختلف به اشتراک بزاریم و هر زمان این مقدار تغییر کرد ، اون کامپوننتی که از مقدارمون استفاده کرده بوده ، مجدد رندر بشه .&lt;/p&gt;

&lt;p&gt;در حقیقت بهتره بگیم از Context برای به اشتراک گذاری State هایی استفاده میکنیم که میخوایم تو بخش های مختلف اپیکیشن در دسترس باشن .&lt;/p&gt;

&lt;p&gt;مواردی مثل :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;تم سایت ( دارک مود / لایت مود )
تنظیمات سایت
نام و اطلاعات کاربر احراز شده ( وارد شده )
تنظیمات کاربر
زبان سایت ( سایت های 2 زبانه )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--36toVlAz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gwq3yf3xkfeowsl0o904.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--36toVlAz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gwq3yf3xkfeowsl0o904.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  چطور از Context ری اکت استفاده کنیم ؟
&lt;/h2&gt;

&lt;p&gt;برای استفاده از Context در React باید 3 مرحله انجام داد :&lt;/p&gt;

&lt;p&gt;مرحله 1 – Create Context&lt;/p&gt;

&lt;p&gt;برای اینکه یک Context بسازید ، میتونید از تابع داخلی خود ری اکت برای انجام اینکار استفاده کنید.&lt;/p&gt;

&lt;p&gt;در واقع خود React یک تابع در اختیار ما گذاشته به نام createContext که بصورت زیر میتونیم ازش استفاده کنیم .&lt;/p&gt;

&lt;p&gt;تابع createContext یک ورودی اختیاری از ما میگیره که میتونیم این مقدار رو هم بهش ندیم.&lt;/p&gt;

&lt;p&gt;i`mport { createContext } from 'react'; // تابع خود ری اکت برای ساخت کانتکست&lt;/p&gt;

&lt;p&gt;export const Context = createContext('یه مقداری');`&lt;/p&gt;

&lt;p&gt;مرحله 2 – Providing The Context ( دسترسی دادن به مقدار Context )&lt;/p&gt;

&lt;p&gt;برای اینکه بتونید از State یا مقدار ذخیره شده تو Context در کل اپیکیشن/کامپوننت ها استفاده کنید ، باید اون state/مقدار رو به کامپوننت های خودتون ارائه بدید ( Provide کنید ) .&lt;/p&gt;

&lt;p&gt;به تیکه کد زیر دقت کنید تا توضیح رو هم بگم :&lt;/p&gt;

&lt;p&gt;`import { Context } from './context'; // این همون کانتکستی هست که در تیکه کد قبلی ساختیمش&lt;/p&gt;

&lt;p&gt;function App() {&lt;br&gt;
  const value = 'مقداری که میخوایم تو اپیکیشن ازش استفاده کنیم';&lt;br&gt;
  return (&lt;br&gt;
    &lt;br&gt;
      &lt;br&gt;
    &lt;br&gt;
  );`&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;تو تیکه کد بالا ، ابتدا Contextی که ساخته بودیم رو import کردیم داخل روت پروژه ( فایل App.js )&lt;/p&gt;

&lt;p&gt;داخل متغیر value مقداری رو مینویسیم که میخوایم تو کل اپیکیشن بهش دسترسی داشته باشیم مثل تنظیمات کاربر / حالت Theme ( دارک مود/لایت مود) و ..&lt;/p&gt;

&lt;p&gt;حالا کل اپیکیشن رو به عنوان Children به Context.Provider میدیم . ( مطابق خط 6 )&lt;/p&gt;

&lt;p&gt;در واقع تمامی کامپوننت هایی به  مقدار value دسترسی دارن ( مقدار خط 4 ) که به عنوان فرزند Context.Provider قرار گرفتن . ( تو این مثال، کامپوننت MyComponent و تمامی فرزندانش به مقدار value دسترسی دارن )&lt;/p&gt;

&lt;p&gt;برای مطالعه نسخه کامل و راستچین مقاله لطفا روی لینک زیر کلیک کنید :&lt;br&gt;
&lt;a href="https://frontendi.com/usecontext-react/"&gt;useContext در ری اکت&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>usecontext</category>
    </item>
    <item>
      <title>دام مجازی ری اکت و بررسی تخصصی Virtual DOM ری اکت</title>
      <dc:creator>FrontEndi</dc:creator>
      <pubDate>Sat, 16 Sep 2023 13:10:14 +0000</pubDate>
      <link>https://dev.to/frontendi/dm-mjzy-ry-kht-w-brrsy-tkhssy-virtual-dom-ry-kht-49i2</link>
      <guid>https://dev.to/frontendi/dm-mjzy-ry-kht-w-brrsy-tkhssy-virtual-dom-ry-kht-49i2</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IUHQ7OO---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8e2epjlqcvolu2xps538.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IUHQ7OO---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8e2epjlqcvolu2xps538.png" alt="Image description" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;اگه شماهم یک React Developer تازه وارد هستید یا چندسال سابقه کار دارید ، ممکنه یک دید کلی از دام مجازی ری اکت ( React Virtual Dom ) داشته باشید ولی این کافی نیست !&lt;/p&gt;

&lt;p&gt;حقیقتا به عنوان یک Front End Enginner باید درک عمیقی از React داشته باشید . از اونجاییکه دام مجازی یکی از مهمترین مباحث ری اکت هست ، لازم هست یکبار برای همیشه بدونیم که دام مجازی ری اکت چیه و چطور کار میکنه ؟&lt;/p&gt;

&lt;p&gt;پس با فِرانت اِندی همراه باشید تا بصورت تخصصی بررسیش کنیم 🙂&lt;/p&gt;

&lt;p&gt;قبل از بررسی تخصصی Virtual DOM ، بهتره بریم سراغ خود DOM و ببینیم DOM چیه .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MxKHCVqo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w7navkwxnj3safzupkfh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MxKHCVqo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w7navkwxnj3safzupkfh.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DOM چیست ؟&lt;/p&gt;

&lt;p&gt;دام مخفف عبارت Document Object Model هست . در واقع DOM نشان دهنده UI ( ظاهر ) وبسایت شماست و هربار که تغییری در سایت اعمال میشه ، DOM یکبار بروزرسانی میشه.&lt;/p&gt;

&lt;p&gt;در حقیقت DOM یک ساختار درختی از تمامی Element ها و تگ های موجود در صفحه وب شماست.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uImhnyZL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5jible49pyxtq9hdrrhr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uImhnyZL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5jible49pyxtq9hdrrhr.png" alt="Image description" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;به تصویر بالا دقت کنید .&lt;/p&gt;

&lt;p&gt;کد سمت چپ ، کد Html صفحه شماست که به DOM سمت راست تبدیل شده . در واقع DOM یک ساختار درختی شکل از اجرای صفحه شما ( تگ ها ) میسازه .&lt;br&gt;
یک مثال واقعی از DOM برای درک نقطه ضعف آن&lt;/p&gt;

&lt;p&gt;فرض کنید داخل صفحه ای از سایتتون یک لیست 10 عددی از اطلاعات کاربران خودتون دارید و قصد دارید فقط اطلاعات کاربر اول رو ویرایش کنید .&lt;/p&gt;

&lt;p&gt;پس از ویرایش اطلاعات کاربر اول ، تمام لیست 10 عددی در DOM بروزرسانی میشه !&lt;/p&gt;

&lt;p&gt;و این اصلا خوب نیست !! چون شما فقط یک مورد رو ویرایش کردید و توقع دارید فقط همون کاربر در DOM بروزرسانی بشه اما تمامی لیست ( 10 کاربر ) بروزرسانی میشن !&lt;/p&gt;

&lt;p&gt;این یعنی 9 برابر زمان بیشتر و بیهوده برای بروزرسانی UI !&lt;/p&gt;

&lt;p&gt;اینجاست که ارزش واقعی Virtual DOM ری اکت ، به چشم میاد. دام مجازی ری اکت مشکلات DOM رو نداره و performance و سرعت فوق العاده ای داره.&lt;/p&gt;

&lt;h2&gt;
  
  
  دام مجازی ری اکت چیست ؟
&lt;/h2&gt;

&lt;p&gt;بطور خلاصه و ساده Virtual DOM یک نسخه مجازی و کوچک شده از DOM اصلی وبسایت شماست که React از اون برای اعمال سریع تغییرات روی سایت استفاده میکنه.&lt;/p&gt;

&lt;p&gt;انجام اینکار باعث میشه که فقط همان اِلِمانی که تغییر داشته ، در UI بروزرسانی بشه .&lt;/p&gt;

&lt;p&gt;دام مجازی همانطور که از اسمش هم پیداست ، یک نسخه مجازی از DOM واقعیه .&lt;/p&gt;

&lt;p&gt;هربار که چیزی ( اِلِمانی ) در وبسایت ما تغییر میکنه ، بجای اینکه DOM اصلی بروزرسانی بشه ، دام مجازی بروزرسانی میشه .&lt;/p&gt;

&lt;p&gt;سالها پیش ( که هنوز کتابخانه های جاوااسکریپتی مثل ری اکت و انگولار وجود نداشتن ) چیزی به اسم Virtual DOM هم وجود نداشت. &lt;/p&gt;

&lt;p&gt;اگه هنوز هم سری به سایتهای قدیمی بندازید میبینید هربار که سایت تغییری میکنه ( مثلا از صفحه ای به صفحه دیگر میرید ) کل صفحه Refresh میشه .&lt;/p&gt;

&lt;p&gt;یا مثلا زمانیکه محصولی رو به سبد خرید خودتون اضافه میکنید ، بلافاصله کل صفحه Refresh میشه !&lt;/p&gt;

&lt;p&gt;این اتفاق به این دلیل میوفته که مستقیما DOM داره بروزرسانی میشه . اما توی React به لطف وجود داشتن دام مجازی ، دیگه Refresh شدنی صورت نمیگیره . چون دام مجازی داره تغییر میکنه.&lt;/p&gt;

&lt;p&gt;در React ، به ازای هر Element در DOM واقعی ، یک Element در دام مجازی وجود دارد . ( یعنی در ازای هر div در DOM ، یک div با همان خصوصیات و ویژگی ها در دام مجازی وجود دارد )&lt;/p&gt;

&lt;p&gt;دام مجازی ( Virtual DOM ) یک مفهوم برنامه نویسیه که در آن یک نمایش مجازی از UI تو حافظه نگهداری میشه . همگام سازی این دام مجازی با دام واقعی تو ری اکت توسط کتابخونه ReactDOM انجام میشه . به این فرآیند در برنامه نویسی reconciliation میگیم . &lt;/p&gt;

&lt;h2&gt;
  
  
  تفاوت بروزرسانی DOM با VDOM ( دام مجازی )
&lt;/h2&gt;

&lt;p&gt;بروزرسانی DOM خیلی کند و زمانبره اما در عوض بروزرسانی VDOM ( دام مجازی ) خیلی سریعتره !&lt;/p&gt;

&lt;p&gt;چون در دام مجازی چیزی در صفحه ، نمایش داده نمیشه .&lt;/p&gt;

&lt;h2&gt;
  
  
  چرا Virtual DOM سریعتر است ؟
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4bvN2UTA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iduynagy72qxiga6ckoe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4bvN2UTA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iduynagy72qxiga6ckoe.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;اینکه فقط بدونیم Virtual DOM از DOM سریعتره ، حقیقتا کافی نیست !&lt;/p&gt;

&lt;p&gt;به عنوان یک Front-End Enginner باید دلیل سریعتر بودن دام مجازی رو بدونیم .&lt;/p&gt;

&lt;p&gt;زمانیکه یک Element به UI وبسایت اضافه میشه ، بلافاصله یک دام مجازی ایجاد میشه ( با ساختار درختی که تصویرش بالاتر موجوده  ).&lt;/p&gt;

&lt;p&gt;به محض تغییر در خصوصیات یا حالات هرکدوم از این Element ها ، یک دام مجازی دیگه ایجاد میشه .&lt;/p&gt;

&lt;p&gt;در این مرحله VDOM اول با VDOM دوم مقایسه میشه.&lt;/p&gt;

&lt;p&gt;بعد از این مقایسه ، مشخص میشه که چه Element هایی تغییر داشتن و باید توی UI هم تغییر کنن .&lt;/p&gt;

&lt;p&gt;در این مرحله دام مجازی بهترین و مناسبترین روش برای اعمال این تغییرات به DOM اصلی رو پیدا میکنه و اون تغییرات رو به DOM واقعی اضافه میکنه.&lt;/p&gt;

&lt;p&gt;انجام اینکار باعث میشه که کمترین زمان و هزینه برای بروزرسانی DOM صورت بگیره .&lt;/p&gt;

&lt;p&gt;توی تصویر زیر میتونید عملیات مقایسه دام مجازی 1 با دام مجازی 2 رو ببینید :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ypr-n-eh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/49hnatwlz78sjty2i1fv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ypr-n-eh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/49hnatwlz78sjty2i1fv.png" alt="Image description" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;به تصویر بالا دقت کنید .&lt;/p&gt;

&lt;p&gt;3 دام مجازی در این پروسه مشخص شده . دایره های آبی رنگ Element هایی هستند که در UI به کاربر نشان میدهیم .&lt;/p&gt;

&lt;p&gt;دایره های سبز رنگ ، Element هایی هستن که تغییر وضعیت داشتن .&lt;/p&gt;

&lt;p&gt;زمانیکه وضعیت یک Element تغییر میکنه ، بلافاصله یک VDOM ساخته میشه و بصورت کامل با VDOM قبلی مقایسه میشه .&lt;/p&gt;

&lt;p&gt;نتیجه مقایسه VDOM اول ( دام قبلی ) با VDOM دوم ( دام فعلی ) یک VDOM جدید هست که وارد DOM واقعی میشه.&lt;/p&gt;

&lt;p&gt;تا به اینجای کار باید درک درستی از نحوه کار Virtual Dom و تفاوتش با DOM بدست اورده باشید . &lt;/p&gt;

&lt;p&gt;حالا وقتشه که بریم ببینیم ری اکت چطور از دام مجازی استفاده میکنه ؟&lt;/p&gt;

&lt;p&gt;ری اکت چطور از Virtual DOM ( دام مجازی ) استفاده میکند ؟&lt;/p&gt;

&lt;p&gt;ری اکت طی چند مرحله از دام مجازی استفاده میکند .&lt;/p&gt;

&lt;p&gt;1 – ری اکت منتظر میمونه تا یک State تغییر پیدا کنه ( تغییر حالت یک Element )&lt;/p&gt;

&lt;p&gt;در کتابخانه ری اکت به هر تیکه کد یک Component ( کامپوننت ) میگیم که هر کامپوننت یک یا چند State ( حالت ) داره .&lt;/p&gt;

&lt;p&gt;زمانیکه State ( حالت ) یک کامپوننت تغییر میکنه ، ری اکت دام مجازی رو بروزرسانی میکنه. پس از بروزرسانی دام مجازی ، ری اکت نسخه قبلی VDOM را با نسخه فعلی VDOM مقایسه میکنه .&lt;/p&gt;

&lt;p&gt;به این فرآیند diffing میگوییم .&lt;/p&gt;

&lt;p&gt;پس از این مرحله ، حالا دیگه React میدونه که کدام Element ها تغییر حالت داشتن و فقط همان Element ها رو در DOM واقعی بروزرسانی میکنه.&lt;/p&gt;

&lt;p&gt;انجام این پروسه در مقایسه با دستکاری مستقیم DOM ، بسیار کم هزینه تر و در مدت زمان کمتری صورت میپذیره .&lt;/p&gt;

&lt;p&gt;همین عملکرد فوق العاده هست که React رو با سایر رقبای خودش مثل جی کوئری ، وردپرس و .. متمایز میکنه.&lt;br&gt;
2- ری اکت تغییرات نهایی رو به DOM بصورت گروهی ارسال میکنه !&lt;/p&gt;

&lt;p&gt;بروزرسانی DOM ، یکی از پرهزینه ترین مراحل تغییر حالت ( state ) اپیکیشن وب هست .&lt;/p&gt;

&lt;p&gt;حالا فرض کنید به ازای هر تغییر کوچک ، ری اکت یک درخواست به DOM واقعی بابت بروزرسانی DOM بده !&lt;/p&gt;

&lt;p&gt;اما خداروشکر اینطور نیست :/&lt;/p&gt;

&lt;p&gt;ری اکت تضمین میکنه که تغییرات نهایی رو به DOM بصورت گروهی ارسال میکنه تا کمترین درخواست ممکن رو به DOM بابت بروزرسانی بده .&lt;br&gt;
3- ری اکت از یک الگوریتم موثر برای پیدا کردن تغییر حالت ها استفاده میکنه ! ( شناسایی تغییر حالت Elements )&lt;/p&gt;

&lt;p&gt;ری اکت برای اینکه بتونه تغییر حالات ( تغییر state ها ) رو تشخیص بده از یک الگوریتم اکتشافی با 2 خصوصیت زیر استفاده میکنه :&lt;/p&gt;

&lt;p&gt;ذو Element با Type ( نوع ) متفاوت که درخت های مختلفی تولید میکنن.&lt;/p&gt;

&lt;p&gt;خود React Developer مشخص کنه که کدام Element باید در تمامی re-Render ها در دسترس باشه . ( توسط ویژگی key )&lt;/p&gt;

&lt;p&gt;برای مطالعه نسخه کامل و راستچین مقاله لطفا روی لینک زیر کلیک کنید :&lt;br&gt;
&lt;a href="https://frontendi.com/virtual-dom-react/"&gt;Virtual Dom در ری اکت&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>virtualdom</category>
    </item>
    <item>
      <title>همه چیز در مورد Fragment در React !</title>
      <dc:creator>FrontEndi</dc:creator>
      <pubDate>Sat, 16 Sep 2023 13:04:53 +0000</pubDate>
      <link>https://dev.to/frontendi/hmh-chyz-dr-mwrd-fragment-dr-react--59j8</link>
      <guid>https://dev.to/frontendi/hmh-chyz-dr-mwrd-fragment-dr-react--59j8</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qg436ei7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kgom99coy31q2yb3e184.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qg436ei7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kgom99coy31q2yb3e184.png" alt="Image description" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;زمانیکه نسخه 16.2.0 ری اکت منتشر شد ، یک ویژگی جدید به اون اضافه شد به اسم React Fragment !&lt;/p&gt;

&lt;p&gt;داستان انتشار Fragment در ری اکت، مثل داستان Strict Mode داستان یک مشکل بود که React Developer ها با اون درگیر بودن .&lt;/p&gt;

&lt;p&gt;در حقیقت Fragment در ری اکت یکی از اون موضوعاتی هست که کمتر کسی تو React بهش توجه میکنه اما تو این مقاله میخوایم بصورت تخصصی React.Fragment رو بررسی کنیم.&lt;/p&gt;

&lt;h2&gt;
  
  
  دلیل استفاده از Fragment در ری اکت چیست ؟
&lt;/h2&gt;

&lt;p&gt;کامپوننت هایی که در React ایجاد میکنیم از این 2 حالت خارج نیستند :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;کامپوننت ما یک  Element  برمیگرداند ( Return میکند )
کامپوننت ما دو یا چند Element  برمیگرداند ( Return میکند )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;در ری اکت ، اگر قصد داشته باشیم 2 یا چند  Element برگردانیم ( Return کنیم ) باید تمامی آنها را داخل یک Element مثل div قرار دهیم .&lt;/p&gt;

&lt;h2&gt;
  
  
  ویژگی React.Fragment چیست ؟
&lt;/h2&gt;

&lt;p&gt;قابلیت React Fragment به ما اجازه میدهد که چندین Element را از درون یک کامپوننت Return کنیم ( برگردانیم ).&lt;/p&gt;

&lt;p&gt;ویژگی Fragment تمامی Element های درون خود را بصورت یک گروه در می آورد و آنرا Return میکند.&lt;/p&gt;

&lt;p&gt;تا قبل از معرفی این ویژگی ، React Developer ها از div برای گروه بندی Element های یک کامپوننت استفاده میکردند که معایب بسیاری بهمراه داشت .&lt;/p&gt;

&lt;p&gt;به مثال زیر توجه کنید :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const App = () =&amp;gt; {&lt;br&gt;
  return (&lt;br&gt;
  &amp;lt;Fragment&amp;gt; // من دور اِلِمان ها پیچیده شدم&lt;br&gt;
    &amp;lt;h1&amp;gt;من آیتم اول این کامپوننت هستم&amp;lt;/h1&amp;gt;&lt;br&gt;
    &amp;lt;p&amp;gt;من آیتم دوم این کامپوننت هستم&amp;lt;/p&amp;gt;&lt;br&gt;
  &amp;lt;/Fragment&amp;gt;&lt;br&gt;
  );&lt;br&gt;
}&lt;br&gt;
export default App&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;از چه اِلِمان هایی به عنوان Wrapper در ری اکت میتوانیم استفاده کنیم؟&lt;/p&gt;

&lt;p&gt;در ری اکت از اِلِمان های مختلفی مثل div , span , Fragment , &amp;lt;&amp;gt; و … میتوانیم به عنوان Wrapper استفاده کنیم .&lt;/p&gt;

&lt;p&gt;اکثر توسعه دهنده های ری اکت همیشه از div به عنوان Wrapper استفاده میکنند ، اما اینکار اصلا درست نیست .&lt;br&gt;
آیا میتوان از &lt;/p&gt; به عنوان Wrapper استفاده کرد ؟

&lt;p&gt;اگر هدف شما از قرار دادن div به عنوان Wrapper ، افزون استایل است ( مثل hover ) هیچ مشکلی نیست و میتوانید از &lt;/p&gt; استفاده کنید .

&lt;p&gt;اما اگر هدف شما برای استفاده از div ، صرفا بحث Wrapper بودن آن است ، قطعا انتخاب های بهتری هم وجود دارد و استفاده از div منطقی نیست .&lt;/p&gt;

&lt;p&gt;استفاده از div به عنوان Wrapper خیلی اوغات میتواند مشکلاتی مثل بهم خوردن Style های Css را بهمراه داشته باشند مخصوصا زمانیکه از FlexBox و Grid استفاده میکنید . &lt;/p&gt;

&lt;p&gt;به عنوان یک React Developer حرفه ای باید تمام تلاش خودتون رو بکنید که Element اضافی وارد DOM نکنید ! اما زمانیکه از div به عنوان والد استفاده میکنید ، اینکار را میکنید !&lt;br&gt;
تفاوت Fragment با div در چیست ؟&lt;/p&gt;

&lt;p&gt;Fragment باعث میشه تمامی div های اضافی از درخت DOM حذف بشه ، اما زمانیکه از div بجای Fragment استفاده میکنید نه تنها این اتفاق نمی افتد بلکه یک div اضافه هم وارد DOM میکنید !&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uRaP87Ye--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xw6jg64a1i3yrtvdym0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uRaP87Ye--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xw6jg64a1i3yrtvdym0e.png" alt="Image description" width="800" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  مزایای استفاده از Fragment در ری اکت
&lt;/h2&gt;

&lt;p&gt;درصورتیکه از Fragment بجای div استفاده کنید مزایای زیر را برای شما خواهد داشت :&lt;/p&gt;

&lt;p&gt;استفاده از React.Fragment باعث میشود کد شما تمیزتر و خواناتر باشد .&lt;/p&gt;

&lt;p&gt;کامپوننت شما سریعتر Render میشود و از حافظه کمتری استفاده میکند .&lt;/p&gt;

&lt;p&gt;استفاده از div به دلیل اینکه ویژگی های بیشتری نسبت به Fragment دارد باعث سنگین شدن صفحه و  بارگذاری دیرتر صفحه میشود  ، پس زمانیکه از React.Fragment استفاده کنید سرعت بارگذاری صفحه نیز سریعتر خواهد بود .&lt;/p&gt;

&lt;p&gt;اگر از div استفاده کنید ، به دلیل تو در تو شدن Element ها در DOM ، دیباگ کردن کد سخت تر خواهد شد ، در مقابل استفاده از Fragment باعث میشود Element کمتری در DOM قرار بگیرد و دیباگ کد راحت تر باشد .&lt;/p&gt;

&lt;p&gt;برای مطالعه نسخه کامل و راستچین مقاله روی لینک زیر کلیک کنید : &lt;br&gt;
&lt;a href="https://frontendi.com/react-fragment/"&gt;Fragment در ری اکت&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>fragment</category>
      <category>frontend</category>
    </item>
    <item>
      <title>همه چیز در مورد Strict Mode ری اکت !</title>
      <dc:creator>FrontEndi</dc:creator>
      <pubDate>Sat, 16 Sep 2023 12:58:17 +0000</pubDate>
      <link>https://dev.to/frontendi/hmh-chyz-dr-mwrd-strict-mode-ry-kht--ncl</link>
      <guid>https://dev.to/frontendi/hmh-chyz-dr-mwrd-strict-mode-ry-kht--ncl</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wOGgNQ8V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g6n31fvcyay9ldbeks8e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wOGgNQ8V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g6n31fvcyay9ldbeks8e.png" alt="Image description" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;اگه شما هم یک React Developer باشید حداقل یکبار اسم StrictMode ری اکت به گوشتون خورده . اما واقعا این ابزار چیکار میکنه ؟!&lt;/p&gt;

&lt;p&gt;با فِرانت اِندی همراه باشید تا کامل بررسیش کنیم 🙂&lt;/p&gt;

&lt;h2&gt;
  
  
  Strict Mode در ری اکت چیست ؟
&lt;/h2&gt;

&lt;p&gt;قابلیت StrictMode به شما کمک میکنه که در مراحل فاز توسعه پروژه ( فاز Development ) باگ ها و مشکلات رایج پروژتون رو پیدا کنید . &lt;/p&gt;

&lt;p&gt;در واقع StrictMode حالت سخت گیرانه ری اکت هست ! این ابزار فقط در فاز Development کاربرد داره و به شما کمک میکنه که مشکلات پروژتون رو در زمان توسعه پیدا کنید و اونهارو فیکس کنید .&lt;/p&gt;

&lt;p&gt;در واقع وقتی حالت StrictMode رو در ری اکت فعال میکنیم ، در پشت صحنه react یکسری بررسی های اضافی روی اپیکیشن ما صورت میگیره تا کوچکترین مشکلات و باگ های احتمالی ، به ما اطلاع داده بشه .&lt;/p&gt;

&lt;p&gt;وقتی React.StrictMode فعال میشه ، React چهار مورد زیر رو دقیق بررسی میکنه :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IH-NLrBq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/umnare3ksaonyyhv063k.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IH-NLrBq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/umnare3ksaonyyhv063k.jpg" alt="Image description" width="800" height="792"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;چگونه React.StrictMode را فعال کنیم ؟&lt;/p&gt;

&lt;p&gt;فعالسازی حالت سخت گیرانه ری اکت ( StrictMode ) بسیار راحت است !&lt;/p&gt;

&lt;p&gt;شما دو انتخاب دارید :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;استفاده از ابزار StrictMode در کل پروژه&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;کافی است به فایل index.js روت پروژه مراجعه کنید و مطابق خط 5 و 7 از این قابلیت فوق العاده ری اکت استفاده کنید :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react';
import ReactDOM from 'react-dom';

ReactDOM.render(
  &amp;lt;React.StrictMode&amp;gt;
    &amp;lt;App /&amp;gt; // هرچیزی که اینجا قرار بگیرد ، قوانین سختگیرانه روی آن اعمال میشود
  &amp;lt;/React.StrictMode&amp;gt;,
  document.getElementById('root')
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;در تیکه کد بالا ، تمام App به عنوان Children به ابزار StrictMode داده شده است . پس با انجام این کار تمام پروژه ما در حالت Development از این ابزار استفاده خواهد کرد .&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;استفاده از ابزار StrictMode برای یک یا چند کامپوننت&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;گاهی اوغات میخواهیم فقط یک بخش از اپیکیشن از این ابزار استفاده کند .&lt;/p&gt;

&lt;p&gt;در چنین مواقعی بصورت زیر عمل میکنیم :&lt;/p&gt;

&lt;p&gt;`import { StrictMode } from 'react';&lt;/p&gt;

&lt;p&gt;function App() {&lt;br&gt;
  return (&lt;br&gt;
    &amp;lt;&amp;gt;&lt;br&gt;
       // حالت سختگیرانه روی هدر اعمال نمیشود&lt;br&gt;
      &lt;br&gt;
        &lt;br&gt;
          &lt;br&gt;
          &lt;br&gt;
        &lt;br&gt;
      &lt;br&gt;
       // حالت سختگیرانه روی فوتر اعمال نمیشود&lt;br&gt;
    &amp;lt;/&amp;gt;&lt;br&gt;
  );&lt;br&gt;
}`&lt;/p&gt;

&lt;p&gt;اتفاقی که در تیکه کد بالا می افتد ، این است که تمام اپیکیشن به جز کامپوننت Header و Footer ، از ابزار StrictMode استفاده میکنند.&lt;/p&gt;

&lt;p&gt;اما اگر میخواهید فقط کامپوننت Button از این ابزار استفاده کند ، بصورت زیر عمل کنید :&lt;/p&gt;

&lt;p&gt;`import { StrictMode } from 'react';&lt;br&gt;
import {Button} from 'antd'&lt;/p&gt;

&lt;p&gt;function App() {&lt;br&gt;
  return (&lt;br&gt;
    &amp;lt;&amp;gt;&lt;br&gt;
      &lt;br&gt;
       حالت سختگیرانه  فقط روی من اعمال میشود ، نه چیز دیگری&lt;br&gt;
      &lt;br&gt;
    &amp;lt;/&amp;gt;&lt;br&gt;
  );&lt;br&gt;
}`&lt;/p&gt;

&lt;p&gt;برای مطالعه نسخه کامل و راستچین مقاله لطفا روی لینک زیر کلیک کنید : &lt;br&gt;
&lt;a href="https://frontendi.com/strict-mode-in-react/"&gt;Strict Mode در ری اکت&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>frontend</category>
      <category>strictmode</category>
    </item>
  </channel>
</rss>
