如何在 Svelte 路由器中将 slugs 拆分为所有可能的选项?

tar*_*inf 4 svelte sveltekit

我想构建 URL 模式,如下所示[lang]/category/[name]-[suffix],其中:

  • suffix是几个字符串之一,例如:['super-product', 'great-gadget', 'ta-ta-ta']
  • name是一个多词slug,比如a-bb-ccc

为了实现它,我决定使用Matching

export function match(param) {
  let result = /^(super-product|great-gadget|ta-ta-ta)/.test(param); 
  return a;
}
Run Code Online (Sandbox Code Playgroud)

对于 URL 来说/en/category/a-bb-ccc-super-product/parambb-ccc-super-product。问:如何让 Svelte 将 URL 拆分为所有可能的选项中的 slugs,例如:a+ bb-ccc-super-producta-bb+ ccc-super-product、 ...、a-bb-ccc-super+ product,而不仅仅是一个a+bb-ccc-super-product

另外,我尝试使用处理程序来解决此问题,但失败了,因为我无法更改 URL。

  • “@sveltejs/kit”:“1.0.0-next.310”
  • “苗条”:“3.47.0”

Jax*_*axx 6

简短的回答,你不能。Svelte 将像非贪婪正则表达式匹配器一样进行匹配,因此在您的情况下[name]-[suffix]name将始终保留第一个匹配连字符 ( )之前出现的所有内容,并将保留第一个匹配连字符的所有踪迹。-suffix

作为参考,引用 SvelteKit 文档(相关位加粗):

一条路线可以有多个动态参数,例如 src/routes/[category]/[item].svelte 甚至 src/routes/[category]-[item].svelte。(参数是“非贪婪的”;在像 xyz 这样不明确的情况下,类别将是 x,项目将是 yz。)

更简单的解决方案是选择不同的参数分隔符_,例如下划线 ( ) 或双连字符 ( --),或者您确定的任何字符序列都不会出现参数中。

或者,如果您绝对想要或需要坚持使用当前的命名方案,则将其视为单个参数 ( ) 会更容易,name然后使用您自己的正则表达式自己解析此单个参数(正如您所尝试的那样,但是错误地保留使用 2 个参数)。