【发布时间】:2021-04-08 04:11:53
【问题描述】:
我正在尝试在 redux 的 action 阶段进行多调度操作:
这是我的代码:
export const get_data_time_slot_week = (params) => {
return async (dispatch) => {
dispatch({
type: common.CALL_API_REQUEST,
});
const res = await callAPI.post(TIME_SLOT_WEEK + GET, {
params: { ...params },
});
if (res.status === 200 && res.data.code >= 0) {
//Here, I get new state of Selector timeSlotWeek
dispatch({
type: timeSlotWeek.GET_DATA_TIME_SLOT_WEEK_SUCCESS,
payload: {
data: [...res.data.data],
dataPage: { ...res.data.dataPage },
errCode: res.data.code,
},
});
//And here, I lost state of a Selector timeSlotWeek add get new state of Selector common
dispatch({
type: common.GET_FEEDBACK,
payload: {
msg: "__msg_can_not_to_server",
},
});
}
};
};
为什么会这样?以及如何在我的代码中以相同的流程保持 timeSlotWeek 的状态?
这是我用 Redux 工具检查的结果
GET_DATA_TIME_SLOT_WEEK_SUCCESS => data: { 0: {...}, 1{...} }
GET_FEEDBACK => data: {}
msg: "new msg"
这是我的 store.js
import { createStore, applyMiddleware } from "redux";
import { composeWithDevTools } from "redux-devtools-extension";
import rootReducer from "./reducers";
import thunk from "redux-thunk";
const store = createStore(rootReducer, composeWithDevTools(applyMiddleware(thunk)));
export default store;
这是我的 {combineReducers}
import { combineReducers } from "redux";
import feedback from "./feedback.reducer";
import loadingReducer from "./loading.reducer";
import timeSlotWeek from "./timeSlotWeek.reducer";
const rootReducer = combineReducers({
dataTimeSlotWeek: timeSlotWeek,
loading: loadingReducer,
feedback: feedback,
});
export default rootReducer;
感谢您的帮助
更新:问题解决: 因为在我的 timeSlotWeek.reducer 减速器中我有一个默认案例,当我调度另一个动作时,这个案例将运行并使 timeSlotWeek 的状态变为 initState。
import { common, timeSlotWeek } from "../actions/constants";
const initState = {
data: [],
};
export default (state = initState, action) => {
switch (action.type) {
case timeSlotWeek.GET_DATA_TIME_SLOT_WEEK_SUCCESS:
state = {
// Pass payload to this
};
break;
default:
state = { ...initState };
}
return state;
};
我是这样解决的:
import { common, timeSlotWeek } from "../actions/constants";
const initState = {
data: [],
};
export default (state = initState, action) => {
switch (action.type) {
case timeSlotWeek.GET_DATA_TIME_SLOT_WEEK_SUCCESS:
state = {
// Pass payload to this
};
break;
**case common.CALL_API_FINISH:
state = state;
break;
case common.GET_FEEDBACK:
state = state;
break;**
default:
state = { ...initState };
}
return state;
};
有什么比我的方法更好的方法吗?感谢cmt
【问题讨论】:
-
“选择器的丢失状态 timeSlotWeek 添加获取选择器公共的新状态”甚至是什么意思?问题似乎出在您的减速器中,您可以将这些添加到您的问题中吗?
-
当我调度 timeSlotWeek.GET_DATA_TIME_SLOT_WEEK_SUCCESS 时,Selector.timeSlotWeek 有一些价值,当 type: common.GET_FEEDBACK 运行时,Selector.timeSlotWeek 变为 initState
-
什么是
Selector.timeSlotWeek?我在您的问题/代码 sn-ps 中没有看到这样的东西。你是什么意思“当我调度/timeSlotWeek.GET_DATA_TIME_SLOT_WEEK_SUCCESS/. Are you manually dispatching actions via the redux-dev-tool? Are you also sendingpayload`值时?什么变成“initState”,什么是“initState”?请尝试分享所有相关代码。我仍然认为我们需要看看你的减速器正在执行这些操作。 -
谢谢你给我一个解决方法。你可以在我的帖子中看到我的更新
标签: reactjs react-redux redux-thunk