tengo mi reductor
const userAuthSlice = createSlice({ name: "userAuth", initialState: { token: '', }, reducers: { setToken: (state, action) => state.token = action.payload.test, }, });Y tengo mi comando de despacho
<button value={text.sign_in.submit} onClick={() => dispatch(userAuthSlice.actions.setToken({test:"test"}))} />Cuando presiono el botón, lo que obtengo es este error:

He aislado todo para estar seguro de que ese es el problema y nada más.
¿Por qué aparece este error?
El problema es el uso de una función de flecha sin llaves como reductor, porque actúa como una declaración de retorno implícita. Entonces, ambos están mutando state.token y devolviendo el resultado de la asignación.
Según los documentos de Immer sobre la devolución de datos , hay un par de formas de solucionar esto:
void delante de la asignación por lo que setToken reducer se puede actualizar con void como
setToken: (state, action) => void(state.token = action.payload.test)En lugar de
state.token = action.payload.tokenutilizar
const token = action.payload.token state.token = tokenLas constantes son inmutables, y asignar contenido de action.payload a una constante resolvió un problema para mí (Tenga en cuenta que en caso de que la carga útil sea un objeto, no es necesario
Ejemplo de trabajo de 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 }, });puedes olvidar el descanso; declaración en su archivo reducer.js;
case LOGIN_USER_ERROR_RESET: draft.errormsg = ''; draft.loading = false; draft.error = false; break;Puntos para aprender sobre IMMER
immer devolverá el borrador finalizado de todos modosrecipe , según el punto 1, el nuevo valor de retorno reemplazará el estadoAhora viene a responder a la pregunta. esta es tu función reductora
(state, action) => state.token = action.payload.test Esta función está haciendo dos cosas,
1. modificando el estado
2. devolver action.payload.test
entonces está violando el punto 4 y, por lo tanto, el error de la biblioteca Immer
en este caso específico, la intención es solo modificar el estado, por lo que tenemos que deshacer la devolución existente con void
setToken: (state, action) => void(state.token = action.payload.test)Sin embargo, la biblioteca de Immer recomienda el uso de un bloque de código para asegurar la coherencia en una gran base de código, este bloque de código implícitamente devuelve indefinido
setToken: (state, action) => { state.token = action.payload.test }Intente verificar este enlace para Copiar sin referencia
Respuesta correcta
Usar en lugar de
const userAuthSlice = createSlice({ name: "userAuth", initialState: { token: '', }, reducers: { setToken: (state, action) => state.token = action.payload.test, }, });Usa esto {Acabo de agregar corchetes}
const userAuthSlice = createSlice({ name: "userAuth", initialState: { token: '', }, reducers: { setToken: (state, action) => { state.token = action.payload.test}, // <<= Change Here }, });Para aquellos que trabajan con React PullState , mi problema fue con la sintaxis:
Tuve:
const onUpdate = (value: any) => { someStore.update((s) => (s.value = value)); };pero tiene que ser:
const onUpdate = (value: any) => { someStore.update((s) => { s.value = value; }); };Por alguna razón, no le gusta la función de flecha declarada en el primer enfoque.