وضعیت در React – مدیریت داده‌های پویا با useState و باز-render شدن کامپوننت‌ها

در React، پراپس‌ها فقط برای انتقال داده از والد به فرزند استفاده می‌شوند و قابل تغییر نیستند. اما وضعیت (state) یک ساختار دادهٔ قابل تغییر است که با استفاده از hook معروف useState تعریف می‌شود. این مقاله نحوهٔ تعریف وضعیت، به‌روزرسانی آن، و تأثیر آن بر باز-render شدن کامپوننت‌ها را بررسی می‌کند. همچنین تفاوت بین render و re-render و نقش StrictMode در محیط توسعه توضیح داده می‌شود.

useStatestatere-renderStrictMode

~2 دقیقه مطالعه · آخرین به‌روزرسانی ۲۹ مهر ۱۴۰۴

مقدمه


در React، پراپس‌ها فقط برای انتقال داده از والد به فرزند استفاده می‌شوند و نباید تغییر کنند. اما برای مدیریت داده‌هایی که در طول زمان تغییر می‌کنند، از state استفاده می‌کنیم. این داده‌ها با hook معروف useState تعریف می‌شوند و با تغییر آن‌ها، کامپوننت مربوطه و فرزندانش دوباره render می‌شوند.


نمونه‌ای از وضعیت در کامپوننت Search


فرض کنید می‌خواهیم متنی که کاربر در فیلد ورودی وارد می‌کند، در کنار آن نمایش داده شود. روش اولیه (غیرمؤثر):


let searchTerm = '';
const handleChange = (event) => {
  searchTerm = event.target.value;
};

این روش کار نمی‌کند چون React نمی‌داند که searchTerm باید وضعیت باشد. راه‌حل درست:


import * as React from 'react';

const Search = () => {
  const [searchTerm, setSearchTerm] = React.useState('');

  const handleChange = (event) => {
    setSearchTerm(event.target.value);
  };

  return (
    

Searching for {searchTerm}.

); };

توضیح useState


تابع useState یک مقدار اولیه دریافت می‌کند و آرایه‌ای با دو مقدار بازمی‌گرداند:


  • مقدار اول: وضعیت فعلی
  • مقدار دوم: تابعی برای به‌روزرسانی وضعیت

با هر بار تغییر وضعیت، کامپوننت مربوطه دوباره render می‌شود و مقدار جدید در JSX نمایش داده می‌شود.


تفاوت render و re-render


هر کامپوننت در React یک بار اولیه render می‌شود. سپس با هر تغییر در وضعیت یا پراپس‌ها، کامپوننت و فرزندانش دوباره render می‌شوند. می‌توانید با console.log() در هر کامپوننت، این رفتار را مشاهده کنید.


نکات مهم درباره useState


  • می‌توان چندین useState در یک یا چند کامپوننت استفاده کرد.
  • وضعیت می‌تواند رشته، عدد، آرایه یا آبجکت باشد.
  • در محیط توسعه، ممکن است logها دوبار نمایش داده شوند (به‌خاطر StrictMode).
  • React وضعیت را در حافظه داخلی نگه می‌دارد و با garbage collection پاک‌سازی می‌کند.

جمع‌بندی


وضعیت در React ابزاری قدرتمند برای مدیریت داده‌های پویا است. با استفاده از useState می‌توان داده‌ها را تعریف، به‌روزرسانی، و در رابط کاربری نمایش داد. این تغییرات باعث باز-render شدن کامپوننت‌ها می‌شوند و تجربه‌ای تعاملی برای کاربر فراهم می‌کنند.


نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

فرم‌ها در React – ارسال داده با onSubmit و action در فرم‌های جستجو

فرم‌ها بخش جدایی‌ناپذیر هر اپلیکیشن مدرن هستند. در این مقاله، نحوهٔ ساخت فرم جستجو در React را بررسی می‌کنیم. ابتدا از onSubmit برای مدیریت ارسال فرم استفاده می‌کنیم و سپس با معرفی ویژگی action، فرم را به رفتار بومی HTML نزدیک‌تر می‌کنیم. این ساختار باعث افزایش خوانایی، قابلیت استفاده با صفحه‌کلید، و آمادگی برای نسخه‌های آیندهٔ React می‌شود.

ادامه

کتابخانه‌های شخص ثالث در React – استفاده از axios و async/await برای دریافت داده‌ها

در این مقاله، نحوهٔ جایگزینی fetch با کتابخانهٔ axios برای دریافت داده‌ها از API در React را بررسی می‌کنیم. سپس با استفاده از async/await و بلوک try/catch، کد دریافت داده‌ها را خواناتر و قابل مدیریت‌تر می‌کنیم. این روش‌ها باعث افزایش سازگاری با مرورگرهای قدیمی، بهبود تست‌پذیری، و کاهش پیچیدگی کد می‌شوند.

ادامه

دریافت صریح داده‌ها در React – کنترل درخواست‌های API با دکمه تأیید

در پیاده‌سازی اولیه، هر بار که کاربر در فیلد جستجو تایپ می‌کرد، درخواست جدیدی به API ارسال می‌شد. این مقاله نحوهٔ تغییر این رفتار به دریافت صریح داده‌ها را آموزش می‌دهد؛ به‌طوری‌که فقط با کلیک روی دکمهٔ تأیید، درخواست به API ارسال شود. با تعریف دو وضعیت مجزا برای searchTerm و url، و استفاده از useCallback و useEffect، کنترل کامل بر زمان ارسال درخواست فراهم می‌شود.

ادامه

وضعیت‌های غیرممکن در React – مدیریت پیش‌بینی‌پذیر وضعیت با useReducer

استفاده هم‌زمان از چند useState برای مدیریت وضعیت‌های مرتبط می‌تواند منجر به وضعیت‌های غیرممکن و باگ‌های پنهان شود. این مقاله نشان می‌دهد چگونه با ترکیب وضعیت‌های مرتبط در یک useReducer واحد، می‌توان از بروز چنین مشکلاتی جلوگیری کرد. با تعریف یک ساختار وضعیت پیچیده شامل داده، بارگذاری و خطا، و استفاده از اکشن‌های مشخص، مدیریت وضعیت در React پیش‌بینی‌پذیرتر و قابل اطمینان‌تر می‌شود.

ادامه

مدیریت پیشرفته وضعیت در React – استفاده از useReducer برای انتقال‌های پیچیده

در حالی که useState برای مدیریت وضعیت‌های ساده مناسب است، هوک useReducer در React راه‌حلی مقیاس‌پذیر برای مدیریت وضعیت‌های پیچیده و وابسته ارائه می‌دهد. این مقاله نحوهٔ مهاجرت وضعیت لیست داستان‌ها از useState به useReducer را بررسی می‌کند، و نشان می‌دهد چگونه با تعریف اکشن‌هایی مانند SET_STORIES و REMOVE_STORY می‌توان منطق وضعیت را به‌صورت متمرکز و خوانا مدیریت کرد.

ادامه

رندر شرطی در React – نمایش وضعیت بارگذاری و خطا هنگام دریافت داده‌های غیرهمزمان

در React، رندر شرطی ابزاری قدرتمند برای کنترل نمایش رابط کاربری بر اساس وضعیت‌های مختلف است. این مقاله نحوهٔ نمایش پیام «در حال بارگذاری…» هنگام دریافت داده‌های غیرهمزمان، و پیام خطا در صورت شکست دریافت داده را بررسی می‌کند. با استفاده از useState و useEffect، وضعیت‌های isLoading و isError را مدیریت کرده و با استفاده از عملگرهای منطقی و ternary، رندر شرطی را پیاده‌سازی می‌کنیم.

ادامه