Ошибка: производитель immer вернул новое значение * и * изменил его черновик. Либо верните новое значение *, либо * измените черновик - PullRequest
0 голосов
/ 23 марта 2020

Итак, я новичок в редуксе инструментария.

У меня есть мой редуктор


const userAuthSlice = createSlice({
    name: "userAuth",
    initialState: {
        token: '',
    },
    reducers: {
        setToken: (state, action) => state.token = action.payload.test,
    },
});

И у меня есть моя диспетчерская команда

<button
   value={text.sign_in.submit}
   onClick={() => dispatch(userAuthSlice.actions.setToken({test:"test"}))}

/>

и, как я нажмите кнопку, что я получаю, это ошибка:

введите описание изображения здесь

Я выделил все, чтобы быть уверенным, что это проблема, и ничего больше.

Почему появляется эта ошибка?

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Вместо

 state.token = action.payload.token

используйте

 const token = action.payload.token
 state.token = token

Постоянные являются неизменяемыми, и назначение содержимого action.payload константе решило проблему для меня (обратите внимание, что в случае, если полезная нагрузка объект не нужен

Рабочий пример createSlice:

import { createSlice } from '@reduxjs/toolkit';

export const slice = createSlice({
  name: 'login',
  initialState: {
      username: "Foo",
      password: "AAA",
      authorized : false
  },
  reducers: {
    setUsername: (state, action) => {

      const value = action.payload
      state.username = value // action.payload.username

    },
    setPassword: (state, action) => {

      const value = action.payload
      state.password = value // action.payload.password

    },
    logon: (state, action) => {

      state.username = action.payload.username
      state.password = action.payload.password
      state.authorized = true

    },
    logoff: state => state.authorized = false
  },
});
0 голосов
/ 23 марта 2020

Проблема заключается в использовании функции стрелки без фигурных скобок в качестве редуктора, поскольку она действует как неявный оператор возврата. Итак, вы оба мутируете state.token, и , возвращая результат присваивания.

Per Документы Immer о возврате данных , есть несколько способов исправить это:

  • Добавление оператора void перед назначением
  • Завершение назначения в фигурные скобки, чтобы сделать его тело функции
...