mirror of
https://github.com/hanzoai/next.js.git
synced 2026-09-24 17:00:51 +00:00
117 lines
3.0 KiB
TypeScript
117 lines
3.0 KiB
TypeScript
import Link from 'next/link'
|
|
import { useState } from 'react'
|
|
import React from 'react'
|
|
|
|
interface OnNavigateProps {
|
|
children: React.ReactNode
|
|
rootPath: string
|
|
}
|
|
|
|
export default function OnNavigate({ children, rootPath }: OnNavigateProps) {
|
|
const [isClicked, setIsClicked] = useState(false)
|
|
const [isNavigated, setIsNavigated] = useState(false)
|
|
const [isLocked, setIsLocked] = useState(false)
|
|
|
|
return (
|
|
<div>
|
|
<nav>
|
|
<div id="navigation-state">
|
|
<p id="is-clicked">isClicked: {isClicked ? 'true' : 'false'}</p>
|
|
<p id="is-navigated">isNavigated: {isNavigated ? 'true' : 'false'}</p>
|
|
<p id="is-locked">isLocked: {isLocked ? 'true' : 'false'}</p>
|
|
</div>
|
|
<button id="toggle-lock" onClick={() => setIsLocked(!isLocked)}>
|
|
{isLocked ? 'Unlock' : 'Lock'}
|
|
</button>
|
|
|
|
<div>
|
|
<Link
|
|
href={rootPath}
|
|
id="link-to-main"
|
|
onClick={() => setIsClicked(true)}
|
|
onNavigate={(e: any) => {
|
|
if (isLocked) {
|
|
e.preventDefault()
|
|
} else {
|
|
setIsNavigated(true)
|
|
}
|
|
}}
|
|
>
|
|
Client Side Navigation to Main Page
|
|
</Link>
|
|
</div>
|
|
|
|
<div>
|
|
<Link
|
|
href={`${rootPath}/subpage`}
|
|
id="link-to-subpage"
|
|
onClick={() => setIsClicked(true)}
|
|
onNavigate={(e: any) => {
|
|
if (isLocked) {
|
|
e.preventDefault()
|
|
} else {
|
|
setIsNavigated(true)
|
|
}
|
|
}}
|
|
>
|
|
Client Side Navigation to Subpage
|
|
</Link>
|
|
</div>
|
|
|
|
<div>
|
|
<Link
|
|
href="https://nextjs.org"
|
|
id="external-link-with-target"
|
|
onClick={() => setIsClicked(true)}
|
|
onNavigate={() => setIsNavigated(true)}
|
|
target="_blank"
|
|
>
|
|
External Link with Target
|
|
</Link>
|
|
</div>
|
|
|
|
<div>
|
|
<Link
|
|
href="https://nextjs.org"
|
|
id="external-link"
|
|
onClick={() => alert('onClick')}
|
|
onNavigate={() => alert('onNavigate')}
|
|
>
|
|
External Link
|
|
</Link>
|
|
</div>
|
|
|
|
<div>
|
|
<Link
|
|
href="https://nextjs.org"
|
|
id="external-link-with-replace"
|
|
onClick={() => alert('onClick')}
|
|
onNavigate={() => alert('onNavigate')}
|
|
replace
|
|
>
|
|
External Link with replace
|
|
</Link>
|
|
</div>
|
|
|
|
<div>
|
|
<Link
|
|
download
|
|
href="/zip.zip"
|
|
id="download-link"
|
|
onClick={() => setIsClicked(true)}
|
|
onNavigate={() => {
|
|
setIsNavigated(true)
|
|
}}
|
|
>
|
|
Download Link with download attribute
|
|
</Link>
|
|
</div>
|
|
</nav>
|
|
|
|
<div id="content" style={{ border: '1px solid red' }}>
|
|
{children}
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|