如何在 Vue 3(Vue Router)中设置具有多个动态参数的动态路由

How to set dynamic routes with multiple dynamic parameters in Vue 3 (Vue Router)

如何使用 Vue 3 和 Vue Router 创建具有多个动态参数的动态路由?
这些参数需要能够以任何顺序传递。

在我们的 webapp 中,我们有超过 500 个视图,所以我们在运行时解析路由,在必要时加载组件 (.vue),因为设置这 500 个视图中的每一个都太疯狂了在路由文件中。

假设我们有一个名为“Products”的视图,我们的客户有多个过滤器选项,并且这些过滤器在过滤某些内容时在 URL 中传递。他们可以传递 0 个参数或 10+ 个参数。这取决于他们在过滤什么。

想象一下,用户可以像下面这样传递 URLs:
www.webapp.com/products
www.webapp.com/products/color/red
www.webapp.com/products/brand/myBrand/color/green
www.webapp.com/products/size/36/brand/myBrand
以及其他多种动态可能性。

我尝试使用通配符 * 添加路由,但根本行不通。
我的尝试:
{path: '/products/:(.*)', ...}
{path: '/products/:params(.*)', ...}
{path: '/products/:(.*)*', ...}
{path: '/products/:params(.*)*', ...}
{path: '/products/*', ...}
{path: '/products-*', ...}

None 这些尝试成功了。有的抛出错误,有的干脆把URL中的参数去掉,只留下/products。在所有尝试中,this.$route.params 都是空的。

如何使用 Vue 3 和 Vue Router 以任意顺序创建具有多个动态参数的动态路由?

Obs:为了 'Friendly URL',我们无法使用查询,因为它们很难看
(例如:products?color=red&size=10&brand=my%20brand

您的尝试可能失败了,因为它们混合了 named parameter syntax (: followed by the param name) with unnamed parameter syntax ((.*))。

对于零个或多个命名参数(例如,命名为 myParams),请使用此模式:

:myParams*

我建议使用 props function 来解析要作为 props 传递给组件的路由参数,这样可以让参数格式位于一个中心位置,并使组件不必检查路由:

const routes = [
  {
    path: '/products/:myParams*',
    component: () => import('@/components/Products.vue'),

    // parse key-value pairs into an object
    props: route => {
      const params = route.params.myParams
      const props = {}
      for (let i = 0; i < params.length; i += 2) {
        const value = i + 1 < params.length ? params[i + 1] : null
        props[params[i]] = value
      }
      return props
    }
  }
]

demo