React Router v4 - как определить навигацию по кнопке "Назад" и обновление URL-адреса?

У меня есть URL-адрес /page (СТРАНИЦА A), по которому я хочу определить, был ли выполнен переход к странице с историей обратно из (СТРАНИЦА B) или пользователь находился на < strong> (СТРАНИЦА A) и вручную обновил страницу с помощью кнопки обновления строки URL (без использования истории).

Я изучил всю историю, местоположение, реквизиты с помощью маршрутизатора реакции, но не нашел способа различить, как пользователь переходил на страницу.

В обоих сценариях history.action == 'POP' - это действие истории. В идеале это было бы 'POP' при использовании кнопки возврата в приложении для возврата со страницы b на страницу a, а когда на странице a, при обновлении страницы это было бы что-то другое, кроме 'POP', например, 'REFRESH'.

Как мы можем различать их обоих, чтобы запускать разную логику в нашем приложении, поскольку оба запускают 'POP'?


person Wonka    schedule 01.09.2017    source источник
comment
использовать историю, добавить слушателя и слушать поп, npmjs.com/package/history   -  person Rei Dien    schedule 01.09.2017
comment
Я думаю, вы ищете такие вещи, на которые я ответил здесь: stackoverflow.com/questions/41862910/   -  person Proustibat    schedule 09.08.2018


Ответы (2)


Вместо того, чтобы сравнивать ключ истории, вы можете сравнить путь, например, если вы находитесь на странице «/ page1 / page2» и нажимаете кнопку «Обновить», новое местоположение остается таким же. Но если вы нажмете обратное действие, новое местоположение будет «/ page1 /».

Это решение также использует слушателя для прослушивания любого действия, поступающего из истории.

  componentDidMount() {
    const unlisten = history.listen((location, action) => {
        if (action == 'POP') {
          \\ thisLocation is the current location of your page
          if (location.pathname != '/thisLocation/') {
            alert('Back Pressed: ' + String(location.pathname));
          } else {
            alert('Refreshed: ' + String(location.pathname));
          }
        }
    });
    this.setState({ ...this.state, unlisten: unlisten });
  }

  componentWillUnmount() {
    this.state.unlisten();
  }

Вы можете увидеть более подробную информацию по ссылке, предоставленной Рей Дьен в качестве комментария к вашему вопросу: https://www.npmjs.com/package/history

[РЕДАКТИРОВАТЬ]

Другой способ сделать это - использовать https://www.npmjs.com/package/react-router-last-location и выполните следующие действия:

import { useLastLocation } from 'react-router-last-location';

  componentDidMount() {
    const unlisten = history.listen((location, action) => {
          const lastLocation = useLastLocation();
          if (location.pathname == lastLocation.pathname) {
            alert('Back Pressed: ' + String(location.pathname));
          }
        }
    });
    this.setState({ ...this.state, unlisten: unlisten });
  }

  componentWillUnmount() {
    this.state.unlisten();
  }

Обратной стороной является то, что нет никакой разницы между активацией действия «Назад» или щелчком по ссылке, которая ведет на страницу, на которой вы были раньше, и то, и другое будет обнаружено как нажатие назад. Если вам не нужна новая зависимость, вы можете сделать это вручную, как указано в https://github.com/ReactTraining/react-router/issues/1066#issuecomment-412907443 создание промежуточного программного обеспечения.

person Nosvan    schedule 01.08.2019
comment
Эй, к сожалению, это тоже не сработало. Даже при возврате запускается Refreshed, а обновление страницы не вызывает никаких предупреждений. Я удивлен, что решение этой проблемы не встроено в библиотеку реактивного маршрутизатора! - person Wonka; 02.08.2019
comment
Любопытно. Здесь он отлично сработал. Попробуйте поставить предупреждение в другом месте if (action == 'POP') с действием в качестве аргумента. Я обновлю ответ другим решением, если вы всегда получаете действия PUSH. В этом случае вам нужно будет создать промежуточное ПО, чтобы иметь возможность хранить последнее местоположение и сравнивать его со следующим. - person Nosvan; 02.08.2019
comment
Привет, спасибо за твой ответ. Я наградил вас наградой, так как срок ее действия истекает, и я хотел, чтобы вы получили ее, а не потеряли. Я все еще не нашел способа решить эту проблему, но разместил в репозитории response / history на github. Если у меня что-то заработает, я опубликую здесь в качестве ответа. Спасибо еще раз! - person Wonka; 02.08.2019
comment
Спасибо, я все еще готов найти решение вашей проблемы. Похоже, нет встроенного способа отличить эти действия от github.com/ReactTraining/history/ выпусков / 575. Лучшее, что я вижу сейчас, это что-то вроде того, что я сказал, чтобы рассматривать обновление как «без изменения местоположения» и обратное действие как «местоположение изменено». - person Nosvan; 02.08.2019

Я думаю, это, по крайней мере, укажет вам правильное направление. Перейдите на yourwebsite.com.

let current_page = history.state.key

if(history.action == 'POP') {
  if(history.state.key == current_page) {
    return 'page was refreshed'
  }
  return 'back button was pressed'
}
person Community    schedule 29.07.2019
comment
Эй, я попробовал это, но нет ключа в состоянии, только на месте. Я изменил history.location.key вместо history.state.key, но это возвращает «страница была обновлена» независимо от обновления страницы или возврата на страницу. Клавиши точно такие же, поэтому мы по-прежнему не можем отличить обновление от возврата на страницу. - person Wonka; 01.08.2019