SvelteKit参数变更时如何重新触发+page.server的load函数?
问题根源
SvelteKit在客户端导航到同一路径的不同动态参数时,会复用现有页面组件并缓存之前的load函数数据,导致新参数对应的load函数未触发,页面内容无法更新。
解决方案
方法1:导航时强制失效所有数据
修改SearchBar组件中的handleSearch函数,在goto时添加invalidateAll: true选项,强制重新运行所有load函数:
const handleSearch = () => { goto(`/movies/search/${searchValue}`, { invalidateAll: true }); };
方法2:监听参数变化并主动失效对应数据
在搜索页的+page.svelte中,监听路由参数变化,调用invalidate触发对应load函数重新执行:
<script> import { page, invalidate } from '$app/stores'; export let data; const { searchResults } = data; // 当search_params参数变化时,失效当前路由的load数据 $: if ($page.params.search_params) { invalidate(`/movies/search/${$page.params.search_params}`); } </script> <SearchBar placeholder="Search for Movies" /> <CardGrid title="Search Results"> {#each searchResults as movie (movie.id)} <Card {movie} /> {/each} </CardGrid>
方法3:禁用fetch缓存确保每次请求最新数据
在+page.server.js的fetch请求中添加cache: 'no-store',避免浏览器或SvelteKit缓存旧请求结果:
const resp = await fetch(`https://api.themoviedb.org/3/search/movie?api_key=${TMDB_API_KEY}&language=en-US&query=${search_params}&page=1&include_adult=false`, { cache: 'no-store' });
说明
- 方法1简单直接,适合小型应用;
- 方法2更精准,仅失效当前路由的数据;
- 方法3解决缓存导致的旧数据问题,可与前两种方法配合使用。
内容的提问来源于stack exchange,提问作者KN1368
相关产品推荐
相关产品推荐

