iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
Modern Web

Svelte 的奇妙冒險系列 第 25

[Svelte 的奇妙冒險] Day 25 - Shallow routing

  • 分享至 

  • xImage
  •  

今天來介紹一個有趣的功能「Shallow routing」,直白翻譯的話叫做「淺層路由」,所謂淺層就是相對於一般的 routing 來說他雖然更新了 URL 但並沒有真正的換頁。

如果是用過 Next.js 的讀者應該能理解這個概念,可以讓這個更換 URL 的動作不要觸發真正的換頁進而不用重新執行 getServerSideProps 之類的過程。

基本用法

而 SvelteKit 中主要是用內建的 pushState function 來做到這件事情,第一個參數是路由的設定,如果 '' 就是維持 一樣的 URL,第二個參數則是我們要記錄的狀態,然後我們可以透過 $page store 取出來。

下面是一個開關 modal 的範例,當 $page.state.showModaltrue 時就顯示 modal ,然後打開 showModal() ,就是將 {showModal: true} 放進 $page.state 裡面。

<script lang="ts">
	import { pushState } from '$app/navigation';
	import { page } from '$app/stores';

	function showModal() {
		pushState('', {
			showModal: true
		});
	}
</script>

{#if $page.state.showModal}
	<dialog class="modal-open modal">
		<div class="modal-box">
			<h3 class="text-lg font-bold">Hello!</h3>
			<p class="py-4">This modal works with a hidden checkbox!</p>
			<div class="modal-action">
				<button
					class="btn"
					onclick={() => {
						history.back();
					}}>Close</button
				>
			</div>
		</div>
	</dialog>
{/if}

<button onclick={showModal}>Show Modal</button>

可以發現我們是切換上下頁時 model 也會隨著開啟及關閉。

補充說明一下,如果是使用 typescript 的話需要到 app.d.ts 新增 type 定義的

declare global {
	namespace App {
		interface PageState {
			showModal: boolean;
		}
	}
}

以這個例子來說,就是需要定義 showModal 這樣才能讓 $page.state 擁有對應的 type

那好處是什麼?

如果有一個繁複步驟的表單我們可以利用 Shallow routing 來讓使用者可以快速前後頁跳轉,但不用擔心 re-redner 後造成的資料遺失,另外一個好處是可以配合手機的手勢,以 iOS 來說從最左邊往右滑就可以回上一步,那假設一樣式有一個 model 或其他覆蓋整頁的元件然後使用者就不用額外去點擊關閉或者其他操作可以透過手勢關掉。


參考資料

source code

demo 站點

https://30days-for-svelte5.pages.dev/


上一篇
[Svelte 的奇妙冒險] Day 24 - Snapshot
下一篇
[Svelte 的奇妙冒險] Day 26 - 進階路由
系列文
Svelte 的奇妙冒險30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言