У реакторі-маршрутизаторі v2.4.0
або вище і раніше v4
існує кілька варіантів
- Додати функцію
onLeave
дляRoute
<Route
path="/home"
onEnter={ auth }
onLeave={ showConfirm }
component={ Home }
>
- Використовуйте функцію
setRouteLeaveHook
дляcomponentDidMount
Ви можете запобігти тому, щоб перехід не відбувся, або сповістити користувача перед тим, як виїхати з маршруту за допомогою гачка.
const Home = withRouter(
React.createClass({
componentDidMount() {
this.props.router.setRouteLeaveHook(this.props.route, this.routerWillLeave)
},
routerWillLeave(nextLocation) {
// return false to prevent a transition w/o prompting the user,
// or return a string to allow the user to decide:
// return `null` or nothing to let other hooks to be executed
//
// NOTE: if you return true, other hooks will not be executed!
if (!this.state.isSaved)
return 'Your work is not saved! Are you sure you want to leave?'
},
// ...
})
)
Зауважте, що в цьому прикладі використовується компонент withRouter
вищого порядку, введений вv2.4.0.
Однак це рішення не дуже добре працює при зміні маршруту в URL-адресі вручну
У тому сенсі, що
- ми бачимо Підтвердження - добре
- вміст сторінки не перезавантажується - добре
- URL-адреса не змінюється - непогано
Для react-router v4
використання підказки або спеціальної історії:
Однак у react-router v4
, його досить простіше реалізувати за допомогою Prompt
маршрутизатора
Відповідно до документації
Підкажіть
Використовується для сповіщення користувача перед відходом від сторінки. Коли ваша програма перейде в стан, який повинен перешкоджати користувачеві відходити (наприклад, форма заповнена наполовину), зробіть a <Prompt>
.
import { Prompt } from 'react-router'
<Prompt
when={formIsHalfFilledOut}
message="Are you sure you want to leave?"
/>
повідомлення: рядок
Повідомлення про те, щоб сповістити користувача, коли він намагається перейти.
<Prompt message="Are you sure you want to leave?"/>
повідомлення: func
Буде викликано з наступним місцеположенням та дією, до якої користувач намагається перейти. Поверніть рядок, щоб відобразити підказку користувачеві або true, щоб дозволити перехід.
<Prompt message={location => (
`Are you sure you want to go to ${location.pathname}?`
)}/>
коли: бул
Замість того, щоб умовно виводити <Prompt>
за оберіг, його завжди можна зробити, але пройти when={true}
або when={false}
запобігти або дозволити навігацію відповідно.
У своєму методі візуалізації вам просто потрібно додати це, як зазначено в документації, відповідно до ваших потреб.
ОНОВЛЕННЯ:
У випадку, якщо ви хочете виконати користувацьку дію, коли користувач залишає сторінку, ви можете скористатися спеціальною історією та налаштувати маршрутизатор, як
history.js
import createBrowserHistory from 'history/createBrowserHistory'
export const history = createBrowserHistory()
...
import { history } from 'path/to/history';
<Router history={history}>
<App/>
</Router>
а потім у своєму компоненті ви можете скористатися history.block
подібним
import { history } from 'path/to/history';
class MyComponent extends React.Component {
componentDidMount() {
this.unblock = history.block(targetLocation => {
// take your action here
return false;
});
}
componentWillUnmount() {
this.unblock();
}
render() {
//component render here
}
}
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 } }
тож ви можете зателефонувати на функцію публікації замість того, щоб залишити сторінку