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

السؤال

نشر

مرحبا أنا اواجه مشكلة في استخدام switch statement في ال reducer داخل redux والمشكلة أنني احتاج تعيين متغير جديد داخل كل case لكن أريده بنفس الاسم لأنه لنفس الغرض لكن يجب ان يكون خاص لكل case على حدى

const cartReducer = (state = initialState, action) => {
  switch (action.type) {
    case QNT_UP:
      let index;
      //.....
      break;
    case QNT_DOWN:
      let index;
      //.....
      break;

    default:
      return state;
  }
};

الحل الذي توصلت له هو تعيين المتغيير خارج ال cartReducer وهكذا سيصبح عام ولكنني أريده كما في الكود في الاعلى لأغراض خاصة بتتمة الشيفرة.

شيفرة الswitch في الاعلى كبيرة جدا لذا لم أرفق باقي الشيفرة ليسهل عليكم مساعدتي في معالجة المشكل 

Recommended Posts

  • 1
نشر

المشكلة رائعة هنا لأنها تفرض علينا مراجعة أساس من أساسيات javascript وهو ال scops ولنسياننا أحيانا لهذا الأساس نفكر داءما في جعل متغيراتنا عامة وهذا هو أيضا اول حل أفكر فيه داءما ايضا لكن يعتبر حل ليس بجيد لذا فلنراجع أساس ال scops ونجد حل .

أول مثال يعرض علينا داءما عندما نتطرق الى موضوع ال scops هو المتغير داخل دالة و متغير خارجها هكذا

let num = 5
console.log(num)//5

function number(){
let num = 8
return num
}

console.log(number())//8

ولكن ال scops لا تقتصر فقط على داخل دالة أو خارجها فيمكنك حرفيا انشاء scop فقط ب {}

let num = 5
console.log(num)//5

{
let num = 8
console.log(num)//8
}

في حالتك يمكنك انشاء scope داخل ال case ب {}

const cartReducer = (state = initialState, action) => {
  switch (action.type) {
    case QNT_UP:
    {
      let index;
      //.....
      break;
    }
    case QNT_DOWN:
    {
      let index;
      //.....
      break;
    }

    default:
      return state;
  }
};

 

  • 0
نشر

السبب في عدم مقدرتك على استخدام نفس المتحول هو أن case بشكل افتراضي لا تعرف scope جديد لذلك كل متحول يعرف داخلها هو فعلياً يعرف داخل scope الخاص بالـswitch كونك تستخدم let وليس var.

لكن حل مشكلتك أسهل بكثير مما تظن وهو كالتالي:

const cartReducer = (state = initialState, action) => {
  switch (action.type) {
    case QNT_UP:{
      let index;
      //.....
      break;
    }
    case QNT_DOWN:{
      let index;
      //.....
      break;
    }
    default:
      return state;
  }
};

بتعريف block جديد أمام case صار لدينا scope جديد مختلف عن scope الخاص بالـswitch وكل case لها scope جديد مختلف اﻵن لذلك ستعمل تعليمة let ولن يحدث خطأ.

بالطبع الطريقة السابقة ستعمل فقط باستخدام let أو const وليس var ﻷن المتحولات المعرفة بـvar تنتمي للـscope الخاصة بالتابع الذي يعرف فيه المتحول.

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...