3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Reactでページ遷移を制御する

Last updated at Posted at 2022-02-18

はじめに

ユーザーが何かしらのデータを入力をした状態で画面の遷移を制御したい場合がある。
「リンク、戻る、進む、リロード、ホームボタン、タブを閉じる」を押したときにユーザーに遷移して良いかアラートを出したい。

開発環境

  • react-router v5.2.0

リンクでの遷移、戻る、進む

リンクでの遷移や「戻る」「進む」ボタンでの制御はreact-routerPromptで制御できます。
whentrueの時に実行されます。
messageが返す文字列はカスタム可能です。
特定のページに対しての遷移を制御することもできます。
react-router v6系だとPromptは対応していない模様。

import React, { useState } from 'react'
import { Prompt } from 'react-router'

const App = () => {
  const [bool, setBool] = useState(true)

  return (
    <div>
      ・・・略
      <Prompt
        when={!bool}
        message={(location) => {
          return location ? 'ページ遷移できません' : true
        }}
      />
    </div>
  )
}

export default App

リロード、ホームボタン、タブを閉じる

「リロード、ホームボタン、タブを閉じる」はonbeforeunloadで制御します。
こちらは最新のブラウザでカスタムメッセージは使えないようです。
カスタムフックを作って制御しています。

import { useEffect } from 'react'

const useOnbeforeUnload = (bool) => {
  useEffect(() => {
    window.onbeforeunload = () => (bool ? null : true)
  }, [bool])
}

export default useOnbeforeUnload

追記

実装できたぜ!と思ったらiOSで死んでた。
react-routerが制御するページ遷移と戻る進むは問題なかったけど、beforeunloadが対応していなかった。

参考資料

3
0
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?