Предотвратить реакцию перезагрузки маршрутизатора API вызова при нажатии кнопки назад. Reactjs - PullRequest
0 голосов
/ 06 апреля 2020

Имеется две страницы - основная со списком элементов и страница с подробным описанием элемента. Используется реагирующий маршрутизатор.

<Switch>
    <Route exact path="/" component={PokemonCardContainer} />
    <Route path="/pokemon/:pokemonName" component={Pokemon} />
</Switch>

На главной странице со списком генерируется API-интерфейс запроса, который возвращает 20 элементов. Далее, когда мы достигаем конца списка, запрос API обновляется - загружаются еще 20 элементов и т. Д. c. enter image description here

Страница подробного описания реализуется кнопка «Я тебя выбираю!»

<Link to={`pokemon/${pokemonName}`}>
   {pokemonName}, I Choose You!
</Link>

На странице подробного описания есть кнопка «Вернуться к дому»

const handleGoToHomePage = () => {
    props.history.push({
    pathname: "/",
   });
 };

Соответственно при нажатии вернуться на главную страницу , новый запрос API происходит, и я попадаю в начало страницы. но мне нужно, чтобы я вернулся к элементу списка, на который я нажал. Например, если я нажал на 60-й элемент, мне нужно вернуться к нему. Я так понимаю, что мне нужно прервать запрос API, когда я вернусь на главную?

      /* States */
      const [pokemons, setPokemons] = useState([]); 
      const [loading, setLoading] = useState(true);
      const [error, setError] = useState(false);
      const [currentPage, setCurrentPage] = useState(
        "https://pokeapi.co/api/v2/pokemon"
      );
      const [nextPage, setNextPage] = useState("");
      const [hasMore, setHasMore] = useState(false);
      useEffect(() => {
        let cancel;
        const fetchData = () => {
          setLoading(true);
          setError(false);
          Axios({
            method: "GET",
            url: currentPage,
            cancelToken: new Axios.CancelToken((c) => (cancel = c)),
          })
          .then((res) => {
            setPokemons((prevPokemons) => {
            return [...prevPokemons, ...res.data.results];
          });
            setNextPage(res.data.next);
            setHasMore(res.data.results.length > 0);
            setLoading(false);
          })
          .catch((error) => {
            if (Axios.isCancel(error)) return;
            setError(true);
          });
        };
      fetchData();
      return () => cancel();
    }, [currentPage]);

1 Ответ

0 голосов
/ 06 апреля 2020

Я вижу две возможности,

Вы делаете вызов API в родительском компоненте, который не отключен (например, меню или основной компонент

, или вы храните данные в хранилище, используя что-то вроде Redux . Если ваше приложение сложное и требует обработки сложного состояния, совместно используемого компонентами, я бы go выбрал для этой опции.

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