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

كيف أقوم بتقليل initialState باستخدام الريدكس .. عندما يكون داخل مصفوفة وليس أوبجكت

Ahmed Sawy

السؤال

السلام عليكم .. كيف أجعل هذا ال reducer يقلل الكمبية بمقدار 1  فى ال initState الخاصة ب cakes.qty فى كل مرة اقوم بعمل dispatch للأكشن .. 

هذا هو الكود 

// Here is The Reducer

import { SELL_ONE_CAKE } from "./types";

const initialState = {
  cakes: [
    {
      id: 1,
      title: "Classic Cake",
      qty: 40,
      price: 15,
    },
    {
      id: 2,
      title: "Chocolate Cake",
      qty: 10,
      price: 20,
    },
    {
      id: 3,
      title: "Simple White Cake",
      qty: 40,
      price: 30,
    },
  ],
};


// I Think The problem is here

export const reducer = (state = initialState, action) => {
  switch (action.type) {
    case SELL_ONE_CAKE:
      return { ...state, cakes: state.cakes[0].qty - 1 };   // => I Think The problem is Here
    default:
      return state;
  }
};


// The Action

import { SELL_ONE_CAKE } from "./types";

export const sellOneCake = () => ({
  type: SELL_ONE_CAKE,
});


// The Screen

      <Text>porfit: {Profits}</Text>
      <Text>Number Of Cakes: {cakes}</Text>
      <Button title="Sell One Cake" onPress={() => dispatch(sellOneCake())} />

 

فقط أريد أن أعرف ما المفترض أن أكتبه هنا لكى يقل الرقم 

export const reducer = (state = initialState, action) => {
  switch (action.type) {
    case SELL_ONE_CAKE:
      return { ...state, cakes: state.cakes[0].qty - 1 };   // => I Think The problem is Here
    default:
      return state;
  }
};

 

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

Recommended Posts

  • 1

الطريقة التي تعدل بها خاطئة 

بتاريخ 13 ساعات قال Ahmed Sawy:

 


export const reducer = (state = initialState, action) => {
  switch (action.type) {
    case SELL_ONE_CAKE:
      return { ...state, cakes: state.cakes[0].qty - 1 };   // => I Think The problem is Here
    default:
      return state;
  }
};

 

فهنا أنت سيكون الناتج كالآتي

// الجزء الأول صحيح حيث أنك تستخدم الحالة السابقة لكن عند إضافة cakes
// فأنت لا ترجعها مصفوفة وإنما رقم لأنك أسندتها إلى رقم 
{ ...state, cakes: state.cakes[0].qty - 1 };
// ليكون الناتج
/*
{
	cakes: 39
}
*/
  • الحل هو أنك تقوم بالتعديل على ال cakes وتقوم بإرجاع ال array ثم إعطائه لل state
    case SELL_ONE_CAKE:
    	const modifiedCakes = [ ...state.cakes ];
    	modifiedCakes[0].qty -= 1;
    
    	return { ...state, cakes: modifiedCakes };

    وبهذا يتم تعديل الرقم وترجع الحالة كما هي

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

  • 1

لديك مشكلتين أساسيتين في الكود الذي وفرته الاولى هي خطأ في التعديل والثانية هي أنك تحدد ال cake يدويا بالنسبة لمشكلتك الاولى فالحل بسيط 

case SELL_ONE_CAKE:
	const newCakes = [ ...state.cakes ]; نسخ القائمة
	newCakes[0].qty -= 1; تعديل على القائمة

	return { ...state, cakes: newCakes }; لصق القائمة 

أما لمشكلة التعديل اليدوي فيكنك توفير ال id مثلا عندما تقوم بعمل dispatch ثم تقوم باستخدام filter لتحصل على ال index للقيام بعملية التعديل

case SELL_ONE_CAKE:
	let newCakes = state.cakes.filter((cake,i)=> {
 if (cake.id === action.payload.id) {
          index = i; //index is global var
        }
      return  cake.id !== action.payload.id
})
    let modifiedCake = {...state.cake[index],qty:state.cake[index].qty - 1}
    newCakes.splice(index, 0, modifiedCake);

	return { ...state, cakes: newCakes };

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...