react-router 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
프롬프트 또는 사용자 정의 역사를 사용하여 :
그러나에서는 from'react-router react-router v4
의 도움으로 구현하기가 다소 쉽습니다.Prompt
문서에 따르면
신속한
페이지에서 이동하기 전에 사용자에게 메시지를 표시하는 데 사용됩니다. 애플리케이션이 사용자가 다른 곳으로 이동하지 못하도록하는 상태가되면 (예 : 양식이 반만 채워져 있음) <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}?`
)}/>
언제 : bool
<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 } }
당신은 당신의 호출 할 수 있도록 페이지를 떠날 필요입니다 기능을 게시