SvelteKit中自定义标识符调用invalidate无法触发非Fetch类型load的问题
解决Svelte/SvelteKit中非Fetch类型load函数的invalidate生效问题
核心修复逻辑
要让invalidate触发非Fetch类型的load函数,必须在load函数中显式调用depends注册自定义依赖标识符——这是触发机制的核心前提,也是容易被忽略的细节。
客户端load(+page.ts)示例
修正后的+page.ts代码:
import { depends } from '$app/navigation'; export function load() { // 注册符合格式要求的自定义依赖标识符(前缀:后缀) depends('my:custom-data'); // 模拟非Fetch的本地数据生成逻辑 return { currentTime: new Date().toISOString() }; }
对应的+page.svelte页面组件:
<script> import { invalidate } from '$app/navigation'; export let data; </script> <p>当前时间:{data.currentTime}</p> <button on:click={() => invalidate('my:custom-data')}>刷新数据</button>
服务器端load(+page.server.ts)示例
如果是服务器端的load函数,逻辑完全一致:
// +page.server.ts import { depends } from '$app/navigation'; export function load() { depends('my:server-data'); // 模拟服务器端数据生成逻辑 return { serverTime: new Date().toISOString() }; }
对应的页面组件:
<script> import { invalidate } from '$app/navigation'; export let data; </script> <p>服务器时间:{data.serverTime}</p> <button on:click={() => invalidate('my:server-data')}>刷新服务器数据</button>
常见问题排查
- 未调用depends:如果load函数里没有注册依赖标识符,
invalidate无法定位到要触发的目标load函数 - 标识符不匹配:
invalidate传入的字符串必须和depends里的完全一致,包括大小写和格式 - 标识符格式错误:必须遵循
前缀:后缀的格式,不能包含空格或非法特殊字符
额外说明
- 调用
invalidateAll()会触发所有注册了depends的load函数,包括使用自定义标识符的类型 - 客户端和服务器端的load函数,触发规则完全相同
内容的提问来源于stack exchange,提问作者HakonIngvaldsen
相关产品推荐
相关产品推荐

