動態

詳情 返回 返回

SvelteKit 最新中文文檔教程(15)—— 鏈接選項 - 動態 詳情

前言

Svelte,一個語法簡潔、入門容易,面向未來的前端框架。

從 Svelte 誕生之初,就備受開發者的喜愛,根據統計,從 2019 年到 2024 年,連續 6 年一直是開發者最感興趣的前端框架 No.1

image.png

Svelte 以其獨特的編譯時優化機制著稱,具有輕量級高性能易上手等特性,非常適合構建輕量級 Web 項目

為了幫助大家學習 Svelte,我同時搭建了 Svelte 最新的中文文檔站點。

如果需要進階學習,也可以入手我的小冊《Svelte 開發指南》,語法篇、實戰篇、原理篇三大篇章帶你係統掌握 Svelte!

歡迎圍觀我的“網頁版朋友圈”、加入“冴羽·成長陪伴社羣”,踏上“前端大佬成長之路”。

鏈接選項

在 SvelteKit 中,使用 <a> 元素(而不是框架特定的 <Link> 組件)在應用程序的路由之間導航。如果用户點擊一個由應用程序"擁有"的鏈接(而不是指向外部網站的鏈接),SvelteKit 將通過導入其代碼並調用任何所需的 load 函數來獲取數據,從而導航到新頁面。

您可以使用 data-sveltekit-* 屬性來自定義鏈接的行為。這些屬性可以應用於 <a> 本身,或者應用於父元素。

這些選項也適用於具有 method="GET"<form> 元素。

data-sveltekit-preload-data

在瀏覽器註冊到用户點擊鏈接之前,我們可以檢測到他們已經將鼠標懸停在鏈接上(在桌面端),或者觸發了 touchstartmousedown 事件。在這兩種情況下,我們可以做出明智的猜測,即 click 事件即將到來。

SvelteKit 可以利用這些信息來提前開始導入代碼和獲取頁面數據,這可以為我們多爭取幾百毫秒的時間 —— 這就是用户界面感覺遲緩和感覺流暢之間的差異。

我們可以通過 data-sveltekit-preload-data 屬性來控制這種行為,該屬性可以是以下兩個值之一:

  • "hover" 表示當鼠標在鏈接上停留時將開始預加載。在移動設備上,預加載在 touchstart 時開始
  • "tap" 表示一旦註冊到 touchstartmousedown 事件就會開始預加載

默認項目模板在 src/app.html 中的 <body> 元素上應用了 data-sveltekit-preload-data="hover" 屬性,這意味着默認情況下每個鏈接都會在懸停時預加載:

<body data-sveltekit-preload-data="hover">
    <div style="display: contents">%sveltekit.body%</div>
</body>

有時候,當用户懸停在鏈接上時調用 load 可能不太理想,要麼是因為這可能會導致誤判(懸停後不一定會點擊),要麼是因為數據更新非常快,延遲可能意味着數據已經過時。

在這些情況下,您可以指定 "tap" 值,這會導致 SvelteKit 僅在用户點擊鏈接時調用 load

<a data-sveltekit-preload-data="tap" href="/stonks"> 獲取當前股票價值 </a>
[!NOTE] 您也可以從 $app/navigation 導入 preloadData,以編程的方式調用。

如果用户設置了減少數據使用(即 navigator.connection.saveDatatrue),數據將永遠不會被預加載。

data-sveltekit-preload-code

即使在您不想為鏈接預加載數據的情況下,預加載代碼也可能是有益的。data-sveltekit-preload-code 屬性的工作方式類似於 data-sveltekit-preload-data,但它可以接受四個值之一,按"急切"遞減排序:

  • "eager" 表示鏈接將立即預加載
  • "viewport" 表示鏈接一旦進入視口就會預加載
  • "hover" - 如上所述,但只預加載代碼
  • "tap" - 如上所述,但只預加載代碼

注意,viewporteager 僅適用於導航後立即存在於 DOM 中的鏈接 —— 如果鏈接是稍後添加的(例如在 {#if ...} 塊中),則在觸發 hovertap 之前不會預加載。這是為了避免因過度觀察 DOM 變化而導致的性能問題。

[!NOTE] 由於預加載代碼是預加載數據的先決條件,因此只有當此屬性指定的值比存在的任何 data-sveltekit-preload-data 屬性更急切時,此屬性才會生效。

data-sveltekit-preload-data 一樣,如果用户選擇了減少數據使用,此屬性將被忽略。

data-sveltekit-reload

偶爾,我們需要告訴 SvelteKit 不要處理鏈接,而是讓瀏覽器來處理。給鏈接添加 data-sveltekit-reload 屬性...

<a data-sveltekit-reload href="/path">路徑</a>

...將會在點擊鏈接時導致完整的頁面導航。

具有 rel="external" 屬性的鏈接將受到相同的處理。此外,它們在預渲染期間會被忽略。

data-sveltekit-replacestate

有時您不希望導航在瀏覽器的會話歷史記錄中創建新條目。給鏈接添加 data-sveltekit-replacestate 屬性...

<a data-sveltekit-replacestate href="/path">路徑</a>

...在點擊鏈接時將替換當前的 history 條目,而不是用 pushState 創建新的條目。

data-sveltekit-keepfocus

有時您不希望在導航後重置焦點。例如,也許您有一個在用户輸入時就提交的搜索表單,您想保持文本輸入框的焦點。給它添加 data-sveltekit-keepfocus 屬性...

<form data-sveltekit-keepfocus>
    <input type="text" name="query" />
</form>

...將導致當前獲得焦點的元素在導航後保持焦點。通常,應該避免在鏈接上使用此屬性,因為獲得焦點的元素將是 <a> 標籤(而不是之前獲得焦點的元素),並且屏幕閲讀器和其他輔助技術的用户通常期望在導航後移動焦點。您還應該只在導航後仍然存在的元素上使用此屬性。如果元素不再存在,用户的焦點將會丟失,這會讓使用輔助技術的用户感到困惑。

data-sveltekit-noscroll

在導航到內部鏈接時,SvelteKit 會模仿瀏覽器的默認導航行為:它會將滾動位置改變到 0,0,使用户處於頁面的最左上角(除非鏈接包含 #hash,在這種情況下,它會滾動到具有匹配 ID 的元素)。

在某些情況下,您可能希望禁用這種行為。給鏈接添加 data-sveltekit-noscroll 屬性...

<a href="path" data-sveltekit-noscroll>路徑</a>

...將在點擊鏈接後阻止滾動。

禁用選項

要在啓用了這些選項的元素內禁用任何選項,請使用 "false" 值:

<div data-sveltekit-preload-data>
    <!-- 這些鏈接將被預加載 -->
    <a href="/a">a</a>
    <a href="/b">b</a>
    <a href="/c">c</a>

    <div data-sveltekit-preload-data="false">
        <!-- 這些鏈接將不會被預加載 -->
        <a href="/d">d</a>
        <a href="/e">e</a>
        <a href="/f">f</a>
    </div>
</div>

要有條件地將屬性應用於元素,請這樣做:

<div data-sveltekit-preload-data={condition ? 'hover' : false}>

Svelte 中文文檔

點擊查看中文文檔:SvelteKit 鏈接選項

系統學習 Svelte,歡迎入手小冊《Svelte 開發指南》。語法篇、實戰篇、原理篇三大篇章帶你係統掌握 Svelte!

此外我還寫過 JavaScript 系列、TypeScript 系列、React 系列、Next.js 系列、冴羽答讀者問等 14 個系列文章, 全系列文章目錄:https://github.com/mqyqingfeng/Blog

歡迎圍觀我的“網頁版朋友圈”、加入“冴羽·成長陪伴社羣”,踏上“前端大佬成長之路”。

user avatar zaoying 頭像 haoqidewukong 頭像
點贊 2 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.