Кнопка возврата в браузере не работает и не меняет значение в состоянии - PullRequest
0 голосов
/ 01 августа 2020

Я работаю над проектом, который использует API серверной части для извлечения данных и отображения на интерфейсе с помощью реакции. Я не специалист по реагированию, но учусь, работая над проектом. Последние 3 месяца я застрял на одной проблеме и все еще не мог понять, как ее решить. Это формат данных, которые я получаю

{
"data": [],
"meta": {
"page": 1,
"total": 382,
"per_page": 10,
"total_pages": 39,
"search_query": {},
"message": ""
}
}

Вот как выглядит URL-адрес

const url = `${
    CONSTANTS.BASE_URL
  }/jobs?page=${counter}&position=${searchField.toLowerCase()}&city=${locationField.toLowerCase()}&job_type=${jobType}`;

Я использую useHistory из react-router-dom для отображения динамики c URL-адрес в браузере.

import { useHistory } from 'react-router-dom';
let jobHistory = useHistory();

Вот как я вставил URL-адрес в браузер, чтобы посмотреть его динамически c

useEffect(() => {
    searchJobs(setIsLoading, setData, setMeta, url);
    setToggleSearch(false);
    jobHistory.push(
      `?page=${counter}${searchField ? `&position=${searchField.toLowerCase()}` : ''}${
        locationField ? `&city=${locationField.toLowerCase()}` : ''
      }${jobType ? `&job_type=${jobType}` : ''}`
    );
  }, [counter, jobType, toggleSearch]);

Вот как searchJobs реализуется

export default async (setIsLoading, setData, setMeta, url) => {
  try {
    setIsLoading(true);
    const res = await fetchData(url);
    setData(res.data);
    setMeta(res.meta);
    setIsLoading(false);
  } catch (error) {
    console.error(error);
  }
};

У меня есть компонент нумерации страниц, который я реализовал с помощью Semanti c UI response . Вот как я контролировал значение counter

 {meta && meta.total > 0 && <CustomPagination meta={meta} setCounter={setCounter} />}

, передав его внутри CustomPagination Компонента, который выглядит следующим образом.

const CustomPagination = ({ meta, setCounter }) => {
  const pageChange = (e, { activePage }) => {
    setCounter(activePage);
  };

  return (
    <>
      <div className="pagination">
        {meta && meta.total_pages && meta.total_pages > 1 && (
          <Pagination
            defaultActivePage={meta.page}
            onPageChange={pageChange}
            firstItem={false}
            lastItem={false}
            prevItem={{ content: <Icon name="angle left" />, icon: true }}
            nextItem={{ content: <Icon name="angle right" />, icon: true }}
            totalPages={meta.total_pages}
          />
        )}
      </div>
    </>
  );
};

export default CustomPagination;

Вот и проблема:

  • Разбивка на страницы работает очень хорошо, когда я просто нажимаю цифры разбивки на страницы, и она отображает правильное значение в URL-адресе, но когда я нажимаю кнопку «Назад», URL-адрес меняет значение, но вывод на страница остается прежней. Эта проблема возникает при нажатии на обычную разбивку на страницы или при поиске по ключевым словам, я имею в виду в обоих случаях .

  • Второй случай, если I go - page number 6 при нажатии на разбивку на страницы отображается результат 10 заданий на этой странице, а URL-адрес выглядит примерно так ?page=6, и после того, как я нажимаю на отдельные задания /jobs/23499 и пытаюсь вернуться с помощью кнопки возврата в браузере, URL-адрес снова берет меня на 1-ю страницу ?page=1.

  • Третий случай, как пользователь, я хочу go на страницу 8, просто переименовав номер страницы в URL-адресе, если я попытаюсь сделать Итак, он снова перенаправляет меня на ?page=1

На мой взгляд, все проблемы вызваны неправильным способом обработки значения counter. Я, будучи новичком, не мог понять, как это можно правильно реализовать. На всякий случай я разместил весь свой код в этой gist , или вы можете увидеть проблему вживую здесь , просто нужно сначала зарегистрироваться. Любая помощь будет более чем оценена. Заранее спасибо всем разработчикам.

1 Ответ

0 голосов
/ 01 августа 2020

По сути, история response-router-dom реализуется с помощью структуры данных стека. Если вы хотите пересылать go, вы «вставляете» URL-адрес в стек, а когда вы хотите go назад, вы выполняете операцию «pop». Из вашего примера кода похоже, что вы используете перехватчик истории, чтобы перейти к просмотру разбивки на страницы, но тогда вы не обновляете свой стек при разбиении на страницы.

Решение: похоже, вам нужно pu sh ваши новые URL-адреса с обновленным параметром запроса во время события onclick вашей пагинации. Когда вы go вернетесь, вы можете открыть или использовать предоставленную функцию history.goBack ().

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