0Pricing
React Academy · درس

تحريكات موجّهة بالإيماءات باستخدام use-gesture

ادمج react-spring مع @use-gesture/react لبناء تحريكات تعتمد على السحب والتكبير والتمرير

تحريكات موجّهة بالإيماءات باستخدام use-gesture درس مجاني في React Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.

نظرة عامة على @use-gesture/react

@use-gesture/react هي مكتبة للتعرّف على الإيماءات، صُممت لتعمل بسلاسة مع react-spring. تتعرّف على إيماءات السحب، القرص، التمرير، التحويم، الحركة، وعجلة التمرير، وتوفّر حالة إيماءات موحّدة تمرّرها مباشرةً إلى دوال ضبط النابض لإنشاء تفاعلات سلسة قائمة على الفيزياء.

حالة إيماءة useDrag

يستدعي الخطاف useDrag دالة callback عند كل حدث سحب. وتتلقى الدالة كائنًا لحالة الإيماءة يتضمن خصائص أساسية: movement (الإزاحة الكلية منذ بدء السحب)، velocity (السرعة الحالية)، direction (1 أو -1 لكل محور)، first (تكون قيمته true عند بدء السحب)، last (تكون قيمته true عند انتهاء السحب)، وevent (حدث DOM الخام).

دالة bind()

تعيد جميع خطافات use-gesture دالة bind(). ويعيد استدعاء bind() كائنًا من خصائص معالجات الأحداث مثل (onPointerDown وonTouchStart وغيرها)، ويمكنك نشر هذه الخصائص على العنصر الذي تريد جعله تفاعليًا. وهذه هي نقطة الربط بين متعرّف الإيماءات وعنصر DOM الخاص بك.

دمج useDrag مع react-spring

النمط المعتاد هو إنشاء نابض باستخدام الواجهة البرمجية الإجرائية ([springs, api] = useSpring(...))، ثم استخدام useDrag لاستدعاء api.start({ x: movement[0], y: movement[1] }) عند كل حدث سحب. يتبع النابض حركة السحب بسلاسة، ويضيف فيزياء طبيعية إلى ما كان سيصبح بخلاف ذلك تتبعًا جامدًا للمؤشر.

العودة إلى الموضع الأصلي عند الإفلات

عند انتهاء السحب (حيث تكون last: true في حالة الإيماءة)، تعيد عادةً العنصر إلى موضعه الأصلي. استدعِ api.start({ x: 0, y: 0 }) داخل شرط if (last). يحرّك react-spring العنصر إلى موضعه الأصلي بفيزياء النابض، مع ارتداد لطيف بدلًا من إعادة ضبط فورية، ما يمنح التفاعل إحساسًا فيزيائيًا مُرضيًا.

القذف والانطلاق باستخدام السرعة

تتيح قيمة velocity في حالة الإيماءة تنفيذ سلوك القذف. فعندما يحرّر المستخدم العنصر بسرعة عالية، يمكنك قذفه في اتجاه السحب بدلًا من إعادته إلى موضعه الأصلي. تحقّق من if (last && velocity[0] > threshold)، ثم حرّك العنصر إلى موضعه النهائي خارج الشاشة. وهذا أساسي لتفاعلات السحب للإغلاق.

حدود السحب وحصر الحركة

لتقييد حركة السحب داخل حاوية، احصر قيم الحركة قبل تمريرها إلى النابض: x: Math.max(-maxX, Math.min(maxX, movement[0])). أو استخدم الخيار المدمج bounds في use-gesture: useDrag(handler, { bounds: { left: -100, right: 100 } }) لحصر حالة الإيماءة تلقائيًا.

نمط السحب للإغلاق

لتنفيذ السحب للإغلاق على الأجهزة المحمولة، استخدم useDrag لتتبّع الحركة الأفقية. إذا حرّر المستخدم العنصر بسرعة تتجاوز حدًا معينًا أو حرّكه مسافة تزيد على نصف عرض الشاشة، فحرّك البطاقة خارج الشاشة (api.start({ x: window.innerWidth })) ثم أزلها من القائمة. وإلا فأعدها إلى المركز.

استخدام usePinch لتفاعلات التكبير

يتعرّف usePinch على إيماءات القرص بإصبعين على شاشات اللمس، وعلى Ctrl+wheel على أجهزة سطح المكتب. وتتضمن حالة الإيماءة scale (مستوى التكبير الحالي مقارنةً ببداية القرص) وorigin (النقطة المركزية للقرص). اربط ذلك بنابض يتتبع مقياس التكبير لإنشاء تفاعلات تكبير سلسة ومحدودة على الصور أو الخرائط.

useHover وuseMove

يستدعي useHover دالة عند دخول المؤشر إلى عنصر أو مغادرته، ويوفّر قيمة منطقية باسم active. ويتتبع useMove موضع الفأرة داخل العنصر، ويوفّر إحداثيات موحّدة. ويفيد كلاهما في إنشاء تأثيرات تحويم مغناطيسية تتحرك فيها العناصر قليلًا نحو المؤشر عند اقترابه.

دمج إيماءات متعددة

يمكن تركيب خطافات use-gesture معًا. يمكنك استخدام useDrag وusePinch على العنصر نفسه: const bindDrag = useDrag(...); const bindPinch = usePinch(...)، ثم نشر دالتي الربط كلتيهما: ...bindDrag() ...bindPinch(). ويتولى use-gesture تلقائيًا التمييز بين أنواع الإيماءات.

الغرض من دالة bind()

ما وظيفة الدالة bind() التي تعيدها خطافات use-gesture؟

مراجعة الدرس: دمج use-gesture

يوفّر @use-gesture/react الخطافات useDrag وusePinch وuseScroll وuseHover وuseMove. ويعيد كل خطاف دالة bind()، whose نشر نتيجتها يربط أحداث الإيماءات بعناصر DOM. وتوفّر حالة الإيماءة movement وvelocity وdirection وfirst وlast. ادمجها مع api.start() الإجرائية في react-spring لإنشاء رسوم متحركة تفاعلية قائمة على الفيزياء. استخدم velocity للقذف والإغلاق، وbounds لحصر الحركة.

الأسئلة الشائعة

هل درس «تحريكات موجّهة بالإيماءات باستخدام use-gesture» مجاني؟

نعم — نص درس «تحريكات موجّهة بالإيماءات باستخدام use-gesture» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.

ماذا ستتعلم في «تحريكات موجّهة بالإيماءات باستخدام use-gesture»؟

ادمج react-spring مع @use-gesture/react لبناء تحريكات تعتمد على السحب والتكبير والتمرير تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟

لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «تحريكات موجّهة بالإيماءات باستخدام use-gesture»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟

نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات React Spring: ‏useSpring Hook
  2. المكوّنات المتحركة واستيفاء الأنماط
  3. ‏useTrail وuseChain للتسلسلات
  4. تحريكات موجّهة بالإيماءات باستخدام use-gesture
← العودة إلى React Academy