Сравните предыдущее состояние с новым в React Redux - PullRequest
0 голосов
/ 26 октября 2019

Я хочу попробовать не распространять «рассылку», если состояние совпадает с предыдущим. Проблема в том, что мое 'state' всегда содержит значение по умолчанию.

const initialState = {
  pending: false,
  fetched: false,
  data: {
    playAndPayAllowed: false,
    sections: {},
    allowedSectionsCount: 0
  }
}

function isPreviousStateEqualToNew(oldState, newState) {
   return JSON.stringify(oldState) === JSON.stringify(newState);
}

export default function shopConfig(state = initialState, action) {
   switch (action.type) {
      case SHOP_CONFIG_PENDING:
        return {
            ...state,
            pending: true,
            data: {
                playAndPayAllowed: false,
                sections: {},
                allowedSectionsCount: 0
            },
            error: false
        }
     case SHOP_CONFIG_SUCCESS:
        if (isPreviousStateEqualToNew(state.data, action.payload)) {
            return;
        }

        const playAndPayAllowed = action.payload.playAndPayAllowed;
        const sections = action.payload.sections || [];
        const allowedSectionsCount = Object.values(sections).filter(item => item);

        return {
            ...state,
            pending: false,
            data: {
                playAndPayAllowed,
                sections: sections,
                allowedSectionsCount: allowedSectionsCount.length
            },
            error: false
        }
    default:
        return state;
}

}

Ожидалось, что старое состояние будет отображаться в переменной «состояние», но «состояние» всегда равно «initialState».

Ответы [ 2 ]

2 голосов
/ 26 октября 2019

Я не вижу, в чем проблема, или я неправильно понял, просто верните неизменное состояние:

if (isPreviousStateEqualToNew(state.data, action.payload)) {
            return state;
        } 
0 голосов
/ 27 октября 2019

Проблема была в моем действии SHOP_CONFIG_PENDING. Он отправлялся каждый раз, когда я выполняю getShopConfig (SHOP_CONFIG_SUCCESS), и очищал предыдущее состояние.

 switch (action.type) {
  case SHOP_CONFIG_PENDING:
    return {
        ...state,
        pending: true,
        data: {
            playAndPayAllowed: false,
            sections: {},
            allowedSectionsCount: 0
        },
        error: false
    }

Итак, я удалил поле 'data' из SHOP_CONFIG_PENDING и стало возможным увидеть старое состояние в SHOP_CONFIG_SUCCESS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...