Я хочу, чтобы мое приложение ReactJS уведомляло пользователя при переходе с определенной страницы. В частности, всплывающее сообщение, напоминающее ему / ей о действии:
«Изменения сохранены, но еще не опубликованы. Сделать это сейчас?»
Должен ли я запускать это react-router
глобально или это можно сделать на странице / компоненте реакции?
Я не нашел ничего по последнему, и я бы предпочел избегать первого. Если, конечно, это не норма, но это заставляет меня задаться вопросом, как это сделать, не добавляя код на каждую другую возможную страницу, на которую может перейти пользователь.
Любые идеи приветствуются, спасибо!
reactjs
react-router
Барри Стаес
источник
источник
componentWillUnmount() { if (confirm('Changes are saved, but not published yet. Do that now?')) { // publish and go away from a specific page } else { // do nothing and go away from a specific page } }
так, чтобы вы могли вызвать свою функцию публикации перед выходом со страницыОтветы:
react-router
v4 представляет новый способ блокировки навигации с помощьюPrompt
. Просто добавьте это к компоненту, который вы хотите заблокировать:Это заблокирует любую маршрутизацию, но не обновление или закрытие страницы. Чтобы заблокировать это, вам нужно добавить это (обновляя при необходимости с соответствующим жизненным циклом React):
onbeforeunload имеет различную поддержку браузерами.
источник
onberforeunload
предупреждение.react-router
не поддерживает это из коробки (при условии, что кнопка отмены не вызывает никаких изменений маршрута). Однако вы можете создать свой собственный модальный файл, чтобы имитировать поведение.onbeforeunload
, вы захотите очистить его, когда ваш компонент отключится.componentWillUnmount() { window.onbeforeunload = null; }
В реактивном маршрутизаторе
v2.4.0
или выше и раньшеv4
есть несколько вариантовonLeave
дляRoute
setRouteLeaveHook
дляcomponentDidMount
Вы можете предотвратить переход или запросить пользователя перед выходом из маршрута с помощью кнопки выхода.
Обратите внимание, что в этом примере используется компонент
withRouter
более высокого порядка, представленный вv2.4.0.
Однако это решение не совсем работает при изменении маршрута в URL вручную.
В смысле
Для
react-router v4
использования подсказок или пользовательской истории:Однако в
react-router v4
, это гораздо проще реализовать с помощьюPrompt
from'react-router.Согласно документации
В вашем методе рендеринга вам просто нужно добавить это, как указано в документации, в соответствии с вашими потребностями.
ОБНОВИТЬ:
Если вы хотите иметь настраиваемое действие, которое будет выполняться, когда пользователь покидает страницу, вы можете использовать настраиваемую историю и настроить свой маршрутизатор, например
history.js
а затем в своем компоненте вы можете использовать
history.block
подобноеисточник
<Prompt>
URL-адрес, он будет изменен, когда вы нажмете Отмена в приглашении. Связанная проблема: github.com/ReactTraining/react-router/issues/5405Для
react-router
2.4.0+ПРИМЕЧАНИЕ . Желательно перенести весь код на последнюю версию.
react-router
чтобы получить все новые возможности.Как рекомендовано в документации по реактивному маршрутизатору :
Следует использовать
withRouter
компонент более высокого порядка:В качестве примера ES6 из документации:
источник
Для
react-router
v3.xУ меня была такая же проблема, когда мне требовалось подтверждающее сообщение для любого несохраненного изменения на странице. В моем случае я использовал React Router v3 , поэтому я не мог использовать
<Prompt />
, который был введен в React Router v4 .Я обработал «нажатие кнопки возврата» и «случайное нажатие ссылки» с помощью комбинации
setRouteLeaveHook
иhistory.pushState()
, а также обработал «кнопку перезагрузки» с помощьюonbeforeunload
обработчика событий.setRouteLeaveHook ( документ ) и history.pushState ( документ )
Использования только setRouteLeaveHook было недостаточно. По какой-то причине URL-адрес был изменен, хотя страница осталась прежней при нажатии кнопки «назад».
onbeforeunload ( док )
Он используется для обработки кнопки случайной перезагрузки
Ниже представлен полный компонент, который я написал
this.props.router
.this.props.route
передается от вызывающего компонентаобратите внимание, что
currentState
передается как опора, чтобы иметь начальное состояние и проверять любые измененияПожалуйста, дайте мне знать, если возникнут вопросы :)
источник
Для
react-router
v0.13.x сreact
v0.13.x:это возможно с помощью
willTransitionTo()
иwillTransitionFrom()
статическими методами. Для более новых версий см. Мой другой ответ ниже.Из документации реактивного маршрутизатора :
Для
react-router
1.0.0-rc1 сreact
v0.14.x или новее:это должно быть возможно с помощью
routerWillLeave
крючка жизненного цикла. Для более старых версий см. Мой ответ выше.Из документации реактивного маршрутизатора :
Вещи. может измениться до финальной версии.
источник
Вы можете использовать эту подсказку.
источник
Использование history.listen
Например, как показано ниже:
В вашем компоненте
источник