I´m trying to fix this bug since one day and it won´t work..
I´m using dispatch but it never changes the state.
The Slice should be right (it is really near to the online example from the redux-toolkit homepage )
This is my code:
App.tsx
export const StateDisplay = () => {
const data = useAppSelector(selectErrors);
const dispatch = useAppDispatch();
function onPressMethod() {
dispatch(
errorActions.addNewOne({ type: "thisIsAType", value: "thisIsAValue" })
);
}
return (
<View>
<Text>STATE :</Text>
<Button title="add" onPress={onPressMethod}></Button>
<FlatList
data={data}
renderItem={({ item }) => <Text>{item.value}</Text>}
/>
<Text></Text>
</View>
);
};
Store:
export const store = configureStore({
reducer: {
errors: errorListSlice.reducer,
},
});
Slice:
export interface dto {
value: string;
type: string;
}
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;
export const selectErrors = (state: RootState) => state.errors;
const initialState: dto[] = [
{ value: "val1", type: "type1" },
{ value: "val1", type: "type1" },
];
export const errorListSlice = createSlice({
name: "errorList",
initialState,
reducers: {
addNewOne: (state, action: PayloadAction<dto>) => {
state = [
...state,
{
value: action.payload.value,
type: action.payload.type,
},
];
},
},
});
export const errorActions = errorListSlice.actions;
export default errorListSlice.reducer;
2
Answers
It works when I change the reducer in this way. I don´t know if this is maybe a bad practice.
You cannot reassign the full
state
object.In that case, you would have to
return
.But as you already noticed in your answer, you can also
.push()
on your array – and in Redux Toolkit, that is the preferred way of doing it.See writing Reducers with immer