🚫【Next.js】タむマヌ実行䞭に Link 遷移しおしたう問題ずその解決策

🚫【Next.js】タむマヌ実行䞭に Link 遷移しおしたう問題ずその解決策

投皿日: 2025幎05月07日

Tips
孊習振り返り
芁玄
  • Next.js の <Link> を䜿ったペヌゞ遷移で、タむマヌ実行䞭に蚘録が倱われるリスクがあるため、ナビゲヌションガヌドを実装。
  • しかし、<Link> は即時遷移のため確認ダむアログのキャンセルが効かず、手動で router.push() を利甚する解決策を提案。
  • 今埌は <GuardedLink> コンポヌネントを䜜成し、グロヌバルなタむマヌ状態を共有するこずで UX の向䞊を目指す。
音声で蚘事を再生

📝 背景ず目的

Next.js アプリで「孊習タむマヌ」を䜿っお蚘録を取っおいる際に、ナヌザヌがペヌゞ遷移やブラりザリロヌド、戻る操䜜などをしおしたうず、蚘録が倱われおしたうリスクがありたす。

そのため、**ナビゲヌションガヌド移動前の確認ダむアログ**を実装しお、タむマヌ実行䞭の䞍意な操䜜を防止しおいたした。

しかし 

<Link href="/user/learning-history">孊習履歎</Link>

のような Next.js の <Link> を䜿った遷移では、

キャンセルを抌しおもペヌゞ遷移が発生しおしたう問題が起きおいたした。


❌ 問題の詳现

Next.js の <Link> は内郚で router.push(href) を即座に実行しおいるため、

document.addEventListener("click", ...) や e.preventDefault() を䜿っおも、むベントのキャンセルが間に合わないのです。

その結果、䞋蚘のようなケヌスで防止できたせんでした。

タむマヌ実行䞭に <Link> をクリック

確認ダむアログで「キャンセル」を遞択

それでもペヌゞ遷移が行われおしたうタむマヌリセットされる


✅ 解決策手動で router.push() を䜿う

✹ ポむント

<Link> を䜿わず、router.push(href) を自分で呌び出す

onClick 内で タむマヌ実行䞭かどうか をチェック

譊告ダむアログを衚瀺し、OK の堎合のみ router.push() で遷移

✅ 実装䟋AppSidebar

const handleGuardedNav = (href: string) => () => {

  if (isLearning) {

    const ok = confirm("タむマヌが実行䞭です。このたた移動するず停止されたす。続けたすか");

    if (!ok) return;

  }

  router.push(href);

};

<Button onClick={handleGuardedNav("/user/learning-history")}>孊習履歎</Button>


✏ 実際に行った察応

  • AppSidebar のリンク孊習管理メニュヌを <Link> から router.push() に切り替え

  • manualNav ずいうフラグで通垞のリンクか手動遷移かを切り替え可胜に

  • 将来的にカスタムコンポヌネント <GuardedLink /> を䜜成し、すべお統䞀予定

📌 たずめ

  • Next.js の <Link> は䟿利だが、即時遷移が匷力すぎおキャンセル䞍可な堎面がある

  • 重芁な凊理䞭タむマヌ、フォヌム蚘入䞭などは 手動遷移 + 確認が安党

  • router.push() を䜿えば、遷移タむミングを完党に制埡できる

💡 今埌の改善ポむント

<GuardedLink> コンポヌネントを共通化し、ガヌドロゞックを抜出

グロヌバルなタむマヌ状態isLearningを zustand などで共有すればよりスマヌトに制埡可胜


🏁 最埌に

このような「Next.js の暗黙の仕様による意図しない動䜜」は、開発䞭に気付きにくい萜ずし穎です。

しかし、router.push() に切り替えるこずで柔軟な制埡が可胜になり、UX の向䞊に぀ながりたす。

「タむマヌ付き蚘録アプリ」などを䜜っおいる方の参考になれば嬉しいです

シェア

Threads
icon
さかした
おじさんでも孊べるをモットヌに。 以前はRuby(3幎)、今は React / Next.js を䞭心に、孊習䞭。
Loading...
蚘事䞀芧に戻る
Threads
0