Composables: دوال التركيب القابلة لإعادة الاستخدام
استخرج المنطق التفاعلي إلى دوال Composable تبدأ بـ use، وشاركها بين المكوّنات، وافهم اختلافها عن mixins.
Composables: دوال التركيب القابلة لإعادة الاستخدام درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ما هي Composables؟
Composable هي دالة تستخدم خطافات Composition API لتغليف المنطق ذي الحالة وإعادة استخدامه. وهي المكافئ في Composition API لـmixins، لكن من دون تعارضات مساحات الأسماء أو الاعتمادات المخفية.
Composable أساسية
استخرج المنطق التفاعلي إلى دالة يبدأ اسمها بـuse. ويمكنها استخدام ref وcomputed وwatch وخطافات دورة الحياة، تمامًا مثل setup().
// useCounter.ts
import { ref } from 'vue';
export function useCounter(initial = 0) {
const count = ref(initial);
const increment = () => count.value++;
const decrement = () => count.value--;
const reset = () => (count.value = initial);
return { count, increment, decrement, reset };
}
// Usage in any component:
const { count, increment } = useCounter(10);Composable مع خطافات دورة الحياة
يمكن لـComposables تسجيل خطافات دورة الحياة. وتُنفَّذ الخطافات بالنسبة إلى المكوّن الذي يستدعي الـComposable.
// useOnlineStatus.ts
import { ref, onMounted, onUnmounted } from 'vue';
export function useOnlineStatus() {
const isOnline = ref(navigator.onLine);
const update = () => (isOnline.value = navigator.onLine);
onMounted(() => {
window.addEventListener('online', update);
window.addEventListener('offline', update);
});
onUnmounted(() => {
window.removeEventListener('online', update);
window.removeEventListener('offline', update);
});
return { isOnline };
}Composable غير متزامنة (useFetch)
تعمل Composables بشكل ممتاز مع جلب البيانات غير المتزامن — إذ تغلّف نمط loading/error/data.
// useFetch.ts
export function useFetch<T>(url: MaybeRef<string>) {
const data = ref<T | null>(null);
const loading = ref(true);
const error = ref<string | null>(null);
watchEffect(async (onCleanup) => {
const controller = new AbortController();
onCleanup(() => controller.abort());
loading.value = true;
error.value = null;
try {
const res = await fetch(unref(url), { signal: controller.signal });
data.value = await res.json();
} catch (e: any) {
if (e.name !== 'AbortError') error.value = e.message;
} finally { loading.value = false; }
});
return { data, loading, error };
}قبول المراجع كوسائط
يمكن لـComposables قبول قيم عادية أو مراجع كوسائط باستخدام MaybeRef<T> (= T | Ref<T>) وunref() للوصول إلى القيمة.
import type { MaybeRef } from 'vue';
import { unref } from 'vue';
function useDouble(num: MaybeRef<number>) {
return computed(() => unref(num) * 2);
}Composables مقابل Mixins
تحقن Mixins الخصائص في المكوّن من دون مصدر واضح. أما Composables فصريحة — إذ يمكنك رؤية ما يوفّره كل Composable بالضبط من خلال قيمته المُعادة. ويمكن استخدام عدة Composables من دون تعارضات في الأسماء.
مشاركة الحالة بين المكوّنات
إذا استدعى Composable الدالة ref() داخله، فسيحصل كل مكوّن يستدعيه على حالته الخاصة. ولمشاركة الحالة بين المكوّنات، استدعِ ref() على مستوى الوحدة (خارج دالة Composable).
// Shared state (module-level):
const sharedCount = ref(0);
export function useSharedCounter() {
// All callers share the same sharedCount
return { count: sharedCount, increment: () => sharedCount.value++ };
}مكتبات Composables
توفّر VueUse (vueuse.org) أكثر من 200 Composable جاهزة للاستخدام، مثل useLocalStorage وuseFetch وuseDark وuseIntersectionObserver وغيرها الكثير. تحقّق دائمًا من VueUse قبل كتابة الحل من الصفر.
اختبار Composables
اختبر Composables باستدعائها داخل مكوّن اختبار صغير، أو باستخدام نمط mountedApp في @vue/test-utils. يتكامل Vitest جيدًا مع نظام التفاعلية في Vue.
اصطلاحات تسمية Composables
ابدأ الاسم دائمًا بـuse (مثل useAuth وuseFetch وuseMediaQuery). واجعل كل Composable مركّزة على مسؤولية واحدة. وتجنّب Composables التي تنفّذ مهام كثيرة غير مترابطة.
تنظيم Composables
أنشئ مجلد composables/. خصّص ملفًا واحدًا لكل Composable. وأعد تصدير جميع Composables من ملف الفهرس. وهذا يحاكي طريقة تنظيم custom hooks في مشاريع React.
تحقّق سريعًا
ما الميزة الأساسية لـComposables مقارنةً بـVue mixins؟
مراجعة: Vue Composables
Composable هي دالة يبدأ اسمها بـuse وتستدعي خطافات Composition API. يحصل كل مستدعٍ على حالة مستقلة، ما لم تستخدم مراجع على مستوى الوحدة. اقبل المراجع أو القيم باستخدام MaybeRef وunref. سجّل خطافات دورة الحياة داخل Composables. تحقّق من VueUse قبل كتابة Composable خاصة بك. وتمنع القيم المُعادة صراحةً تلوّث مساحة الأسماء بأسلوب mixins.
الأسئلة الشائعة
هل درس «Composables: دوال التركيب القابلة لإعادة الاستخدام» مجاني؟
نعم — نص درس «Composables: دوال التركيب القابلة لإعادة الاستخدام» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ماذا ستتعلم في «Composables: دوال التركيب القابلة لإعادة الاستخدام»؟
استخرج المنطق التفاعلي إلى دوال Composable تبدأ بـ use، وشاركها بين المكوّنات، وافهم اختلافها عن mixins. تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟
لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «Composables: دوال التركيب القابلة لإعادة الاستخدام»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟
نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ref() وreactive()
- computed() وwatch()
- الدالة setup() وscript setup
- Composables: دوال التركيب القابلة لإعادة الاستخدام