Sapper中如何正确获取路由参数?

Zz鑫平 阅读 670

我在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 };
}
我来解答 赞 3 收藏
二维码
手机扫码查看
1 条解答
南宫姗姗
这个问题我之前也踩过坑。page.params 打印出空对象,大概率不是 SSR 的问题,而是路由文件本身没有被正确识别。

先说正确的写法。Sapper 的动态路由参数需要在 preload 函数里取,然后通过 props 传给组件实例:





{post.title}


slug: {slug}



回到你的问题,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 和客户端都能正常工作。如果还有问题,把完整的文件内容贴出来看看。
点赞 3
2026-02-28 21:37