有什么办法可以在 vuejs 路由器中使用动态 routes/components 吗?

Is there any way to have dynamic routes/components in vuejs router?

嗨美丽的 Vuejs 开发者! 我在动态路由许多 Vue components/pages 时遇到了一点问题。在这种情况下,我使用嵌套路由来为我的布局组件提供几个路由,为我的页面提供数百个子路由,正如您可以想象的那样,我将不得不静态或手动键入许多子路由,然后在我添加更多时在未来的代码更改中需要更多的子路由,但我需要一个解决 simplify/solve 这个问题的方法,使用更多 efficient/better 方法,比如在 url 中的布局之后添加来自用户类型的那些路由。 .这是我的示例代码:

const routes: RouteRecordRaw[] = [
{
  {
    path: '/student',
    component: () => import('layouts/StudentLayout.vue'),
    children: [
      {
        path: 'dashboard',
        component: () => import('pages/student/Dashboard.vue'),
      },
      {
        path: 'profile',
        component: () => import('pages/student/Profile.vue'),
      },
    ],
  },
}

正如您在这段代码中看到的,我有一个名为 Student 的布局,它有两个子级,但我必须手动为该布局和其他布局键入数百个子路由,是否有任何方法可以动态设置这些路由用户在 /student/dashboard 或 /layout/page 等布局名称后输入什么并将其与组件名称匹配?我的意思是像Angular中的params,我可以用路由器内部的param值本身来表示吗?

 {
    path: ':pagename',
    component: (pagename) => import('pages/student/' + pagename + '.vue'),
 },

如果有解决这个问题的有效方法,请告诉我。 提前致谢!

我个人不会使用这个,也不会建议这样的方法,我也没有做过,但是当我读到你的问题时,我想到了这个想法:

我最好的猜测是有一个处理程序组件,它根据路由参数动态呈现一个组件(假设您有 /:subpage 作为 /student 的子项并且处理程序组件设置为该路由),以及围绕该路由的异常处理程序,以在用户输入 inexistent/unsupported 路由时显示 404 页面。

例如,我会通过路由参数将组件动态导入到预定义的 let 中(例如 let SubpageComponent; 在 try catch 块之外),在动态导入赋值周围有一个 try catch 块以解决相应的错误catch 会将变量设置为 404 页面。然后我将 SubpageComponent 添加到执行路由渲染的组件的 data() 中。


编辑

我已经写出了可能有意义的代码。

基于https://vuejs.org/v2/guide/components.html#Dynamic-Components

您的路线定义已更改

const routes: RouteRecordRaw[] = [
    {
        path: '/student',
        component: () => import('layouts/StudentLayout.vue'),
        children: [
            {
                path: '/:subpage',
                component: () => import('pages/student/SubpageRenderer.vue'),
                props: true,
            },
        ],
    },
]

SubpageRenderer.vue

<script>
export default {
    props: ['subpage'],
    data() {
        return {
            currentSubpage: () => import(`./${subpage}.vue`)
        }
    }
}
</script>

<template>
    <component :is="currentSubpage"></component>
</template>

如果 subpage 是已注册组件的名称,您还可以使用 subpage 路由属性来绑定 :is,而不是使用 currentSubpage 导入。

由于这只会从路线中获取“仪表板”,因此您需要一些命名空间,例如借助模板文字的“学生仪表板”。您可以将 currentSubpage 变成创建 student-${subpage} 名称的模板文字。

我可能会建议导入由 subpage 路由参数指定的组件的选项对象,而不是注册所有组件——如果你正在注册它们,你还不如使用 vue-router通常的方式:)

另外,我只觉得这个可行!它应该被测试出来,也许应该记住大小写,也许还有 Layout 后缀(subpage 可能都是小写的,你可能会以 PascalCase 命名组件)。将第一个字母大写后,这显然也会导致 /student/Dashboard/student/dashboard 成为有效路由