<Link>
<Link>
是一個 React 元件,它擴展了 HTML 的 <a>
元素,提供 預取 (prefetching) 和客戶端路由導航功能。這是 Next.js 中在路由之間導航的主要方式。
舉例來說,假設有一個包含以下文件的 pages
目錄:
pages/index.js
pages/about.js
pages/blog/[slug].js
我們可以這樣為每個頁面創建連結:
屬性
以下是 Link 元件可用的屬性摘要:
屬性 | 範例 | 類型 | 必填 |
---|---|---|---|
href | href="/dashboard" | 字串或物件 | 是 |
replace | replace={false} | 布林值 | - |
scroll | scroll={false} | 布林值 | - |
prefetch | prefetch={false} | 布林值 | - |
須知:
<a>
標籤的屬性如className
或target="_blank"
可以作為屬性添加到<Link>
上,並會傳遞給底層的<a>
元素。
href
(必填)
要導航到的路徑或 URL。
href
也可以接受物件,例如:
replace
預設為 false
。 當設為 true
時,next/link
會替換當前的歷史記錄狀態,而不是在 瀏覽器的歷史記錄 堆疊中添加新的 URL。
scroll
預設為 true
。 <Link>
的預設行為是滾動到新路由的頂部,或在後退和前進導航時保持滾動位置。當設為 false
時,next/link
在導航後不會滾動到頁面頂部。
prefetch
預設為 true
。 當設為 true
時,next/link
會在後台預取頁面(由 href
指定)。這有助於提高客戶端導航的性能。視口中的任何 <Link />
(初始或通過滾動)都會被預加載。
可以通過傳遞 prefetch={false}
來禁用預取。預取僅在生產環境中啟用。
其他屬性
legacyBehavior
<Link>
不再需要 <a>
元素作為子元素。添加 legacyBehavior
屬性以使用舊行為,或移除 <a>
以升級。提供了一個 代碼修改工具 (codemod) 來自動升級您的代碼。
須知:當
legacyBehavior
未設為true
時,所有anchor
標籤屬性都可以傳遞給next/link
,例如className
、onClick
等。
passHref
強制 Link
將 href
屬性傳遞給其子元素。預設為 false
。
scroll
導航後滾動到頁面頂部。預設為 true
。
shallow
更新當前頁面的路徑而不重新運行 getStaticProps
、getServerSideProps
或 getInitialProps
。預設為 false
。
locale
會自動添加當前使用的語言環境。locale
允許提供不同的語言環境。當設為 false
時,href
必須包含語言環境,因為預設行為被禁用。
範例
連結到動態路由
對於動態路由,使用模板字面量來創建連結路徑會很方便。
例如,您可以生成一個指向動態路由 pages/blog/[slug].js
的連結列表:
如果子元素是包裹 <a>
標籤的自訂元件
如果 Link
的子元素是一個包裹 <a>
標籤的自訂元件,您必須在 Link
上添加 passHref
。如果您使用像 styled-components 這樣的庫,這是必要的。沒有這個,<a>
標籤將不會有 href
屬性,這會影響您網站的可訪問性並可能影響 SEO。如果您使用 ESLint,有一個內建的規則 next/link-passhref
來確保正確使用 passHref
。
- 如果您使用 emotion 的 JSX pragma 功能 (
@jsx jsx
),即使您直接使用<a>
標籤,也必須使用passHref
。 - 元件應支持
onClick
屬性以正確觸發導航。
如果子元素是函數元件
如果 Link
的子元素是一個函數元件,除了使用 passHref
和 legacyBehavior
外,還必須將元件包裹在 React.forwardRef
中:
使用 URL 物件
Link
也可以接收 URL 物件,它會自動格式化以創建 URL 字串。以下是操作方法:
上面的範例包含以下連結:
- 預定義路由:
/about?name=test
- 動態路由:
/blog/my-post
您可以使用 Node.js URL 模組文檔 中定義的所有屬性。
替換 URL 而不是推送
Link
元件的預設行為是將新的 URL push
到 history
堆疊中。您可以使用 replace
屬性來防止添加新條目,如下例所示:
禁用滾動到頁面頂部
Link
的預設行為是滾動到頁面頂部。當定義了 hash 時,它會滾動到特定的 id,就像普通的 <a>
標籤一樣。要防止滾動到頂部 / hash,可以在 Link
中添加 scroll={false}
:
中介軟體 (Middleware)
通常使用 中介軟體 (Middleware) 進行身份驗證或其他涉及將用戶重寫到不同頁面的用途。為了讓 <Link />
元件正確預取通過中介軟體重寫的連結,您需要告訴 Next.js 要顯示的 URL 和要預取的 URL。這是為了避免不必要的請求到中介軟體以知道要預取的正確路由。
例如,如果您想提供一個具有認證和訪客視圖的 /dashboard
路由,您可以在中介軟體中添加類似以下的內容,以將用戶重定向到正確的頁面:
在這種情況下,您需要在 <Link />
元件中使用以下代碼:
須知:如果您使用 動態路由,您需要調整
as
和href
屬性。例如,如果您有一個像/dashboard/[user]
這樣的動態路由,您想通過中介軟體以不同的方式呈現,您會這樣寫:<Link href={{ pathname: '/dashboard/authed/[user]', query: { user: username } }} as="/dashboard/[user]">個人資料</Link>
。
版本歷史
版本 | 變更 |
---|---|
v13.0.0 | 不再需要子元素 <a> 標籤。提供了一個 代碼修改工具 (codemod) 來自動更新您的代碼庫。 |
v10.0.0 | 指向動態路由的 href 屬性會自動解析,不再需要 as 屬性。 |
v8.0.0 | 改進了預取性能。 |
v1.0.0 | 引入了 next/link 。 |