Open1
Linkの落とし穴について
target="_blank"で外部リンク遷移ができなかった。
<Sample onClick={e.preventDefault}>
const Sample = () => {
return (
<Link href={meetingUrl} target="_blank">
外部サイトへリンク
</Link>
)
}
上記のコードで起きていること。
- リンクをクリックすると外部リンクに遷移するイベントが発火。
- イベントが親に伝播。
- 親のe.preventDefaultによってイベントが阻止される。
一方で...
<Sample onClick={e.preventDefault}>
const Sample = () => {
return (
<Link href={meetingUrl} >
外部サイトへリンク
</Link>
)
}
target="_blank"を削除すると、同一ページ内では遷移できる。
これは処理のタイミングの問題だった。
- 通常の遷移:即座に実行される → preventDefault()の前に完了
- 新しいタブ:処理に若干の遅延 → preventDefault()に阻止される
外部リンクは別タブで開きたいので
e.stopPropagationを追加すれば解決した
<Sample onClick={e.preventDefault}>
const Sample = () => {
return (
<Link href={meetingUrl} target="_blank" onClick={e.stopPropagation}>
外部サイトへリンク
</Link>
)
}
上記の変更により
- リンククリックでイベントが発火。
- stopPropagationにより、イベントが親に伝播しなくなり、preventDefaultによる阻止が起きない。