Вложенные объекты становятся пустыми после глубокого клонирования - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть объект, который пытается слишком глубоко клонировать его перед мутацией в Redux, но вложенные объекты становятся пустыми после глубокого клонирования с помощью lodash или json

const initial = {
   infamy: {a: 1}
}

export const playerReducer = (state = initial, action) => {
  switch (action.type) {
    case SET_DATA:
      console.log("III", state);
      state = cloneDeep(state); //Why the neseted obj becomes empty?
      console.log("JJJ", state);
      break;
  }
};

Edit: Похоже, проблема была в том, что у меня было условие проверить, не был ли объект пустым, поэтому пустые данные из API заменяли начальные значения, но мне было понятно, почему console.log показывал мутацию, сделанную после, а не предварительно сделанную. мутация

case SET_DATA:
      console.log("III", state);
      const nextState = cloneDeep(state);
      console.log("JJJ", nextState); //why the log shows the change in line 10 made? shouldn't it log the values then change happen?
      nextState.membershipId = action.payload.membershipId;
      nextState.membershipType = action.payload.membershipType;
      nextState.displayName = action.payload.displayName;
      console.log(action.payload.gambitStats);
      if (action.payload.gambitStats.allTime !== "undefined") { //the bug is here
        nextState.gambitStats = cloneDeep(action.payload.gambitStats);
        nextState.infamy = cloneDeep(action.payload.infamy);
      }
      return nextState;

Ответы [ 2 ]

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

Вы проверяете undefined как строку "undefined" вместо:

if (action.payload.gambitStats.allTime !== undefined) { ...

или просто:

if (!!action.payload.gambitStats.allTime)
0 голосов
/ 19 ноября 2018

В принципе, я бы сказал, что state не будет очищен при использовании только cloneDeep.

С другой стороны, я вижу, что вы используете шаблон Redux, и вы не должнынепосредственно манипулируйте состоянием.

Вместо этого вы должны вернуть следующее состояние, а также вернуть текущее состояние по умолчанию.

const initial = {
   infamy: {a: 1}
}

export const playerReducer = (state = initial, action) => {
  switch (action.type) {
    case SET_DATA:
      const nextState = cloneDeep(state);
      // Modify nextState according to the intent of your action
      return nextState;

    default:
      return state;
  }
};

Надеюсь, это поможет.:)

...