Pinia لـ Vue: defineStore وstoreToRefs
عرّف متجر Pinia باستخدام defineStore، وادخل إليه من المكوّنات، واستخدم storeToRefs للحفاظ على التفاعلية عند تفكيك الحالة.
Pinia لـ Vue: defineStore وstoreToRefs درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ما هي Pinia؟
Pinia هي مكتبة إدارة الحالة الرسمية لـVue 3. وهي تستبدل Vuex بواجهة أبسط وآمنة من ناحية الأنواع ومتكاملة مع DevTools، وتشبه Composition API.
تثبيت Pinia
ثبّت إضافة Pinia وسجّلها مع تطبيق Vue.
npm install pinia
// main.ts
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import App from './App.vue';
const app = createApp(App);
app.use(createPinia());
app.mount('#app');defineStore — أسلوب Composition API
تنشئ defineStore مخزنًا. ويستخدم أسلوب Composition API ref وcomputed والدوال مباشرةً — تمامًا مثل Composable.
// stores/counter.ts
import { defineStore } from 'pinia';
import { ref, computed } from 'vue';
export const useCounterStore = defineStore('counter', () => {
const count = ref(0);
const doubled = computed(() => count.value * 2);
function increment() { count.value++; }
return { count, doubled, increment };
});defineStore — أسلوب Options
يحاكي أسلوب Options واجهة Options API في Vue: state() للبيانات التفاعلية، وgetters (مثل computed)، وactions (مثل methods).
export const useCounterStore = defineStore('counter', {
state: () => ({ count: 0 }),
getters: {
doubled: (state) => state.count * 2,
},
actions: {
increment() { this.count++; },
async fetchAndSet(id: string) {
this.count = await fetchCount(id);
}
}
});استخدام مخزن في مكوّن
استدعِ hook الخاص بالمخزن داخل setup(). المخزن كائن تفاعلي — ويمكنك قراءة الحالة واستدعاء الإجراءات مباشرةً.
<script setup>
import { useCounterStore } from '@/stores/counter';
const store = useCounterStore();
</script>
<template>
<p>{{ store.count }}</p>
<button @click="store.increment">+</button>
</template>storeToRefs — التفكيك الآمن
يؤدي التفكيك المباشر للمخزن إلى فقدان التفاعلية في الحالة وgetters (فتصبح قيمًا عادية). استخدم storeToRefs() لإجراء التفكيك مع الحفاظ على التفاعلية.
import { storeToRefs } from 'pinia';
const store = useCounterStore();
// Actions can be destructured normally (they're functions):
const { increment } = store;
// State and getters need storeToRefs:
const { count, doubled } = storeToRefs(store);$patch — التحديثات المجمّعة
يطبّق store.$patch() عدة تغييرات في الحالة كعملية واحدة. وهذا مفيد لتجميع التحديثات المرتبطة.
store.$patch({
count: 10,
name: 'Updated'
});
// Or with a function for complex logic:
store.$patch(state => {
state.items.push(newItem);
state.total += newItem.price;
});$subscribe — مراقبة تغيّرات المخزن
يتفاعل store.$subscribe(callback) مع أي تعديل في المخزن، على نحو مشابه لـwatch في Vue، لكن على المخزن بأكمله.
إضافات Pinia
توسّع إضافات Pinia كل مخزن. ومن الاستخدامات الشائعة: حفظ الحالة في localStorage، أو إضافة تسجيل لتصحيح الأخطاء، أو حقن الخدمات.
import { createPinia } from 'pinia';
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);Pinia DevTools
يتكامل Pinia مع Vue DevTools. يمكنك فحص حالة المخزن، ومعرفة الإجراءات التي تم استدعاؤها، والتنقل زمنيًا بين لقطات الحالة.
مخازن متعددة
أنشئ مخزنًا واحدًا لكل نطاق (useAuthStore وuseCartStore وuseNotificationStore). يمكن للمخازن استيراد بعضها واستخدامه. وتجعل البنية المسطحة في Pinia (من دون وحدات متداخلة) هذا الأمر بسيطًا.
تحقق سريع
لماذا ينبغي استخدام storeToRefs() عند تفكيك مخزن Pinia؟
مراجعة: Pinia
تنشئ defineStore المخازن. ويمكن استخدام أسلوب Composition API أو Options API. يمكنك الوصول إليها باستخدام hook useXxxStore(). استخدم storeToRefs() عند التفكيك التفاعلي. استخدم $patch() لتجميع التحديثات. استخدم الإضافات للحفظ الدائم والامتدادات الأخرى. يتكامل Pinia مع DevTools. استخدم مخزنًا واحدًا لكل نطاق — من دون وحدات متداخلة على نمط Vuex.
الأسئلة الشائعة
هل درس «Pinia لـ Vue: defineStore وstoreToRefs» مجاني؟
نعم — نص درس «Pinia لـ Vue: defineStore وstoreToRefs» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ماذا ستتعلم في «Pinia لـ Vue: defineStore وstoreToRefs»؟
عرّف متجر Pinia باستخدام defineStore، وادخل إليه من المكوّنات، واستخدم storeToRefs للحفاظ على التفاعلية عند تفكيك الحالة. تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟
لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «Pinia لـ Vue: defineStore وstoreToRefs»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟
نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Redux Toolkit: createSlice وconfigureStore
- Zustand لحالة React خفيفة
- Pinia لـ Vue: defineStore وstoreToRefs
- متى تستخدم الحالة العامة مقابل المحلية