اذهب إلى المحتوى
  • 0

مشكل في التعامل مع المصفوفات عند إستعمال الخطافات في react js

محمود سعداوي2

السؤال

السلام عليكم.

في الكود التالي:

  const [seats,setSeats] = useState([]);
  
  const handleSeats = (e) => {
    e.target.classList.toggle('selected');
    if (e.target.classList.contains('selected') && !e.target.classList.contains('occupied')) {
      setSeats([...seats,seats])
      console.log(seats.length)
    } else {
      seats.splice(seats.indexOf(e.target.classList.contains('selected')),1)
      console.log(seats.length)
    }
  }

Capture.JPG.983701cc1248fee56ba2aabc18b9606b.JPG

المشكل هو عندما يصبح الكرسي الأول 'selected' تصير  seats.length = 0

يعني عند النقر مثلا على أربع كراسي تصبح seats.length تساوي 3

بينما، عند إعادة الضغط على كرسي "selected"  طول المصفوفة seats يكون مطابقا.

زد على ذلك،

عند تكون لدي كراسي "selected" ثم أضغط على كراسي محجوزة (باللون الأبيض) يرجع  طول المصفوفة seats إلى الصفر

شكرا لكم.

image.png

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

المشكلة في الكود هي استخدام دالة splice بشكل غير صحيح، حيث أن الدالة تأخذ مؤشر البداية وعدد العناصر التي يجب حذفها من المصفوفة، ولكن في هذه الحالة يتم استخدام e.target.classList.contains('selected') كمؤشر بداية لحذف العنصر المختار، وهذا خاطئ لأن e.target.classList.contains('selected') ليست مؤشرًا بل قيمة بوليانية.

بالإضافة إلى ذلك، يتم إضافة المصفوفة seats دومًا دون حذف الكراسي عند الضغط على كرسي مختار، لذلك ستكون طول المصفوفة متزايدًا بشكل لا نهائي عند النقر على الكراسي المختلفة.

أما عند الضغط على كرسي محجوز فإنه يتم حذف العنصر بشكل صحيح باستخدام splice ولكن القيمة التي يتم إرجاعها لم تعدم الكرسي المحذوف وهذا يؤدي إلى إعادة تعيين طول المصفوفة إلى الصفر.

لحل هذه المشكلة يجب استخدام seats.filter() بدلاً من splice() لإزالة العنصر المختار وإعادة القيم الجديدة للمصفوفة seats. كما يجب إصلاح الجزء المسؤول عن إضافة الكرسي المختار بحيث يتم حذف الكرسي من المصفوفة إذا كان قد تم اختياره مسبقًا.

والأفضل أن يكون الكود  على النحو التالي فهو مختصر:

const [seats, setSeats] = useState([]);

const handleSeats = (e) => {
  e.target.classList.toggle('selected');
  const selectedSeats = document.querySelectorAll('.selected:not(.occupied)');
  const selectedSeatsIds = Array.from(selectedSeats).map(seat => seat.id);
  setSeats(selectedSeatsIds);
}

وهنا، تم استخدام querySelectorAll للعثور على كل العناصر التي تحتوي على الكلاس .selected وليس العناصر التي يتم احتلالها، ثم تم استخدام map لإرجاع مصفوفة الهويات الخاصة بالعناصر المحددة فقط. ثم تم تعيين هذه المصفوفة إلى حالة seats.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...