@lexstile

Как правильно организовать поэтапную подгрузку данных с сервера?

1 проблема: каким образом и где сетить данные в store? (не особо нравится, что разделил логику на state и store - может быть, offset стоит сетить в store?)
spoiler
const enrollments = useSelector((state) => get(state, 'app.enrollments') || []);

  const [filter, setFilter] = useState(get(FILTERS, '0.value'));
  const [offset, setOffset] = useState(0);

  const countEnrollments = useRef(enrollments.length);

  const isButtonHidden =
    enrollments.length === countEnrollments.current || enrollments.length % DEFAULT_COUNT_ITEMS_PER_PAGE !== 0;

  const onLoadEnrollments = () => setOffset(offset + 1);
  const loadEnrollments = () => dispatch(getEnrollments({ userId, filter, offset }));
  const clearEnrollments = () => dispatch(setEnrollments([]));

  useEffect(loadEnrollments, [filter, offset]);

  useEffect(() => {
    setOffset(0);
    clearEnrollments();
    set(countEnrollments, 'current', 0);
  }, [filter]);

  useEffect(() => {
    const length = get(enrollments, 'length', 0);
    const current = get(countEnrollments, 'current', 0);

    if (length !== current) {
      set(countEnrollments, 'current', length);
    }
  }, [enrollments]);

// getEnrollments

export const getEnrollments = (data) => async (dispatch, getState) => {
  const [execute] = apiShell(callEnrollments, dispatch);
  const response = await execute(data);

  const enrollments = get(response, 'enrollments') || [];
  const offset = get(data, 'offset');

  if (!offset) {
    dispatch(setEnrollments(enrollments));
    return;
  }

  const store = getState();
  const storeEnrollments = get(store, 'app.enrollments') || [];

  dispatch(setEnrollments([...storeEnrollments, ...enrollments]));
};

2 проблема: отображение кнопки (isButtonHidden)
Я пока что привязался к остатку от деления - если пришло < 10 элементов, значит они пришли все
и если следующий запрос вернул то же количество элементов, что и предыдущий, значит следующий запрос больше уже не вернет и можем не показывать кнопку.
Проблема в том, что если пришло 10 элементов, то мы не знаем, последние ли они или нет, кнопка показывается и нам, как минимум, нужно один раз нажать на нее (единственное решение, которое пришло в голову, возвращает с BE общее количество элементов).
  • Вопрос задан
  • 57 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы