как изменить функцию регистра редуктора на неизменяемый JS - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть код для обновления значения счетчика объекта.Теперь мне нужно преобразовать его в immutable.js.я довольно плохо знаком с immutable.js.Так как я могу преобразовать этот код в формат immutable.js.

import * as actionTypes from '../actions/actionTypes';

const initialState={
    ingredients: {
        salad:0,
        meat:0,
        cheese:0,
    },
    totalprice:40
}
const ingredientCost = {
    cheese:20,
    meat:30,
    salad:10,
};

const reducer = (state = initialState, action) => {
    switch (action.type) {
        case actionTypes.ADD_INGREDIENT:
            return {
                ...state,
                ingredients:{
                    ...state.ingredients,
                    [action.ingredientName] : state.ingredients[action.ingredientName]+1
                },
                totalprice: state.totalprice + ingredientCost[action.ingredientName],
            };
        case actionTypes.REMOVE_INGREDIENT:
        return {
            ...state,
            ingredients:{
                ...state.ingredients,
                [action.ingredientName] : state.ingredients[action.ingredientName]-1,
            },
            totalprice: state.totalprice - ingredientCost[action.ingredientName],
        };
        default:
            return state;
    }
};
export default reducer;

Я пытался изменить код в неизменяемый формат:

import * as actionTypes from '../actions/actionTypes';
import  Immutable  from 'immutable';


const initialState=Immutable.fromJS({
    ingredients: {
        salad:0,
        meat:0,
        cheese:0,
    },
    totalprice:40
})
const ingredientCost = {
    cheese:20,
    meat:30,
    salad:10,
};

const reducer = (state = initialState, action) => {
    switch (action.type) {
        case actionTypes.ADD_INGREDIENT:
            return state.ingredients[action.ingredientName].merge(state.ingredients[action.ingredientName]+1)    
        case actionTypes.REMOVE_INGREDIENT:
        return {
            ...state,
            ingredients:{
                ...state.ingredients,
                [action.ingredientName] : state.ingredients[action.ingredientName]-1,
            },
            totalprice: state.totalprice - ingredientCost[action.ingredientName],
        };
        default:
            return state;
    }
};
export default reducer;

, но при этом я не могуобновить состояние.Я получаю исходное состояние, но не знаю, как его обновить.

заранее спасибо

1 Ответ

0 голосов
/ 21 ноября 2018

, поскольку initialState является неизменным объектом, Вы не можете использовать state.ingredients, Вам следует использовать

  • state.set() / state.setIn() или
  • state.update() / state.updateIn() или
  • state.merge() / state.mergeIn()

читать: https://facebook.github.io/immutable-js/docs/#/Map

...