我有一个非常奇怪的问题,我有redux存储和一个使用connect()函数连接到它的react组件。我在redux中存储了来自我后端的用户角色列表。为此,我有两个不同的reducer,userRoleReducer和initialUserRolesReducer。在使用API调用应用更改之前,我使用第一个处理UI中角色的更改,第二个用于在后端响应之后单独存储初始角色。我遇到的问题是,两个减速器都在变化,即使第一个减速器实际上正在通过调度动作进行更新(对不起,如果我使用的术语不正确)。以下是减速机和动作调度员。
减速:
export function userRolesForUsersRequestSuccess(state = {userRoles: []}, action) {
switch(action.type) {
case 'USER_ROLES_FOR_USERS_REQUEST_SUCCESS':
return action.userRoleDataForUsers;
default:
return state;
}
}
export function initialUserRolesForUsersRequestSuccess(state = {userRoles: []}, action) {
switch (action.type) {
case 'INITIAL_USER_ROLES_FOR_USERS_REQUEST_SUCCESS':
return action.initialUserRoleData;
default:
return state;
}
}
这些是动作调度程序,第一个是从连接组件调用的,并且在后端响应之后。第二个只在后端响应后调用。
export function setUserRolesForUsersRequestSuccess(userRoleDataForUsers) {
return {
type: 'USER_ROLES_FOR_USERS_REQUEST_SUCCESS',
userRoleDataForUsers
};
}
export function setInitialUserRolesForUsersRequestSuccess(initialUserRoleData) {
return {
type: 'INITIAL_USER_ROLES_FOR_USERS_REQUEST_SUCCESS',
initialUserRoleData
};
}
我从任何地方都没有发现任何类似的东西,所以我想这不是一个常见的问题,这就是为什么一个好的猜测是问题在我的代码中。但我使用的其他减速机工作得很好,相信我,我试图改变并检查我能做的一切,以使这两个正常工作。
希望有任何帮助可以追踪问题!
编辑:我用来创建商店的代码,不确定它是否有帮助。
import { createStore, applyMiddleware, compose } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './rootReducer';
import createHistory from 'history/createBrowserHistory';
const composeEnhancers = typeof window === 'object' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({}) : compose;
const history = createHistory();
const middleware = routerMiddleware(history);
const initialState = {};
const store = createStore(
rootReducer,
initialState,
composeEnhancers(
applyMiddleware(middleware, thunk))
);
编辑2. rootReducer.js文件,reducers在这里组合。
import { combineReducers } from 'redux';
import { routerReducer } from 'react-router-redux';
import {
userRoleForMeRequestSuccess,
userRolesForUsersRequestSuccess,
userRoleRequestPending,
userPermissionChangeGetResponseMessage,
initialUserRolesForUsersRequestSuccess } from './Common/userRoleReducer';
const appReducer = combineReducers({
userRoleForMeRequestSuccess,
userRolesForUsersRequestSuccess,
userRoleRequestPending,
userPermissionChangeGetResponseMessage,
initialUserRolesForUsersRequestSuccess,
router: routerReducer
});
const rootReducer = (state, action) => {
if (action.type === LOGIN_LOGOUT_REQUEST_SUCCESS) {
state = undefined;
}
return appReducer(state, action);
};
export default rootReducer;
编辑3.在我更深入地研究这个问题后,我做了一个观察,如果我只是为第一个减速器传递完全不同的数据,它的数据保持不变,并且当另一个减少时,它不会改变。因此,在缩减器初始状态之后传递与第一个新状态完全相同的数据会出现某种问题,并且将减速器混合在一起以便始终相互镜像?