Hooks: useQuery وuseMutation
اجلب البيانات باستخدام useQuery، ونفّذ عمليات Mutation باستخدام useMutation، وتعامل مع حالات التحميل والخطأ والبيانات
Hooks: useQuery وuseMutation درس مجاني في React Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
تعريف استعلام باستخدام gql
يحلل وسم القالب gql من @apollo/client سلسلة استعلام GraphQL إلى DocumentNode عند تحميل الوحدة. عرّفوا الاستعلامات خارج المكونات: const GET_USERS = gql`query GetUsers { users { id name email } }`.
ملاحظة: في كود الإنتاج، استخدموا سلاسل نصية محاطة بعلامات اقتباس مفردة ولفّوها باستخدام gql كقالب موسوم. يقبل وسم gql صيغة القالب الحرفي في مصدر JavaScript.
القيم التي يعيدها useQuery
يعيد useQuery(GET_USERS) القيمة { loading, error, data, refetch, fetchMore, networkStatus }. تكون loading بالقيمة true أثناء الجلب الأولي. وتحتوي error على أي أخطاء في GraphQL أو الشبكة. أما data فتحتوي على نتيجة الاستعلام المطابقة لبنيته.
تحققوا من loading وerror أولًا قبل الوصول إلى data لتجنب عرض قيم فارغة.
أنماط واجهة التحميل والخطأ
اعرضوا مكوّنًا هيكليًا عندما تكون loading بالقيمة true. واعرضوا رسالة خطأ إذا كانت error معرّفة (استخدموا error.message لنص الخطأ). ولا تعرضوا المحتوى الفعلي إلا عندما تكون data معرّفة وتكون loading بالقيمة false.
يُعد هذا النمط ثلاثي الحالات (loading / error / data) البنية القياسية لمكوّنات Apollo Client.
الوصول إلى بيانات الاستعلام
يعكس كائن data بنية استعلام GraphQL. في الاستعلام query { users { id name } }، يمكنك الوصول إلى data.users، وهي مصفوفة من الكائنات {id, name}. وتتطابق أنواع TypeScript عند استخدام graphql-codegen لتوليد الخطافات المعرّفة الأنواع.
من دون codegen، تكون data من النوع any. ومع codegen، يعيد useQuery بيانات مكتملة الأنواع تلقائيًا.
المتغيرات في useQuery
مرروا المتغيرات كوسيط ثانٍ: useQuery(GET_USER, { variables: { id: userId } }). يُعاد تشغيل الاستعلام تلقائيًا عند تغيّر userId، تمامًا كما يحدث مع مصفوفة تبعيات useEffect.
يخزّن Apollo Client كل تركيبة فريدة من الاستعلام والمتغيرات بشكل منفصل، ولذلك يملك GET_USER مع id: "1" وGET_USER مع id: "2" إدخالين مستقلين في الذاكرة المؤقتة.
تخطي استعلام
مرروا skip: true في الخيارات لمنع تشغيل الاستعلام: useQuery(GET_USER, { skip: !userId }). لا يرسل Apollo الطلب عندما تكون skip بالقيمة true، وتكون loading بالقيمة false، بينما تكون data غير معرّفة.
هذا هو النظير في Apollo لمفتاح SWR ذي القيمة null وخيار React Query enabled: false.
إعادة الجلب يدويًا
تطلق الدالة refetch التي يعيدها useQuery طلب شبكة بغض النظر عن سياسة الجلب. استدعوا refetch() بعد إجراء من المستخدم قد يكون قد غيّر بيانات الخادم، مثلًا refetch() بعد إرسال نموذج.
مرروا متغيرات جديدة إلى refetch: refetch({ id: newId }) لإعادة الجلب باستخدام معاملات مختلفة.
تتبّع حالة الشبكة
مرروا notifyOnNetworkStatusChange: true في الخيارات لتلقي تحديثات عند تغيّر حالة الشبكة (الجلب وإعادة الجلب والاستقصاء وغير ذلك). يحتوي الحقل networkStatus على رمز رقمي من التعداد NetworkStatus.
يتيح ذلك عرض مؤشر دقيق يفيد بأن التحديث جارٍ أثناء إعادة الجلب في الخلفية، من دون إخفاء البيانات الحالية.
توقيع useMutation
يعيد useMutation(CREATE_USER) القيمة [mutateFunction, { loading, error, data, reset }]. وتُستدعى دالة mutate عندما يرسل المستخدم نموذجًا. وهي تعيد Promise يحتوي على { data, errors }.
استدعوا mutate({ variables: { name: 'Alice', email: 'alice@example.com' } }) لتمرير الإدخال إلى الطفرة.
ردا النداء onCompleted وonError
مرروا onCompleted: (data) => navigate('/dashboard') وonError: (error) => showToast(error.message) إلى خيارات useMutation. ويُستدعى هذان الردّان بعد نجاح الطفرة أو رفضها.
يتلقى onCompleted بيانات نتيجة الطفرة، وهو مفيد لتشغيل التنقل، وعرض رسائل النجاح، أو إعادة تعيين النماذج.
الاستجابة التفاؤلية في useMutation
يكتب الخيار optimisticResponse في استدعاء mutate نتيجة اصطناعية إلى الذاكرة المؤقتة فورًا قبل استجابة الخادم. ويعرض Apollo البيانات التفاؤلية مباشرة، ثم يستبدلها باستجابة الخادم الفعلية عند وصولها.
إذا فشلت الطفرة، يعيد Apollo الحالة السابقة للذاكرة المؤقتة تلقائيًا، مما يحافظ على اتساق واجهة المستخدم.
خيار useQuery skip
ماذا يحدث لاستدعاء useQuery عند تمرير skip: true؟
مراجعة الدرس
عرّفوا الاستعلامات باستخدام وسم gql، واستدعوا useQuery(QUERY, { variables, skip })، وعالجوا حالات loading وerror وdata. يعيد useMutation دالة تشغيل وكائن حالة؛ استدعوه مع المتغيرات وعالجوا النتائج باستخدام onCompleted وonError. تحدّث الاستجابات التفاؤلية الذاكرة المؤقتة فورًا مع التراجع التلقائي عند الفشل.
يتولى خيار skip وإعادة الجلب المعتمدة على المتغيرات تحميل البيانات المشروط والمحدد بالمعاملات.
الأسئلة الشائعة
هل درس «Hooks: useQuery وuseMutation» مجاني؟
نعم — نص درس «Hooks: useQuery وuseMutation» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «Hooks: useQuery وuseMutation»؟
اجلب البيانات باستخدام useQuery، ونفّذ عمليات Mutation باستخدام useMutation، وتعامل مع حالات التحميل والخطأ والبيانات تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «Hooks: useQuery وuseMutation»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات GraphQL لمطوّري React
- إعداد Apollo Client في React
- Hooks: useQuery وuseMutation
- ذاكرة Apollo المؤقتة: التطبيع والتحديثات