У меня очень странная проблема, у меня есть хранилище резервов и компонент реагирования, связанный с ним функцией connect (). Я храню список пользовательских ролей, поступающих из моего бэкэнда в Redux. Для этого у меня есть два разных редуктора, userRoleReducer и initialUserRolesReducer. Первый используется для обработки изменений ролей в пользовательском интерфейсе перед применением изменений с помощью вызова API, а второй используется для хранения начальных ролей отдельно после ответов бэкэнда. Проблема, с которой я сталкиваюсь, заключается в том, что оба редуктора меняются, хотя на самом деле обновляется только первый, отправляя действие (извините, если я неправильно использую термины). Ниже приведены редукторы и диспетчеры действий.
Переходники:
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, редукторы объединены здесь.
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. После более глубокого изучения этой проблемы я сделал замечание, что если я просто передам совершенно другие данные для первого редуктора, его данные останутся нетронутыми и не изменятся при изменении другого. Так может ли быть какая-то проблема при передаче точно тех же данных, что и первое новое состояние после начального состояния редукторов, и это как-то смешивает редукторы, чтобы всегда отражать друг друга?