<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمد نوحی</title>
        <link>https://virgool.io/feed/@m_54096432</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-04-15 10:18:12</pubDate>
        <image>
            <url>https://static.virgool.io/images/default-avatar.jpg</url>
            <title>محمد نوحی</title>
            <link>https://virgool.io/@m_54096432</link>
        </image>

                    <item>
                <title>مفهوم clean-up توی ری اکت</title>
                <link>https://virgool.io/@m_54096432/%D9%85%D9%81%D9%87%D9%88%D9%85-clean-up-%D8%AA%D9%88%DB%8C-%D8%B1%DB%8C-%D8%A7%DA%A9%D8%AA-axie507dojog</link>
                <description>توی ری اکت وقتی میخوایم یه افکت داشته باشیم باید از useEffect استفاده کنیم و افکت ها مواردی مثل event listener , timer , http request , ... که وقتی یه افکت رو مینویسیم باید حتما این افکت بعد از unmount شدن کامپوننت از بین بره تا اثرش روی پروژه دیگه باقی نمونه که ری اکت مفهومی رو معرفی کرده به نام clean up که اگر توی هوک useEffect تابعی رو return کنیم کدهای توی اون تابع عمل clean up رو انجام میدن اما این تابع چه زمانی اجرا میشه ؟ فهم این موضوع توی کار با افکت ها خیلی مهم است این تابع clean up بعد از unmount شدن کامپوننت و قبل از هر بار آپدیت کامپوننت اجرا میشه که دونستن این موضوع خیلی مهمه مثلا یه کامپوننت داریم که میخوایم هر بار که کاربر سرچ کرد یه درخواست به سرور بفرستیم دوتا نکته این جا مطرح میشه اول اینکه اگر وسط سرچ یهو کاربر نظرش عوض بشه بره یه صفحه ی دیگه ای که دیگه اون کامپوننت رندر نشه ( unmaount ) باید اون درخواست از بین بره و مورد بعدی اینکه هر بار که کاربر چیزی رو تایپ میکنه چون استیت تغییر میکنه کامپوننت دوباره رندر میشه و باید درخواست قبلی رو از بین برد که هردوتای این کارها باید توی clean up انجام بشه مثال :useEffect(() =&gt; {
    const searchTimer = setTimeout&#40;(&#41; =&gt; {
      searchValue &amp;&amp; handleSearch();
    }, 500);

    /* before each update and after unmount */
    // clean-up
    return () =&gt; {
      clearTimeout(searchTimer);
    };
  }, [searchValue]);</description>
                <category>محمد نوحی</category>
                <author>محمد نوحی</author>
                <pubDate>Sun, 07 Dec 2025 18:12:39 +0330</pubDate>
            </item>
                    <item>
                <title>قابلیت loader در React Router</title>
                <link>https://virgool.io/@m_54096432/%D9%82%D8%A7%D8%A8%D9%84%DB%8C%D8%AA-loader-%D8%AF%D8%B1-react-router-yl4yh3xcjgww</link>
                <description>اکثر مواقع نیاز داریم وقتی وارد یه route جدید میشیم به محض اینکه اون کامپوننت mount میشه یه دیتایی رو از سمت سرور دریافت کنیم و احتمالا اولین راه حلی که به ذهنمون میرسه اینه که از useEffect در Mounting استفاده کنیم اما اگر داریم از React Router استفاده میکنیم یه راه اصولی تر وسریعتر و بهینه تر وجود دارهتوی روش اول :‌ fetch data when component mountمشکلی که این روش داره گرفتن دیتا از سرور بعد از اینکه کامپوننت متولد شد انجام میشه و ممکنه UI سریعتر از دیتا لود بشه و بعد دیتا از سرور گرفته بشهfunction Page() { 
  const [users,setUsers] = useState([]);

   useEffect(() =&gt; {
    async function fetchUsers() {
      const resp = await fetch(&quot;https://jsonplaceholder.typicode.com/users&quot;);
      const data = await resp.json();
      setUsers(data);
    }

    fetchUsers();
  }, []);
}البته اصولی تر بود که درخواست رو هم توی clean up لغو کنیم ولی برای ساده سازی نوشته نشدهروش دوم : استفاده از loader در react routerتوی این حالت ما اون تابعی که قراره دیتا رو از سمت سرور موقع mount شدن بگیره به route مورد نظر پاس میدیم و خود ری اکت روتر قبل از mount شدن اون کامپوننت درخواست ما رو اجرا میکنه و توسط هوکی به نام useLoaderData میتونیم به خروجی تابع مورد نظر دسترسی داشته باشیم{
   path: &quot;/users&quot;,
   element: &lt;Users /&gt;,
   loader: fetchUsers,
}و به صورت زیر توی کامپوننت استفاده میشهimport { useLoaderData } from &quot;react-router&quot;;

function Users() {
  const users = useLoaderData();

  return (
    &lt;div&gt;
      This is users page
      &lt;ul&gt;
        {users.map(user =&gt; (
          &lt;li&gt;{user.name}&lt;/li&gt;
        ))}
      &lt;/ul&gt;
    &lt;/div&gt;
  );
}

export default Users;
این روش خیلی بهینه ترهامیدوارم که این پست به دردتون خورده باشه</description>
                <category>محمد نوحی</category>
                <author>محمد نوحی</author>
                <pubDate>Mon, 01 Dec 2025 21:02:51 +0330</pubDate>
            </item>
                    <item>
                <title>همه چیز درباره ی useEffect</title>
                <link>https://virgool.io/@m_54096432/%D9%87%D9%85%D9%87-%DA%86%DB%8C%D8%B2-%D8%AF%D8%B1%D8%A8%D8%A7%D8%B1%D9%87-%DB%8C-useeffect-ydeyiplbyxra</link>
                <description>Clean-up در useEffect دقیقاً چه کار میکند؟در ریاکت وقتی از useEffect استفاده میکنیم داریم یک «اثر جانبی» ایجاد میکنیم؛ مثل تایمر، event listener یا درخواست شبکه. نکتهی مهم این است که این اثرها نباید بعد از رندرهای جدید یا حذف شدن کامپوننت فعال بمانند. برای همین ریاکت مفهومی به نام clean-up دارد.Clean-up همان تابعی است که از داخل useEffect برمیگردانیم و در دو زمان اجرا میشود:قبل از اجرای افکت جدید (وقتی وابستگیها تغییر میکنند)قبل از Unmount شدن کامپوننتیعنی هر چیزی که در افکت میسازیم، باید اینجا پاک شود.مثال: سرچ کاربر با DebounceuseEffect(() =&gt; {
  const timer = setTimeout&#40;(&#41; =&gt; {
    if (searchValue) {
      handleSearch();
    }
  }, 500);

  return () =&gt; {
    clearTimeout(timer);
  };
}, [searchValue]);
هر بار که کاربر تایپ میکند، رندر جدید باعث اجرای clean-up میشود و تایمر قبلی پاک میشود. اگر کاربر صفحه را ترک کند، clean-up برای آخرین بار اجرا میشود.اگر درخواست واقعی دارید؟در درخواستهای fetch باید درخواست قبلی را هم لغو کنید. این کار با AbortController انجام میشود:useEffect(() =&gt; {
  const controller = new AbortController();

  if (searchValue) {
    fetch(`/api/search?q=${searchValue}`, {
      signal: controller.signal,
    }).catch(() =&gt; {});
  }

  return () =&gt; controller.abort();
}, [searchValue]);برای رخداد ها چطور ؟useEffect(() =&gt; {
    const keyHandler = e =&gt; {
      if (e.key === &quot;Escape&quot;) {
        // do something
      }
    };

    document.addEventListener(&quot;keyup&quot;, keyHandler);

    // clean-up
    return () =&gt; {
      document.removeEventListener(&quot;keyup&quot;, keyHandler);
    };
  }, []);امیدوارم که این مطلب براتون مفید بوده باشه </description>
                <category>محمد نوحی</category>
                <author>محمد نوحی</author>
                <pubDate>Mon, 01 Dec 2025 20:36:35 +0330</pubDate>
            </item>
            </channel>
</rss>