【问题标题】:Why redux store only get value of last dispatch Action为什么 redux 存储只获取最后一次调度操作的值
【发布时间】: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 sending payload`值时?什么变成“initState”,什么是“initState”?请尝试分享所有相关代码。我仍然认为我们需要看看你的减速器正在执行这些操作。
  • 谢谢你给我一个解决方法。你可以在我的帖子中看到我的更新

标签: reactjs react-redux redux-thunk


【解决方案1】:

默认的 reducer 应该总是返回当前状态对象。否则我想不出一个反例(虽然我看到一些教程在这里抛出错误,但你通常不想这样做,因为它增加了不必要的错误处理并使一切复杂化)。

您只需为状态切片缩减器需要处理的操作定义案例,否则让默认案例通过简单地返回当前状态来处理它。

const initState = {
  data: [],
};

export default (state = initState, action) => {
  switch (action.type) {
    case timeSlotWeek.GET_DATA_TIME_SLOT_WEEK_SUCCESS:
      return {
        // Pass payload to this
      };

    default:
      return state;
  }
};

如果您需要重置 一些 状态,请为此使用另一个操作和案例,即:

case 'resetTimeSlotWeek':
  return initState;

【讨论】:

  • 同意!在默认情况下重置为初始状态是疯狂的。
猜你喜欢
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 2017-10-12
相关资源
最近更新 更多