Хранилище Redux изменяет реквизиты подключенных компонентов без отправки соответствующих действий - PullRequest
0 голосов
/ 09 мая 2018

У меня очень странная проблема, у меня есть хранилище резервов и компонент реагирования, связанный с ним функцией 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. После более глубокого изучения этой проблемы я сделал замечание, что если я просто передам совершенно другие данные для первого редуктора, его данные останутся нетронутыми и не изменятся при изменении другого. Так может ли быть какая-то проблема при передаче точно тех же данных, что и первое новое состояние после начального состояния редукторов, и это как-то смешивает редукторы, чтобы всегда отражать друг друга?

...