Почему это состояние мутирует immer? - PullRequest
0 голосов
/ 29 января 2020

Я получаю ошибку мутации состояния при использовании продукта Иммера для манипулирования состоянием.

Когда я вручную создаю тестовый интерфейс в том же редукторе и производим вызов, кажется, что он работает должным образом:

export interface ItemSliceState {
  items: Array<IItem> | null | undefined;
}

export const initialState: ItemSliceState = { items: [] };

export const updateItem: CaseReducer<
  ItemSliceState,
  PayloadAction<IItem | null | undefined>
> = (state: ItemSliceState = initialState, action) => {

  const testItem: IItem = {
    status: 1
  };

  const testItems: Array<IItems> = [testItem];

  const testState: ItemSliceState = { items: testItems };

  const nextTestState = produce(testState, draftState => {
    if (!draftState || !draftState.items) {
      return testState;
    }
    draftState.items[0].status = 2;
  });

  const nextState = produce(state, draftState => {
    if (!draftState || !draftState.items) {
      return state;
    }
    draftState.items[0].status = 2;
  });

...

// testState.items[0].status = 1
// nextTestState.items[0].status = 2
// state.items[0].status = 2
// nextState.items[0].status = 2

Почему манипулируют «состоянием», а «testState» остается без изменений, когда продукция вызывается таким же образом?

Песочница с корректным обновлением состояния: https://codesandbox.io/embed/festive-ritchie-5nf31?fontsize=14&hidenavigation=1&theme=dark

1 Ответ

0 голосов
/ 13 февраля 2020

Проблема заключалась в том, что API возвращал testItems как класс, который не может быть изменен immer. Решением было вместо этого посылать интерфейсы, которые immer может изменять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...