跳至主要內容

當使用者從一個頁面導覽到另一個頁面時,SvelteKit 會呼叫你的 load 函式,但前提是它認為某些東西已變更。

在這個範例中,在時區之間導覽會導致 src/routes/[...timezone]/+page.js 中的 load 函式重新執行,因為 params.timezone 是失效的。但是 src/routes/+layout.js 中的 load 函式 *不會* 重新執行,因為就 SvelteKit 而言,它沒有因導覽而失效。

我們可以透過使用 invalidate(...) 函式手動使其失效來修正此問題,此函式會接受一個 URL 並重新執行任何相依於它的 load 函式。因為 src/routes/+layout.js 中的 load 函式呼叫了 fetch('/api/now'),所以它相依於 /api/now

src/routes/[...timezone]/+page.svelte 中,加入一個 onMount 回呼,每秒呼叫一次 invalidate('/api/now')

src/routes/[...timezone]/+page
<script>
	import { onMount } from 'svelte';
	import { invalidate } from '$app/navigation';

	let { data } = $props();

	onMount(() => {
		const interval = setInterval(() => {
			invalidate('/api/now');
		}, 1000);

		return () => {
			clearInterval(interval);
		};
	});
</script>

<h1>
	{new Intl.DateTimeFormat([], {
		timeStyle: 'full',
		timeZone: data.timezone
	}).format(new Date(data.now))}
</h1>

你也可以將一個函式傳遞給 invalidate,以防你想根據模式而非特定 URL 使其失效

在 GitHub 上編輯此頁面

1