使用布局和页面进行路由

您可以将 Vue Router 与 Quasar 的布局关联起来。本页内容只是建议,不是强制性的。Quasar 给予您充分的使用自由,可以将下面的内容当作简单的参考案例。

QLayout 是用于封装页面的组件,使得多个页面可以共享相同的页眉、侧滑抽屉菜单等。当然您也可以为每个页面配置不同的页眉/页脚/侧滑菜单,但它们都必须是 QLayout 组件的子项。 为了理解这是如何工作的,您需要阅读 Vue Router 嵌套路由

为了更清楚一点,我们举个例子。假设我们有一个布局,(‘user’),它包含两个页面(‘user-feed’和’user-profile’)。 我们希望像这样配置网站/应用程序路由: /user/feed/user/profile

创建文件

Quasar 不会强制特定的文件夹结构。 以下仅是示例。 您可以将布局和页面一起放在一个文件夹中,或者将页面放到您选择的特定文件夹结构中,或者创建自己的布局和页面文件夹。 对于 Quasar 来说无关紧要。 重要的是您可以在 /src/router/routes.js 中正确引用它们。

让我们创建布局和页面文件。您可以使用 Quasar CLI 的帮助命令,也可以自己创建它们。

$ quasar new layout User
 app:new Generated layout: src/layouts/User.vue +0ms
 app:new Make sure to reference it in src/router/routes.js +2ms

$ quasar new page Profile Posts
 app:new Generated page: src/pages/Profile.vue +0ms
 app:new Make sure to reference it in src/router/routes.js +2ms

 app:new Generated page: src/pages/Posts.vue +1ms
 app:new Make sure to reference it in src/router/routes.js +0ms

上述命令会创建以下文件夹结构:

src/
├── layouts
│   └── User.vue         # 我们的 QLayout 定义文件
└── pages
    ├── Posts.vue        # /user/feed 路由页面
    └── Profile.vue       # /user/profile 路由页面

定义路由

您的页面 (/src/pages) 和布局(/src/layouts) 都通过 /src/router/routes.js 中的 Vue Router 注入到您的网站/应用程序中。每个页面和布局都需要在此引用。

routes.js 示例:

// 我们在此文件中定义路由

import LandingPage from 'pages/Landing'

const routes = [
  {
    path: '/',
    component: LandingPage
  }
]

export default routes

使用懒加载/按需加载的 routes.js 示例:

// 我们在此文件中定义路由

const routes = [
  {
    path: '/',
    component: () => import('pages/Landing')
  }
]

export default routes

TIP

关于按需加载和代码拆分在@quasar/app-vite / @quasar/app-webpack中有更深入的分析。

TIP

配置路由以使用 Layouts 和 Pages 基本上由正确的嵌套路由组成,我们将在下一节中看到。

嵌套路由

真正的应用程序用户界面通常由嵌套在多个级别的组件组成。URL 的片段对应于嵌套组件中的特定结构也很常见,例如:

/user/profile                   /user/posts
+------------------+            +-----------------+
| User             |            | User            |
| +--------------+ |            | +-------------+ |
| | Profile      | |  +------>  | | Posts       | |
| |              | |            | |             | |
| +--------------+ |            | +-------------+ |
+------------------+            +-----------------+

使用 Vue Router 的嵌套路由配置表达这种关系非常简单。 我们注意到一些事情:两个页面都需要由用户组件包装。 所以,用户组件就可以看作是一个布局(Layout)!

因为用户布局会包装内部页面,可以使用 <router-view>来将内部页面注入:

<!-- /src/layouts/User.vue -->
<template>
  <q-layout>
    ...

    <!-- 这是页面被注入的地方 -->
    <q-page-container>
      <router-view></router-view>
    </q-page-container>

    ...
  </q-layout>
</template>
<!-- /src/pages/Profile.vue or Posts.vue -->
<template>
  <q-page>
    ...page content...
  </q-page>
</template>

我们的示例中指定了一些路由(/user/profile 和/user/posts)。那么我们现在如何将所有内容组织在一起? 我们需要编辑路由文件,在这里,我们将配置路由,告诉哪些组件是布局,哪些是页面,并将它们引用/导入到我们的应用程序中:

// src/router/routes.js

import User from 'layouts/User'
import Profile from 'pages/Profile'
import Posts from 'pages/Posts'

const routes = [
  {
    path: '/user',

    // 我们使用上面导入的/src/layouts/User 组件
    component: User,

    // 它有子路由,并且在它里面用户具有/  `<router-view>`;
    // 那它就是一个布局!
    children: [
      // Profile page
      {
        path: 'profile', // 这里是/user/profile 路由
        component: Profile // 我们参考上面导入的/src/pages/Profile.vue
      },

      // Posts page
      {
        path: 'posts', // 这里是/user/posts 路由
        component: Posts // 我们参考上面导入的/src/pages/Profile.vue
      }
    ]
  }
]

export default routes

WARNING

请注意,以 / 开头的嵌套路径将被视为根路径。 这使您可以实现组件嵌套,而不必使用嵌套的 URL。

我们的路由配置 (/src/router/routes.js) 应如下所示:

export default [
  {
    path: '/user',

    // 将组件指向 QLayout 定义文件的目录
    component: () => import('layouts/user'),

    // 现在我们定义子路由。
    // 通过使用`<router-view>`占位符
    //(需要在布局中指定它),
    // 这些子路由正在自动注入(上面的)布局
    children: [
      {
        path: 'feed',
        component: () => import('pages/user-feed')
      },
      {
        path: 'profile',
        component: () => import('pages/user-profile')
      }
    ]
  }
]

注意事项:

  • 我们使用了延迟加载的布局和页面 (() => import(<path>))。如果您的网站/应用程序很小,那么您可以不使用延迟加载,因为使用它可能会增加比它的价值更多的开销:

    import UserLayout from 'layouts/user'
    import UserFeed from 'pages/user-feed'
    import UserProfile from 'pages/user-profile'
    
    export default [
      path: '/user',
      component: UserLayout,
      children: [
        { path: 'feed', component: UserFeed },
        { path: 'profile', component: UserProfile }
      ]
    ]
    
  • Quasar 提供了一些开箱即用的 Webpack 别名(‘layouts’ 指向 ‘/src/layouts’ and ‘pages’ 指向 ‘/src/pages’),已用在上面的例子中。

  • 布局的页面需要在 Vue Router 配置中声明为布局的子元素,以便 <router-view/> 知道要注入哪个页面组件。请记住,只要您的布局附有页面,始终使用此 Vue 组件。

    <q-layout>
      ...
      <q-page-container>
      <!--
        这里是您的页面注入到您的布局的地方
      -->
        <router-view />
      </q-page-container>
      ...
    </q-layout>
    

TIP

请查看Vue Router文档,以全面了解上述示例以及如何为您的应用配置路由管理器及其路由。