Rayden Storm نشر 23 فبراير 2021 أرسل تقرير نشر 23 فبراير 2021 كيف أضيف عنصر الى قائمة لتغيير reducer state ؟ import {ADD_ITEM} from '../Actions/UserActions' const initialUserState = { arr:[] } export default function userState(state = initialUserState, action) { console.log(arr); switch (action.type) { case ADD_ITEM: return { ...state, arr: state.arr.push([action.newItem]) } default: return state } اقتباس
0 Salah Eddin Beriani2 نشر 23 فبراير 2021 أرسل تقرير نشر 23 فبراير 2021 هناك خياران مختلفان لإضافة عنصر إلى قائمة بدون تغيير ال state الأصلي: case ADD_ITEM : return { ...state, arr: [...state.arr, action.newItem] } أو case ADD_ITEM : return { ...state, arr: state.arr.concat(action.newItem) } اقتباس
0 أحمد حبنكة نشر 23 فبراير 2021 أرسل تقرير نشر 23 فبراير 2021 بما أن توابع redux يجب أن تكون pure أي لا يجوز التعديل على state object يدوياً بل إرجاع object جديد مختلف عن السابق إن أردنا التعديل، وفق هذا المبدأ فإن هذا السطر: arr: state.arr.push([action.newItem]) خاطئ ﻷنه يعدل على المصفوفة بشكل مباشر، الحل هو التالي: arr: [...state.arr,action.newItem] السطر السابق يستعمل ميزة array rest حيث تنتج مصفوفة جديدة فيها كل عناصر state.arr ومضافاً إليها action.newItem، يمكن استخدام ميزة array rest لدمج مصفوفتين أيضاً بالشكل اﻵتي: arr: [...state.arr,...action.newItems] ويمكن إضافة عنصر في بداية المصفوفة بدلاً من نهايتها هكذا: arr: [action.newItem,...state.arr] بالمناسبة أنا أنصحك أن تتعلم redux-toolkit وتستخدمها في جميع مشاريع redux وهذا ما ينصح به فريق مطوري redux، لماذا؟ ﻷن مثالك بعد redux-toolkit يمكن استبداله بالكود التالي: import {createSlice} from "@reduxjs/toolkit"; const slice = createSlice({ name: "items", initialState: [], reducers: { addItem(state,action){ state.arr.push(action.payload); } } }); const {actions,reducer} = slice; const {addItem} = actions; export default reducer; export addItem; // addItem is an action creator so we dispatch it like this dispatch(addItem(newItem)); لاحظ أننا استعملنا state.arr.push وهذا صحيح ﻷن redux-toolkit تستعمل مكتبة اسمها immer التي تعمل بالطريقة التالية: الـstate الممرر في addItem method هو draft State object مختلف عن state object المخزن داخل redux ، كل تعديل على هذا draft object تلتقطه مكتبة immer المستعملة من قبل redux-toolkit، عند اﻻنتهاء من التعديلات ترجع مكتبة immer كائن object جديد مختلف عن state object القديم وفيه التعديلات المطلوبة. يمكنك قراءة المزيد عن redux-toolkit هنا ويمكنك قراءة المزيد عن مكتبة immer وفهمها أكثر هنا 1 اقتباس
السؤال
Rayden Storm
كيف أضيف عنصر الى قائمة لتغيير reducer state ؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.