主题
路由导航
声明式导航
<Link> 组件用于在应用程序中创建链接。
支持的 Props:
href:链接的目标地址replace:是否替换当前历史记录scroll:是否在导航时滚动到顶部prefetch:是否在页面加载时预取链接passHref:将href传递给子元素(通常用于自定义组件)
示例:
tsx
import Link from 'next/link'
function Navigation() {
return (
<nav>
<Link href="/" passHref>
<a>首页</a>
</Link>
<Link href="/about" passHref>
<a>关于</a>
</Link>
</nav>
)
}推荐使用 <Link> 而不是 <a>
通过 <a> 会导致整个页面刷新,而使用 <Link> 只会更新部分内容(例如,页面的某个部分或组件)。
编程式导航
useRouter 钩子用于在组件中访问路由对象。
支持的属性:
push:导航到新页面replace:替换当前页面back:返回上一页forward:前进到下一页
示例:
tsx
'use client'
import { useRouter } from 'next/navigation'
function MyComponent() {
const router = useRouter()
const handleNavigation = () => {
router.push('/about')
// router.replace('/about')
// router.back()
// router.forward()
}
return <button onClick={handleNavigation}>Go to About</button>
}匹配当前路由的链接
可通过 usePathname 钩子获取当前路由路径。
tsx
'use client'
import { usePathname } from 'next/navigation'
const navLinks = [
{ name: '首页', href: '/' },
{ name: '关于', href: '/about' },
]
function Layout({ children }: { children: React.ReactNode }) {
const pathname = usePathname()
return (
<nav>
{navLinks.map(({ name, href }) => {
const isActive = pathname.startsWith(href)
return (
<Link className={isActive ? 'active' : ''} href={href} key={href}>
{name}
</Link>
)
})}
</nav>
)
}