<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های عرفان فولادی</title><link>https://virgool.ir/feed/@erfanfooladi2002</link><description></description><language>fa</language><pubDate>2026-11-10 22:32:32</pubDate><image><url>https://files.virgool.ir/upload/users/4166081/avatar/HkAK12.jpg</url><title>عرفان فولادی</title><link>https://virgool.ir/@erfanfooladi2002</link></image><item><title>🧠 چرا در React تا قبل از دریافت داده از API مقدار undefined برمی‌گرده؟</title><link>https://virgool.ir/@erfanfooladi2002/🧠-چرا-در-react-تا-قبل-از-دریافت-داده-از-api-مقدار-undefined-برمی-گرده-yjmepz4avygp</link><description>یکی از سوال‌های رایج بین برنامه‌نویس‌های React (مخصوصاً تازه‌کارها) اینه که:&#34;چرا وقتی از API داده می‌گیرم، تا قبل از اومدن پاسخ، مقدار undefined نمایش داده میشه؟&#34;بیایید با هم دقیق بررسی کنیم 👇⚙️ 1. ماهیت asynchronous در Reactدر React، وقتی شما یک درخواست (مثل fetch یا axios) به API می‌فرستید،کامپوننت شما بلافاصله render میشه — حتی قبل از اینکه سرور پاسخی بفرسته.پس در اولین رندر، مقدار state هنوز تنظیم نشده و به صورت undefined یا null هست.به محض اینکه پاسخ از سرور برگرده، React دوباره render می‌کنه و داده‌ها به‌روزرسانی می‌شن.📘 مثال:const [data, setData] = useState();&#xA;&#xA;useEffect(() =&gt; {&#xA;  fetch(&#39;/api/data&#39;)&#xA;    .then(res =&gt; res.json())&#xA;    .then(result =&gt; setData(result));&#xA;}, []);&#xA;&#xA;return &lt;div&gt;{data?.name}&lt;/div&gt;;&#xA;در اولین لحظه‌ی اجرای این کد، data هنوز مقداری نداره → پس undefined نمایش داده میشه.بعد از چند میلی‌ثانیه، با دریافت پاسخ، data مقدار می‌گیره و کامپوننت دوباره render میشه.✅ 2. راه‌حل‌ها🟢 مقدار اولیه بدههمیشه برای state یک مقدار پیش‌فرض بذار تا در اولین رندر خطا نگیری:const [data, setData] = useState({});&#xA;const [items, setItems] = useState([]);&#xA;🟢 رندر شرطی کنقبل از نمایش داده، بررسی کن مقدار گرفته شده یا نه:return (&#xA;  &lt;div&gt;&#xA;    {data ? (&#xA;      &lt;div&gt;{data.name}&lt;/div&gt;&#xA;    ) : (&#xA;      &lt;div&gt;در حال بارگذاری...&lt;/div&gt;&#xA;    )}&#xA;  &lt;/div&gt;&#xA;);&#xA;🟢 از optional chaining استفاده کنبرای جلوگیری از ارورهای «cannot read property of undefined»:&lt;div&gt;{data?.name}&lt;/div&gt;&#xA;فقط حواست باشه که این کار جلوی خطا رو می‌گیره، اما مشکل async بودن رو حل نمی‌کنه.⚠️ 3. دلایل دیگر undefined بودن داده‌هاعلت ها                                                         توضیح❌ useEffect اشتباه نوشته شده         dependency array خالی نیست یا چند بار call می‌زنه❌ خطای backend یا delay در پاسخ           ممکنه promise resolve نشه❌ destructuring زودهنگام                         مثلاً const { name } = data قبل از مقداردهی❌ اشتباه در setState                                  مثلاً setData(res.data) باید باشه ولی فقط                                setData(res) نوشتی     ❌ async/await فراموش شده                     وقتی از await استفاده نکنی، مقدار Promise برمی‌گرده🧩 4. بهترین الگو برای مدیریت حالت‌هادر پروژه‌های واقعی بهتره برای هر وضعیت، state جداگانه بذاری:const [data, setData] = useState(null);&#xA;const [loading, setLoading] = useState(true);&#xA;const [error, setError] = useState(null);&#xA;&#xA;useEffect(() =&gt; {&#xA;  const fetchData = async () =&gt; {&#xA;    try {&#xA;      const res = await fetch(&#39;/api/data&#39;);&#xA;      const json = await res.json();&#xA;      setData(json);&#xA;    } catch (err) {&#xA;      setError(err);&#xA;    } finally {&#xA;      setLoading(false);&#xA;    }&#xA;  };&#xA;  fetchData();&#xA;}, []);&#xA;&#xA;if (loading) return &lt;div&gt;در حال بارگذاری...&lt;/div&gt;;&#xA;if (error) return &lt;div&gt;خطا در دریافت داده&lt;/div&gt;;&#xA;&#xA;return &lt;div&gt;{data.name}&lt;/div&gt;;&#xA;این الگو هم کد تمیزتری داره، هم تجربه‌ی کاربری بهتری به مخاطب میده.💬 جمع‌بندیدرundefined , React  بودن داده‌ها قبل از پاسخ API یک رفتار طبیعی است.چیزی که اهمیت دارد، نحوه‌ی مدیریت این حالت‌های موقت است.با رعایت چند نکته ساده (state اولیه، رندر شرطی، و کنترل خطاها)،کد شما هم خواناتر میشه، هم خطاهای زمان اجرا به حداقل می‌رسن.</description><category>عرفان فولادی</category><author>عرفان فولادی</author><pubDate>Sat, 08 Nov 2025 15:14:50 +0330</pubDate></item></channel></rss>