我有一个简单的+page.ts
显示data
字符串并提供“更新”按钮:
<script lang="ts">
import { invalidateAll } from '$app/navigation';
const { data } = $props();
</script>
<p>Data: {data.data}</p>
<button onclick={() => invalidateAll()}>Update</button>
我有一个通用load
的+page.ts
,它更喜欢使用某种缓存 - 这里它只是一个类中的静态字段:
export async function load() {
let data = Cache.getData();
if (data) {
console.log('Found cached data');
} else {
console.log('No cached data - fetching');
data = 'Fresh new data';
Cache.setData(data);
}
return {
data
};
}
class Cache {
static data?: string;
static getData() {
return this.data;
}
static setData(data: string) {
this.data = data;
}
static clear() {
this.data = undefined;
}
}
console.log('Initializing cache');
Cache.setData('Old cached data');
根据设计,绕过此缓存的唯一方法是用户通过按下“更新”按钮明确请求它。但是,我该如何判断是load
由失效引起的,而不是由初始页面加载引起的,以便清除缓存?或者更具体地说,是通过按下“更新”按钮?换句话说,我可以在这里输入什么if
:
export async function load() {
if (/* what goes here? */) {
Cache.clear();
}
...
理想情况下,我正在寻找一种通用的方法,而不是像window
为 CSR 设置字段或为 SSR 设置请求标头那样一些 hack 的方法。可能是路由相关的,比如查询参数?但是如何为invalidate
或invalidateAll
调用设置这些呢?
您应该能够使用
goto
查询参数。该函数有一个选项参数,您可以在其中设置invalidateAll
。(您也可以使用
replaceState
after 再次删除该参数。)