我是一个Svelte和编程的新手。相较于sapper,我更喜欢学习SvelteKit(Svelte@Next),因为它似乎是Svelte发展的方向。
对于我的个人项目,我需要支持基于URL slug的动态路由。在SvelteKit中该如何实现呢?例如,如果我有一个/blog目录并且需要根据其“id”提取内容,我该怎么做呢?
我遇到的困难部分是如何访问URL slug参数。
先谢谢了。
我是一个Svelte和编程的新手。相较于sapper,我更喜欢学习SvelteKit(Svelte@Next),因为它似乎是Svelte发展的方向。
对于我的个人项目,我需要支持基于URL slug的动态路由。在SvelteKit中该如何实现呢?例如,如果我有一个/blog目录并且需要根据其“id”提取内容,我该怎么做呢?
我遇到的困难部分是如何访问URL slug参数。
先谢谢了。
/blog/<slug>
,你需要添加以下内容:src/routes/blog/[slug]
|_ +page.js
|_ +page.svelte
然后在 src/routes/blog/[slug]/+page.js
中,您可以添加类似以下内容的代码:
export const load = ({ params }) => {
return {
slug: params.slug
}
}
这将返回一个data
属性到+page.svelte
,因此您可以编写类似于:
<script>
export let data;
</script>
<h1>{data.slug}</h1>
注意 - 我的回复中的信息可能不适用于SvelteKit不断成熟的版本,但从我迄今为止所做的实验来看,这是有效的:
基于参数的路由与 sveltejs/sapper-template
类似。 首先应该学习 Sapper 是如何做的。 假设我有一个名为 blog
的路由,其中包含单个参数 slug (/blog/page-1 和 /blog/page-2)
[slug].svelte
sveltejs/sapper-template
示例中复制。preload
函数重命名为具有单个参数的 load
,例如 ctx
props
export async function load(ctx) {
let slug = ctx.page.params.slug
return { props: { slug }}
}
[slug].svelte
文件,并创建一个名为 [...data].svelte
的文件,然后将加载方法更改为:export async function load(ctx) {
let [year, month, day, slug] = ctx.page.params.data;
return { props: { data: { year, month, day, slug }}}
}
不要忘记将您的数据属性定义为对象。以下是一个TypeScript示例:
<script lang="ts">
export let data: { slug: string, year: number, month: number, day: number };
</script>
从那里使用值如 {data.slug}
,等等
愉快地编程吧
[...data]
。这样我就能创建一个 [...path]
目录并匹配所有的 URL。当页面加载时,例如首页的 params.path
为 ''
,或者嵌套页面的 params.path
为 'use-cases/something'
。 - Jan Švábík我也曾遇到过 TypeScript 导入问题,所以这里提供一个完整的 TypeScript 示例。
结构:
src/routes/coins/[coin_name]
|_ +page.ts
|_ +page.svelte
+page.ts:
import type { PageLoad } from './$types';
export const load: PageLoad = ({ params }) => {
return {
name: params.coin_name
}
}
export interface CoinPage{
name: string
}
+page.svelte 和数据的使用:
<script lang="ts">
import type { CoinPage } from "./+page";
export let data:CoinPage;
</script>
<h1>{data.name}</h1>