Next.js - Linking and Navigating

文章详细讲解了Next.js中如何通过Link组件和useRouter进行导航,涉及动态链接、活跃链接检测、滚动控制和路由预取/缓存策略。
摘要由CSDN通过智能技术生成

在 Next.js 中,有两种方法可以在路由之间导航:
使用 Link 组件
使用 useRouter 钩子
本页将介绍如何使用 Link、useRouter() 并深入探讨导航的工作原理。

<Link> Component

<Link> 是一个内置组件,它扩展了 HTML <a> 标记,可在路由之间提供预取和客户端导航。它是 Next.js 中路由间导航的主要方式。

您可以从 next/link 中导入该组件,并将 href prop 传递给该组件:

// app/page.tsx
import Link from 'next/link'
 
export default function Page() {
  return <Link href="/dashboard">Dashboard</Link>
}

你还可以向 <Link> 传递其他可选option。


Linking to Dynamic Segments 链接到动态片段

在链接到动态片段时,您可以使用模板文字和插值法生成链接列表。例如,生成一个博客文章列表:

// app/blog/PostList.js
import Link from 'next/link'
 
export default function PostList({ posts }) {
  return (
    <ul>
      {posts.map((post) => (
        <li key={post.id}>
          <Link href={`/blog/${post.slug}`}>{post.title}</Link>
        </li>
      ))}
    </ul>
  )
}

您可以使用 usePathname() 来确定链接是否处于活动状态。例如,要向活动链接添加一个类,可以检查当前路径名是否与链接的 href 匹配。

// app/ui/Navigation.js

'use client'
 
import { usePathname } from 'next/navigation'
import Link from 'next/link'
 
export function Navigation({ navLinks }) {
  const pathname = usePathname()
 
  return (
    <>
      {navLinks.map((link) => {
        const isActive = pathname === link.href
 
        return (
          <Link
            className={isActive ? 'text-blue' : 'text-black'}
            href={link.href}
            key={link.name}
          >
            {link.name}
          </Link>
        )
      })}
    </>
  )
}

Scrolling to an id

Next.js应用程序路由器的默认行为是滚动到新路线的顶部,或者保持滚动位置以进行前后导航。

如果你想在导航中滚动到特定的id,你可以在URL后面添加一个#哈希链接,或者只将一个哈希链接传递给href道具。这是可能的,因为<Link>渲染到<a>元素。

<Link href="/dashboard#settings">Settings</Link>
 
// Output
<a href="/dashboard#settings">Settings</a>

Disabling scroll restoration(禁用滚动恢复)

Next.js应用程序路由器的默认行为是滚动到新路线的顶部,或者保持滚动位置以进行前后导航。如果您想禁用此行为,可以将scroll={false}传递给<Link>组件,或者将scroll:false传递给router.push()或router.replace()。

// next/link
<Link href="/dashboard" scroll={false}>
  Dashboard
</Link>
// useRouter
import { useRouter } from 'next/navigation'
 
router.push('/dashboard', { scroll: false })

useRouter() Hook

使用useRouter() 可以通过编程更改路由。

Hook只能在客户端组件中使用,并从 next/navigation 中导入。

// app/page.tsx
'use client'
 
import { useRouter } from 'next/navigation'
 
export default function Page() {
  const router = useRouter()
 
  return (
    <button type="button" onClick={() => router.push('/dashboard')}>
      Dashboard
    </button>
  )
}

注意:

  1. userRouter更多详情。
  2.  除非您有使用 useRouter 的特殊要求,否则请使用 <Link> 组件在路由之间导航。

路由和导航的工作原理

应用程序路由器采用混合方法进行路由和导航。在服务器上,应用程序代码会自动按路由段进行代码拆分。而在客户端,Next.js 会预取并缓存路由段。这意味着,当用户导航到一个新路由时,浏览器不会重新加载页面,而只会重新呈现发生变化的路由段,从而改善导航体验和性能。
1. 预取
预取是一种在用户访问路线之前在后台预加载路线的方法。
在 Next.js 中,路由有两种预取方式:

2. 缓存

Next.js 有一个名为路由器缓存(Router Cache)的内存客户端缓存。当用户在应用中浏览时,预取路由段的 React 服务器组件有效载荷和访问过的路由都会存储在缓存中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值