使用带有 Typescript 的 Redux 工具包未更新状态
State not updated using Redux toolkit with Typescript
使用 createAsyncThunk 和 extraReducers,我可以获得数据,但状态没有更新。
这是代码
// matchMakingSlice.ts
export const getOpenChallenges = createAsyncThunk(
"openchallenges/get",
async () => {
const response = await fetchWrapper<Lobby>("api/p/openchallenges", "GET");
return response;
}
);
export const matchMakingSlice = createSlice({
name: "matchMaking",
initialState: lobbyState,
reducers: {},
extraReducers: (builder) => {
builder.addCase(getOpenChallenges.fulfilled, (state, action) => {
state = action.payload;
});
},
});
export default matchMakingSlice.reducer;
在这里我可以看到有效载荷中的数据,但是当我设置状态时,它并没有按照我的预期去做... Reduc Chrome Addon 向我显示了一个空状态。我在组件中尝试使用选择器时得到了相同的结果。
这里有更多信息:
// store.ts
const store = configureStore({
reducer: {
matchMaking: mathMakingReducer,
user: userReducer,
},
});
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;
export const useAppDispatch = () => useDispatch<AppDispatch>();
export default store;
// component.ts
const Lobby = () => {
const dispatch = useDispatch();
useEffect(() => {
dispatch(getOpenChallenges());
}, [dispatch]);
const challenges = useSelector((state: RootState) => {
return state.matchMaking.openChallenges;
});
我做错了什么?
谢谢!
state = action.payload
在 Immer 动力减速器中永远不是有效操作。 Immer 通过跟踪 突变 到现有 state
或让您 return 一个新值来工作。 state =
只是将局部 state
变量更改为指向不同的东西,这既不是突变也不是 return。你需要 return action.payload
.
有关这方面的更多详细信息,请参阅 the RTK "Writing Reducers with Immer" docs page。
使用 createAsyncThunk 和 extraReducers,我可以获得数据,但状态没有更新。 这是代码
// matchMakingSlice.ts
export const getOpenChallenges = createAsyncThunk(
"openchallenges/get",
async () => {
const response = await fetchWrapper<Lobby>("api/p/openchallenges", "GET");
return response;
}
);
export const matchMakingSlice = createSlice({
name: "matchMaking",
initialState: lobbyState,
reducers: {},
extraReducers: (builder) => {
builder.addCase(getOpenChallenges.fulfilled, (state, action) => {
state = action.payload;
});
},
});
export default matchMakingSlice.reducer;
在这里我可以看到有效载荷中的数据,但是当我设置状态时,它并没有按照我的预期去做... Reduc Chrome Addon 向我显示了一个空状态。我在组件中尝试使用选择器时得到了相同的结果。
这里有更多信息:
// store.ts
const store = configureStore({
reducer: {
matchMaking: mathMakingReducer,
user: userReducer,
},
});
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;
export const useAppDispatch = () => useDispatch<AppDispatch>();
export default store;
// component.ts
const Lobby = () => {
const dispatch = useDispatch();
useEffect(() => {
dispatch(getOpenChallenges());
}, [dispatch]);
const challenges = useSelector((state: RootState) => {
return state.matchMaking.openChallenges;
});
我做错了什么? 谢谢!
state = action.payload
在 Immer 动力减速器中永远不是有效操作。 Immer 通过跟踪 突变 到现有 state
或让您 return 一个新值来工作。 state =
只是将局部 state
变量更改为指向不同的东西,这既不是突变也不是 return。你需要 return action.payload
.
有关这方面的更多详细信息,请参阅 the RTK "Writing Reducers with Immer" docs page。