You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

常见问题排查

  1. 未调用depends:如果load函数里没有注册依赖标识符,invalidate无法定位到要触发的目标load函数
  2. 标识符不匹配:invalidate传入的字符串必须和depends里的完全一致,包括大小写和格式
  3. 标识符格式错误:必须遵循前缀:后缀的格式,不能包含空格或非法特殊字符

额外说明

  • 调用invalidateAll()会触发所有注册了depends的load函数,包括使用自定义标识符的类型
  • 客户端和服务器端的load函数,触发规则完全相同

内容的提问来源于stack exchange,提问作者HakonIngvaldsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:25:39