<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های یگانه موسوی</title>
        <link>https://virgool.io/feed/@m_21897868</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-16 19:00:30</pubDate>
        <image>
            <url>https://static.virgool.io/images/default-avatar.jpg</url>
            <title>یگانه موسوی</title>
            <link>https://virgool.io/@m_21897868</link>
        </image>

                    <item>
                <title>مدیریت حالت در Vue.js</title>
                <link>https://virgool.io/@m_21897868/%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D8%AD%D8%A7%D9%84%D8%AA-%D8%AF%D8%B1-vuejs-pcw16y9dakgm</link>
                <description>مقدمهمدیریت حالت به معنای کنترل و نگهداری داده‌هایی است که بین کامپوننت‌های مختلف اپلیکیشن به اشتراک گذاشته می‌شود. هر اپلیکیشن Vue.js نیاز به مدیریت اطلاعاتی مثل داده‌های کاربر، محتوای فرم‌ها، و تنظیمات صفحه دارد.چرا مدیریت حالت مهم است؟مشکلات بدون مدیریت حالت:Prop Drilling: انتقال داده‌ها از کامپوننت والد به نوه از طریق تمام کامپوننت‌های میانی که به آن داده‌ها نیاز ندارند.جریان پیچیده داده: وقتی داده‌ها در جهات مختلف حرکت می‌کنند، دنبال کردن تغییرات و رفع باگ‌ها سخت می‌شود.عدم همگام‌سازی: کامپوننت‌های مختلف که به یک داده وابسته‌اند، ممکن است به‌روزرسانی نشوند.راه‌حل‌هامدیریت حالت این مشکلات را با ایجاد یک منبع واحد حقیقت (Single Source of Truth) و جریان یک‌طرفه داده‌ها حل می‌کند.راه‌حل‌های Vue.js1. قابلیت‌های داخلی VueVue دارای سیستم reactive قدرتمندی است که برای اکثر پروژه‌ها کافی است:// داده‌های ساده
const count = ref(0);

// آبجکت‌های پیچیده  
const state = reactive({
  user: { name: &quot;کاربر&quot; },
  items: []
});
2. Computed Propertiesبرای محاسبه مقادیر بر اساس داده‌های دیگر:const fullName = computed(() =&gt; 
  `${firstName.value} ${lastName.value}`
);
3. Watchersبرای نظارت بر تغییرات و انجام عملیات جانبی:watch(searchTerm, async (newTerm) =&gt; {
  if (newTerm.length &gt; 2) {
    results.value = await search(newTerm);
  }
});
4. Composablesبرای استفاده مجدد منطق در کامپوننت‌های مختلف:export function useCounter() {
  const count = ref(0);
  const increment = () =&gt; count.value++;
  return { count, increment };
}
کتابخانه‌های تخصصیVuex (قدیمی)Vuex بر اساس چهار مفهوم کار می‌کند:State: نگهداری داده‌هاGetters: محاسبه مقادیر مشتق‌شدهMutations: تغییرات همزمانActions: عملیات ناهمزمانPinia (مدرن)Pinia جایگزین رسمی Vuex است با ویژگی‌های بهتر:ساده‌تر از Vuexپشتیبانی بهتر از TypeScriptعدم نیاز به Mutationsسازگاری کامل با Composition APIexport const useStore = defineStore(&#039;main&#039;, {
  state: () =&gt; ({ count: 0 }),
  actions: {
    increment() { this.count++ }
  }
});
انتخاب روش مناسبپروژه‌های کوچک (کمتر از ۱۰ کامپوننت)از قابلیت‌های داخلی Vue استفاده کنید:export const store = reactive({
  user: null,
  setUser(user) { this.user = user }
});
پروژه‌های متوسط (۱۰-۵۰ کامپوننت)Pinia با معماری ماژولار:
export const useUserStore = defineStore(&#039;user&#039;, {
  state: () =&gt; ({ profile: null }),
  actions: {
    async fetchProfile() {
      this.profile = await api.getProfile();
    }
  }
});
پروژه‌های بزرگ (۵۰+ کامپوننت)استفاده از الگوهای پیشرفته با Lazy Loadingبهترین روش‌هاعملکرداستفاده از shallowRef برای داده‌های بزرگLazy Loading برای store های سنگینCleanup مناسب event listener هاتستتست واحد store هاMock کردن API callsتست یکپارچگی کامپوننت‌هانگهداری کدتقسیم store های بزرگ به ماژول‌های کوچکاستفاده از TypeScript برای type safetyمستندسازی actions و stateمهاجرت از Vuex به Piniaمراحل کلی:نصب Pinia در کنار Vuexتبدیل تدریجی ماژول‌هابه‌روزرسانی کامپوننت‌هانتیجه‌گیریانتخاب روش مدیریت حالت بستگی به اندازه و پیچیدگی پروژه دارد:پروژه‌های ساده: قابلیت‌های داخلی Vueپروژه‌های متوسط: Pinia با store های ماژولارپروژه‌های پیچیده: الگوهای Enterprise و بهینه‌سازی‌های پیشرفتهمهم‌ترین نکته این است که از ساده شروع کنید و تنها زمانی به راه‌حل‌های پیچیده‌تر بروید که واقعاً نیاز دارید. Vue.js ابزارهای مناسبی برای هر مرحله از رشد پروژه فراهم کرده است.</description>
                <category>یگانه موسوی</category>
                <author>یگانه موسوی</author>
                <pubDate>Fri, 27 Jun 2025 15:18:14 +0330</pubDate>
            </item>
            </channel>
</rss>