【问题标题】:Is there any other way to set route-regex, apart from file-names?除了文件名之外,还有其他方法可以设置路由正则表达式吗?
【发布时间】:2020-04-18 11:11:47
【问题描述】:

我目前在 sapper 中遇到了路由限制。我们需要创建一个匹配两个“slug”的路由,比如[section(foo|bar)]。这在 *nix 上运行良好,但在 Windows 上失败,因为非法的 | 字符。 在这条路线旁边,还有一条[slug] 路线在同一层,与其余路线相匹配。这是故意的,因为只有 foobar 应该以不同的方式呈现,并且它们也会有子路由。

我想到了以下方法:

  • 通过检查slugfoo 还是bar 来处理[slug] 路由中的所有内容,并以不同的方式处理这些情况。 我宁愿不这样做,因为代码将难以阅读/维护,并且有些子路由应该只适用于 foobar
  • 创建两个文件夹foobar,而不是一个名为[section(foo|bar)] 的文件夹。 这是不可取的,因为这意味着很多重复的代码
  • 为路线添加前缀,例如。创建一个文件夹section,其中包含一个[slug] 路由。这似乎是问题最少的选项,但我更喜欢 /foo 作为 URL 而不是 /section/foo

还有其他可能的选择吗?也许是一种与 Windows 兼容的写作方式[section(foo|bar)]?还是一种定义路由正则表达式的方法,而不是通过文件名?

【问题讨论】:

    标签: svelte sapper


    【解决方案1】:

    好吧,我只有一个想法给你。买家要小心……虽然我试过了;我还没有在我的项目中获得以下概念的基础知识,最终得到了相同的 [foo][bar] 解决方案。

    Sapper 有一个名为传播路线的概念。它们使用[...slug].svelte 文件/路由器约定来表示。

    这个想法是在文件名中使用...spread 运算符通知路由器该参数应被视为能够保存元素的对象数组。路由器应该.join('/')所有的数组元素组成路由...

    • 来自 Sapper 文档

      如果您不想创建多个文件夹来捕获多个参数(例如[year]/[month]/...),或者如果参数数量是动态的,则可以使用扩展路由参数。例如,您可以为/blog/[...slug].svelte 创建一个文件,然后像这样提取参数,而不是单独捕获/blog/[slug]/[year]/[month]/[day]

    <!-- src/routes/blog/[...slug].svelte -->
    <script context="module">
        export async function preload({ params }) {
            let [slug, year, month, day] = params.slug;
    
            return { slug, year, month, day };
        }
    </script>
    

    我对您的想法是利用传播路由,以便您通过将查询作为这些对象之一填充来绕过管道| 字符问题。

    【讨论】:

      猜你喜欢
      • 2020-06-18
      • 2019-11-06
      • 2018-03-01
      • 1970-01-01
      • 2015-12-08
      • 2019-09-14
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多