Redux: фильтровать данные и перематывать к исходному состоянию данных в Reducer?

Допустим, у меня есть большой объем данных JSON, которые я хочу изначально отображать при загрузке страницы (пока работает), и возможность фильтровать эти данные, чтобы отображать только определенное количество. Когда мое действие FILTER_DATA отправляется, оно проверяет свойство view и выполняет вспомогательные функции для фильтрации массива данных до того количества, которое мне нужно отобразить.

Однако ... если я обновляю состояние с помощью отфильтрованной версии данных и скажем, пользователь хочет вернуться к ОРИГИНАЛЬНОМУ представлению (весь набор данных), есть ли способ перемотать состояние к этому точка? Я подумывал о повторной отправке действия FETCH_DATA для повторного выполнения запроса GET для повторной выборки данных, но это кажется неприятным. Мысли? Ниже мой редуктор:

Примечание. data в объекте initialState является пустым значением массива до тех пор, пока FETCH_DATA_SUCCESS не отправит и не установит state.data на данные JSON, полученные в запросе GET.

const app = (state = initialState, action) => {
  switch(action.type) {
    case FETCH_DATA:
      return { ...state, error: '', loading: true };
    case FETCH_DATA_SUCCESS:
      return { ...state, error: '', loading: false, data: action.data, view: 'all' };
    case FETCH_DATA_FAILURE:
      return { ...state, error: action.error, loading: false };
    case FILTER_DATA:
      let data;
      if (action.view === 'week') {
        data = groupData(getLastWeek(state.data), action.view);
      } else if (action.view === 'month') {
        data = groupData(getLastMonth(state.data), action.view);
      } else if (action.view === 'all') {
        data = state.data;
      }
      return { ...state, error: '', loading: false, data: data, view: view };
  }
  return state;
}

Спасибо.


person Jose    schedule 28.09.2016    source источник


Ответы (1)


Есть два основных варианта. Во-первых, если вы действительно хотите сохранить «отфильтрованные» данные непосредственно в своем состоянии, вы можете сохранить две копии: «исходную» и «отфильтрованную» версии.

Другой подход, который я рекомендую, заключается в том, чтобы сохранить как исходные данные, так и критерии фильтрации в вашем состоянии, но фактически не изменять исходные данные. Вместо этого по мере необходимости выполняйте фильтрацию за пределами магазина. Это отличный вариант использования «функций выбора». См. Несколько примеров в вычислении производных данных.

person markerikson    schedule 28.09.2016
comment
Привет. Я пытаюсь пойти с первым подходом. Но у меня возникают трудности с сохранением оригинала без изменений. Каждый раз, когда я применяю фильтр, оригинальный тоже меняется ... вероятно, потому, что Фильтрованный имеет ссылку на оригинал. Я хочу оставить исходный без изменений. Как я могу это сделать? - person FE_Addict; 06.06.2019
comment
Похоже, вы в процессе мутируете исходный массив. Не делай этого :) - person markerikson; 06.06.2019