You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
'use client'import{usePathname}from'next/navigation'exportdefaultfunctionLocaleSwitcher(){constpathname=usePathname()functionswitchLocale(locale){// e.g. '/en/about' or '/fr/contact'constnewPath=`/${locale}${pathname}`window.history.replaceState(null,'',newPath)}return(<><buttononClick={()=>switchLocale('en')}>English</button><buttononClick={()=>switchLocale('fr')}>French</button></>)}
前言
上篇我们介绍了如何定义路由,本篇我们讲讲如何在 Next.js 中实现链接和导航。
所谓“导航”,指的是使用 JavaScript 进行页面切换,通常会比浏览器默认的重新加载更快,因为在导航的时候,只会更新必要的组件,而不会重新加载整个页面。
在 Next.js 中,有 4 种方式可以实现路由导航:
<Link>
组件useRouter
Hook(客户端组件)redirect
函数(服务端组件)<Link>
组件Next.js 的
<Link>
组件是一个拓展了原生 HTML<a>
标签的内置组件,用来实现预获取(prefetching) 和客户端路由导航。这是 Next.js 中路由导航的主要和推荐方式。基础使用
基本的使用方式如下:
支持动态渲染
支持路由链接动态渲染:
获取当前路径名
如果需要对当前链接进行判断,你可以使用 usePathname() ,它会读取当前 URL 的路径名(pathname)。示例代码如下:
跳转行为设置
App Router 的默认行为是滚动到新路由的顶部,或者在前进后退导航时维持之前的滚动距离。
如果你想要禁用这个行为,你可以给
<Link>
组件传递一个scroll={false}
属性,或者在使用router.push
和router.replace
的时候,设置scroll: false
:注:关于
<Link>
组件的具体用法,我们还会在后面的文章中详细介绍。useRouter() hook
第二种方式是使用 useRouter,这是 Next.js 提供的用于更改路由的 hook。使用示例代码如下:
注意使用该 hook 需要在客户端组件中。(顶层的
'use client'
就是声明这是客户端组件)注:关于 useRouter() hook 的具体用法,我们会在后面的文章中详细介绍。
redirect 函数
客户端组件使用 useRouter hook,服务端组件则可以直接使用 redirect 函数,这也是 Next.js 提供的 API,使用示例代码如下:
注:关于 redirect() 函数的具体用法,我们会在后面的文章中详细介绍。
History API
也可以使用浏览器原生的 window.history.pushState 和 window.history.replaceState 方法更新浏览器的历史记录堆栈。通常与 usePathname(获取路径名的 hook) 和 useSearchParams(获取页面参数的 hook) 一起使用。
比如用 pushState 对列表进行排序:
replaceState 会替换浏览器历史堆栈的当前条目,替换后用户无法后退,比如切换应用的地域设置(国际化):
总结
恭喜你,完成了本节内容的学习!
本篇我们介绍了 4 种实现导航的方式,但所涉及的具体概念如服务端组件、客户端组件、各种 hooks、函数方法等都未展开讲解,我们会在后续的文章中讲述。本篇可以作为概览,主要是为了方便大家写 Demo 的时候用到导航相关的内容。
参考链接
The text was updated successfully, but these errors were encountered: