Sapper中如何正确获取路由参数?
我在Sapper里写了个动态路由 [slug].svelte,但用 page.params.slug 拿不到值,页面直接报 undefined。是不是 SSR 环境下不能这么取?
我试过在 onMount 里读,也试过直接在 script 标签顶层读,都不行。控制台也没报错,就是拿不到参数。路由文件路径是 src/routes/blog/[slug].svelte,访问 /blog/hello 应该能拿到 slug 为 “hello” 才对啊。
export async function preload(page) {
console.log('params:', page.params); // 这里打印出来是 {}
return { slug: page.params.slug };
}
page.params打印出空对象,大概率不是 SSR 的问题,而是路由文件本身没有被正确识别。先说正确的写法。Sapper 的动态路由参数需要在
preload函数里取,然后通过 props 传给组件实例:回到你的问题,
page.params是空对象,我建议排查这几个地方:第一,确认文件名。方括号必须是英文半角的
[slug].svelte,别手滑打成了中文方括号或者全角字符,这个坑我至少踩过两次。第二,重启开发服务器。Sapper 的路由是编译时生成的,新增动态路由文件后有时候热更新不生效,必须重启。执行
rm -rf __sapper__ && npm run dev清一下缓存重新跑。第三,检查目录结构。正确路径应该是
src/routes/blog/[slug].svelte,别写成了src/routes/blog/[slug]/index.svelte,这两种写法虽然都能匹配/blog/hello,但参数位置不一样。推荐的做法是在
preload里把参数处理好再返回,组件层只管用export let接收,这样 SSR 和客户端都能正常工作。如果还有问题,把完整的文件内容贴出来看看。