"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > القوائم المنسدلة الذكية في رد الفعل: استخدام useReducer وuseRef للتعامل مع النقرات الخارجية

القوائم المنسدلة الذكية في رد الفعل: استخدام useReducer وuseRef للتعامل مع النقرات الخارجية

تم النشر بتاريخ 2024-11-03
تصفح:849

Smart Dropdowns in React: Using useReducer and useRef for Outside Click Handling

كيفية إنشاء قائمة منسدلة في React باستخدام Tailwind CSS باستخدام useReducer وuseRef

يمكن أن يؤدي إنشاء قوائم منسدلة في تطبيق React إلى تحسين تجربة المستخدم من خلال توفير طريقة مدمجة للتنقل والوصول إلى المعلومات الإضافية. في هذا الدليل، سننفذ قائمتين منسدلتين — واحدة للإشعارات والأخرى لإعدادات ملف تعريف المستخدم — باستخدام useReducer لإدارة الحالة وuseRef للتعامل مع النقرات الخارجية لإغلاق القوائم المنسدلة. سنقوم أيضًا بدمج أيقونات Font Awesome للحصول على مظهر مصقول.

مقدمة

في تطوير الويب الحديث، تعد إدارة واجهات المستخدم بكفاءة أمرًا بالغ الأهمية. توفر React، جنبًا إلى جنب مع Tailwind CSS، مجموعة أدوات قوية لإنشاء مكونات سريعة الاستجابة. سنتعلم كيفية التعامل مع وظيفة القائمة المنسدلة في React، مع التأكد من أن النقر خارج القائمة المنسدلة سيؤدي إلى إغلاقها، مع الحفاظ على القدرة على فتح أو إغلاق كل قائمة منسدلة بشكل مستقل.

ما هي useReducer وuseRef؟

قبل الغوص في الكود، دعونا نفهم خطافتي React اللتين سنستخدمهما:

  • useReducer: هذا الخطاف هو بديل لـ useState لإدارة الحالة في المكونات الوظيفية. إنه مفيد بشكل خاص لإدارة منطق الحالة المعقد ومتغيرات الحالة المتعددة. يأخذ الخطاف useReducer وظيفة مخفض وحالة أولية، ويعيد الحالة الحالية ووظيفة إرسال لتحديث تلك الحالة.

  • useRef: يوفر هذا الخطاف طريقة للإشارة إلى عناصر DOM مباشرة. إنه مفيد للوصول إلى العناصر ومعالجتها دون تشغيل عمليات إعادة العرض. في حالتنا، سوف نستخدم useRef للتحقق مما إذا كانت النقرة قد حدثت خارج القوائم المنسدلة.

التنفيذ خطوة بخطوة

الخطوة 1: إعداد المشروع

أولاً، تأكد من إعداد مشروع React باستخدام Tailwind CSS. إذا لم يكن لديك واحدًا، فيمكنك إنشائه باستخدام تطبيق إنشاء React:

npx create-react-app my-dropdown-app
cd my-dropdown-app
npm install tailwindcss
npx tailwindcss init

قم بتكوين Tailwind عن طريق إضافة الأسطر التالية إلى tailwind.config.js:

module.exports = {
  purge: ['./src/**/*.{js,jsx,ts,tsx}', './public/index.html'],
  darkMode: false,
  theme: {
    extend: {},
  },
  variants: {
    extend: {},
  },
  plugins: [],
};

بعد ذلك، قم بإضافة توجيهات Tailwind إلى ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ملف ارتباط بـبببببببببببببببببببببببببببببببببببببببب الموجودة

@قاعدة تيلويند؛ مكونات @tailwind؛ @tailwind المرافق.
@tailwind base;
@tailwind components;
@tailwind utilities;
الخطوة 2: تثبيت الخط Awesome

لاستخدام أيقونات Font Awesome، تحتاج إلى تثبيت حزمة @fortawesome/react-fontawesome:


تثبيت npm @fortawesome/react-fontawesome @fortawesome/free-solid-svg-icons
@tailwind base;
@tailwind components;
@tailwind utilities;
الخطوة 3: إنشاء مكون Navbar

في دليل src الخاص بك، قم بإنشاء ملف جديد باسم Navbar.tsx. سيحتوي هذا المكون على القوائم المنسدلة.

تنفيذ كود Navbar

إليك الكود الخاص بمكون Navbar، الذي يستخدم useReducer وuseRef للتعامل مع الحالات المنسدلة والنقرات الخارجية.


استيراد React, { useRef, useEffect, useReducer } من "react"; استيراد {رابط} من "react-router-dom"؛ استيراد { FontAwesomeIcon } من '@fortawesome/react-fontawesome'؛ استيراد { faBell، faUser، faCaretDown } من '@fortawesome/free-solid-svg-icons'؛ واجهة اي ستيت { isProfileOpen: boolean; isNotificationOpen: boolean; } اكتب الإجراء = | { النوع: "تبديل الملف الشخصي" } | { النوع: 'تبديل الإشعارات' } | { النوع: 'إغلاق الكل' }; مخفض الوظيفة (الحالة: IState، الإجراء: الإجراء): IState { التبديل (نوع العمل) { حالة "تبديل الملف الشخصي": يعود { isProfileOpen: !state.isProfileOpen, isNotificationOpen: خطأ }; حالة "تبديل الإشعارات": يعود { isProfileOpen: خطأ، isNotificationOpen: !state.isNotificationOpen }; حالة "إغلاق الكل": يعود { isProfileOpen: خطأ، isNotificationOpen: خطأ }; تقصير: حالة العودة } } شريط التنقل const: React.FC = () => { const [state, send] = useReducer(reducer, { isProfileOpen: false, isNotificationOpen: false }); const ProfileDropdownRef = useRef(null); const notificationDropdownRef = useRef(null); استخدام التأثير (() => { const HandleClickOutside = (الحدث: MouseEvent) => { هدف ثابت = حدث.target كعقدة؛ لو ( (profileDropdownRef.current && !profileDropdownRef.current.contains(target)) || (notificationDropdownRef.current && !notificationDropdownRef.current.contains(target)) ) { الإرسال({ النوع: 'CloseAll' }); } }; document.addEventListener("mousedown", HandleClickOutside); العودة () => { document.removeEventListener("mousedown", HandleClickOutside); }; }, []); const toggleProfileDropdown = (الحدث: React.MouseEvent) => { Event.stopPropagation(); الإرسال({ النوع: 'toggleProfile' }); }; const toggleNotificationDropdown = (الحدث: React.MouseEvent) => { Event.stopPropagation(); إرسال({ النوع: 'toggleNotification' }); }; const CloseDropdowns = () => { الإرسال({ النوع: 'CloseAll' }); }; عناصر الإخطار ثابت = [ { النص: "تم استلام بيانات جديدة"، الوقت: "منذ يومين" }، { النص: "يتوفر تحديث جديد"، الوقت: "منذ يوم واحد" }، { النص: "صيانة مجدولة"، الوقت: "منذ 3 أيام" }, ]; عناصر الملف الشخصي الثابتة = [ { التسمية: "الملف الشخصي"، الرابط: "#" }، {التسمية: "الإعدادات"، الرابط: "#" }، {التسمية: "تسجيل الخروج"، الرابط: "#" } ]; يعود (
); }; تصدير شريط التنقل الافتراضي؛
@tailwind base;
@tailwind components;
@tailwind utilities;
الخطوة 4: دمج شريط التنقل في تطبيقك

افتح ملف App.tsx الخاص بك وقم باستيراد مكون Navbar لتضمينه في تخطيط التطبيق الخاص بك.


استيراد رد فعل من "رد فعل"؛ استيراد { BrowserRouter كجهاز توجيه } من 'react-router-dom'؛ استيراد شريط التنقل من "./components/Navbar"؛ تطبيق const: React.FC = () => { يعود (

مرحبًا بك في لوحة تحكم DC!

{/* المكونات والمحتوى الآخر * /} الرئيسية> جهاز التوجيه> ); }; تصدير التطبيق الافتراضي؛
@tailwind base;
@tailwind components;
@tailwind utilities;
الخطوة 5: التصميم باستخدام Tailwind CSS

يجب أن توفر الفئات المقدمة من Tailwind CSS بالفعل تصميمًا أنيقًا. ومع ذلك، لا تتردد في تخصيص الأنماط حسب الحاجة.

الخطوة 6: اختبار التطبيق

ابدأ التطبيق الخاص بك عن طريق تشغيل:


سحق بداية npm
@tailwind base;
@tailwind components;
@tailwind utilities;
من المفترض الآن أن تشاهد شريط التنقل أعلى التطبيق الخاص بك مع القوائم المنسدلة الوظيفية للإشعارات وإعدادات ملف تعريف المستخدم.

التعليمات

1. كيف يعمل الخطاف useReducer في هذا المثال؟

يتيح لنا خطاف useReducer إدارة حالة القوائم المنسدلة المتعددة بكفاءة. نحدد وظيفة المخفض التي تأخذ الحالة الحالية وإجراءًا لإرجاع الحالة الجديدة. يعد هذا النمط مفيدًا لتبديل القوائم المنسدلة والتعامل مع المنطق الخاص بإغلاق جميع القوائم المنسدلة مرة واحدة.

2. لماذا نستخدم المرجع؟

نستخدم useRef للإشارة إلى عناصر القائمة المنسدلة. يتيح لنا هذا التحقق مما إذا كان حدث النقر قد حدث خارج هذه العناصر. إذا حدث ذلك، فإننا نرسل إجراءً لإغلاق القوائم المنسدلة، مما يضمن تجربة مستخدم نظيفة.

3. هل يمكنني إضافة المزيد من القوائم المنسدلة؟

نعم! يمكنك تمديد الحالة في المخفض وإضافة المزيد من القوائم المنسدلة بالمثل. فقط تأكد من أن كل قائمة منسدلة لها مرجعها الخاص ووظيفة التبديل.

4. هل Tailwind CSS ضروري لهذا التنفيذ؟

لا، Tailwind CSS ليس إلزاميًا. يمكنك تصميم قوائمك المنسدلة باستخدام أي إطار عمل CSS أو أنماط CSS مخصصة، ولكن Tailwind يجعل التصميم أسرع وأكثر استجابة.

خاتمة

تعلمت في هذا الدليل كيفية إنشاء قائمة منسدلة وظيفية في React باستخدام useReducer لإدارة الحالة وuseRef للتعامل مع النقرات الخارجية. يوفر هذا الأسلوب طريقة نظيفة وفعالة لإدارة تفاعلات واجهة المستخدم المعقدة، مما يعزز تجربة المستخدم الشاملة. لا تتردد في البناء على هذا الأساس وتخصيصه ليناسب احتياجات تطبيقك!

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/chintanonweb/smart-dropdowns-in-react-using-usereducer-and-useref-for-outside-click-handling-138h?1 إذا كان هناك أي انتهاك، من فضلك اتصل بـ [email protected]
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3