反応ルーター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
from'react-router を使用して実装する方がかなり簡単です。
ドキュメントによると
促す
ページから移動する前にユーザーにプロンプトを表示するために使用されます。アプリケーションが、ユーザーがナビゲートできないような状態(フォームが半分埋められているなど)になったら、をレンダリングし<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 } }
ように、ページを離れる前にパブリッシュ関数を呼び出すことができます