Trong bộ định tuyến phản ứng v2.4.0
trở lên và trước khi v4
có một số tùy chọn
- Thêm chức năng
onLeave
choRoute
<Route
path="/home"
onEnter={ auth }
onLeave={ showConfirm }
component={ Home }
>
- Sử dụng chức năng
setRouteLeaveHook
chocomponentDidMount
Bạn có thể ngăn quá trình chuyển đổi xảy ra hoặc nhắc người dùng trước khi rời khỏi tuyến đường bằng dấu móc rời.
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?'
},
// ...
})
)
Lưu ý rằng ví dụ này sử dụng thành phần withRouter
bậc cao hơn được giới thiệu trongv2.4.0.
Tuy nhiên, giải pháp này không hoạt động hoàn hảo khi thay đổi tuyến đường trong URL theo cách thủ công
Theo nghĩa rằng
- chúng tôi thấy Xác nhận - ok
- chứa của trang không tải lại - ok
- URL không thay đổi - không ổn
Để react-router v4
sử dụng Lời nhắc hoặc lịch sử tùy chỉnh:
Tuy nhiên react-router v4
, nó khá dễ thực hiện hơn với sự trợ giúp của Prompt
bộ định tuyến chính xác
Theo tài liệu
Lời nhắc
Được sử dụng để nhắc người dùng trước khi điều hướng khỏi một trang. Khi ứng dụng của bạn chuyển sang trạng thái khiến người dùng không thể điều hướng đi (giống như biểu mẫu được điền một nửa), hãy hiển thị a <Prompt>
.
import { Prompt } from 'react-router'
<Prompt
when={formIsHalfFilledOut}
message="Are you sure you want to leave?"
/>
tin nhắn: chuỗi
Thông báo để nhắc người dùng khi họ cố gắng điều hướng đi.
<Prompt message="Are you sure you want to leave?"/>
tin nhắn: func
Sẽ được gọi với vị trí và hành động tiếp theo mà người dùng đang cố gắng điều hướng đến. Trả về một chuỗi để hiển thị lời nhắc cho người dùng hoặc true để cho phép chuyển đổi.
<Prompt message={location => (
`Are you sure you want to go to ${location.pathname}?`
)}/>
khi nào: bool
Thay vì hiển thị có điều kiện <Prompt>
một người bảo vệ phía sau, bạn luôn có thể hiển thị nó nhưng vượt qua when={true}
hoặc when={false}
để ngăn hoặc cho phép điều hướng tương ứng.
Trong phương thức kết xuất của bạn, bạn chỉ cần thêm điều này như đã đề cập trong tài liệu tùy theo nhu cầu của bạn.
CẬP NHẬT:
Trong trường hợp bạn muốn có một hành động tùy chỉnh để thực hiện khi việc sử dụng đang rời khỏi trang, bạn có thể sử dụng lịch sử tùy chỉnh và định cấu hình Bộ định tuyến của mình như
history.js
import createBrowserHistory from 'history/createBrowserHistory'
export const history = createBrowserHistory()
...
import { history } from 'path/to/history';
<Router history={history}>
<App/>
</Router>
và sau đó trong thành phần của bạn, bạn có thể tận dụng history.block
như
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 } }
, do đó bạn có thể gọi bạn xuất bản chức năng bevor rời khỏi trang