Skip to content

13. [vuejs-11] 项目:路由与导航

路由功能使用户能够在应用程序的不同页面之间进行导航。

项目目录结构如下:

Image

13.1. 安装依赖项

[Vue.js] 中实现路由需要 [vue-router] 依赖项:

Image

  • [1-3] 中,我们安装了 [vue-router] 依赖项;
  • [4-6] 中,安装依赖项后,修改了 [package.json] 文件;

13.2. 路由脚本 [router.js]

应用程序的导航规则定义在 [router.js] 文件中(脚本名称可以是任意名称):


// imports nécessaires au routage
import Vue from 'vue'
import VueRouter from 'vue-router'
 
// plugin de routage
Vue.use(VueRouter)
 
// les composants cibles du routage
import Component1 from './components/Component1.vue'
import Component2 from './components/Component2.vue'
import Component3 from './components/Component3.vue'
 
 
// les routes de l'application
const routes = [
  // home
  { path: '/', name: 'home', component: Component1 },
  // Component1
  {
    path: '/vue1', name: 'vue1', component: Component1
  },
  {
    // Component2
    path: '/vue2', name: 'vue2', component: Component2
  },
  // Component3
  {
    path: '/vue3', name: 'vue3', component: Component3
  },
]
 
// le routeur
const router = new VueRouter({
  routes,
  mode: 'history',
})
 
// export du routeur
export default router

注释

  • [router.js] 脚本将定义我们应用程序的路由规则;
  • 第 1–6 行:启用路由所需的 [vue-router] 插件。这需要导入 [Vue] 类/函数(第 2 行)和路由插件(第 3 行)。该插件已随我们刚刚安装的 [router] 依赖项一并安装;
  • 第 8–11 行:导入路由的目标视图;
  • 第 15–21 行:定义 routes 数组。该数组的每个元素都是一个具有以下属性的对象:
    • [path]:视图的 URL,即我们希望在浏览器 [URL] 字段中显示的地址。您可以自由输入任意内容;
    • [name]:路由名称。此处同样可以输入任意内容;
    • [component]:用于显示该视图的组件。此处必须指定已存在的组件;

因此这里共有四条路由:[/]、/view1、/view2、/view3

  • 第 33–36 行:路由器是第 3 行导入的 [VueRouter] 类的实例。此处的 [VueRouter] 构造函数使用了两个参数:
    • 应用程序的路由;
    • 浏览器中 URL 的写入模式:默认模式 [hash] 生成 [localhost:8080/#/view1] 格式的 URL(# 表示哈希)。[history] 模式则移除 #,生成 [localhost:8080/view1]
  • 第 39 行:导出路由器;

13.3. 主脚本 [main.js]

主脚本 [main.js] 如下:


// imports
import Vue from 'vue'
import App from './App.vue'
 
// plugins
import BootstrapVue from 'bootstrap-vue'
Vue.use(BootstrapVue);
 
// bootstrap
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'
 
// routeur
import monRouteur from './router'
 
// configuration
Vue.config.productionTip = false
 
// instanciation projet [App]
new Vue({
  name: "app",
  // vue principale
  render: h => h(App),
  // routeur
  router: monRouteur,
}).$mount('#app')

注释

  • 第 14 行:我们导入了由 [router.js] 脚本导出的路由器;
  • 第 25 行:将此路由器作为参数传递给 [View] 类的构造函数,该构造函数将显示主视图 [App],该视图与视图的 [router] 属性相关联;

13.4. 主视图 [App]

主视图的代码如下:


<template>
  <div class="container">
    <b-card>
      <!-- a message -->
      <b-alert show variant="success" align="center">
        <h4>[vuejs-11] : routage et navigation</h4>
      </b-alert>
      <!-- the current routing view -->
      <router-view />
    </b-card>
  </div>
</template>
 
<script>
  export default {
    name: "app"
  };
</script>

注释

  • 第 9 行:在路由器中显示当前视图。只有当视图的 [router] 属性已初始化时,才会识别 <router-view> 标签;

13.5. 视图布局

视图布局由以下 [Layout] 组件处理:


<template>
  <!-- line -->
  <div>
    <b-row>
      <!-- three-column zone -->
      <b-col cols="2" v-if="left">
        <slot name="left" />
      </b-col>
      <!-- nine-column zone -->
      <b-col cols="10" v-if="right">
        <slot name="right" />
      </b-col>
    </b-row>
  </div>
</template>
 
<script>
  export default {
    // paramètres
    props: {
      left: {
        type: Boolean
      },
      right: {
        type: Boolean
      }
    }
  };
</script>

我们在[vuejs-06]项目的[vuejs-06]章节中已经使用并讲解过这种布局。

13.6. 导航组件

[Navigation] 组件为用户提供导航菜单:

Image

生成块 [1] 的组件如下所示:


<template>
  <!-- bootstrap menu with three options -->
  <b-nav vertical>
    <b-nav-item to="/vue1" exact exact-active-class="active">Vue 1</b-nav-item>
    <b-nav-item to="/vue2" exact exact-active-class="active">Vue 2</b-nav-item>
    <b-nav-item to="/vue3" exact exact-active-class="active">Vue 3</b-nav-item>
  </b-nav>
</template>
  • 此代码生成三个导航链接中的第一个;
  • <b-nav-item> 标签的 [to] 属性必须与应用程序路由器路由中的某个 [path] 属性匹配;

13.7. 视图

视图 #1 如下:

Image

区域 [3-4] 由以下 [Component1] 组件生成:


<template>
  <Layout :left="true" :right="true">
    <!-- navigation -->
    <Navigation slot="left" />
    <!-- message-->
    <b-alert show variant="primary" slot="right">Vue 1</b-alert>
  </Layout>
</template>
 
<script>
  import Navigation from './Navigation';
  import Layout from './Layout';
 
  export default {
    name: "component1",
    // composants utilisés
    components: {
      Layout, Navigation
    }
  };
</script>

评论

  • 第 2 行:视图 #1 使用 [Layout] 组件的布局,该布局由两个名为 [left] 和 [right] 的插槽组成;
  • 第 4 行:导航菜单被放置在左侧插槽中。这就是上文中显示的区域 [3]
  • 第 6 行:一条消息被放置在右侧插槽中。这就是上文中显示的区域 [4]

视图 2 和 3 与此类似。

[Component2] 组件显示的视图 #2:


<!-- vue n° 2 -->
<template>
  <Layout :left="true" :right="true">
    <!-- navigation -->
    <Navigation slot="left" />
    <!-- message -->
    <b-alert show variant="secondary" slot="right">Vue 2</b-alert>
  </Layout>
</template>
 
<script>
  import Navigation from './Navigation';
  import Layout from './Layout';
 
  export default {
    name: "component2",
    // composants de la vue
    components: {
      Layout, Navigation
    }
  };
</script>

[Component3] 组件显示的视图 #3:


<!-- vue n° 3 -->
<template>
  <Layout :left="true" :right="true">
    <!-- navigation -->
    <Navigation slot="left" />
    <!-- message -->
    <b-alert show variant="info" slot="right">Vue 3</b-alert>
  </Layout>
</template>
 
<script>
  import Navigation from "./Navigation";
  import Layout from "./Layout";
 
  export default {
    name: "component3",
    // composants de la vue
    components: {
      Layout,
      Navigation
    }
  };
</script>

13.8. 运行项目

Image

执行后,将显示以下视图:

Image

  • [1] 中,URL 为 [http://localhost:8080]。随后执行了以下路由规则:

{ path: '/', name: 'home', component: Component1 }

因此,显示了 [Component1] 组件。它显示视图 #1 [2]。现在,让我们点击 [View 1] 链接,其代码如下:


<b-nav-item to="/vue1" exact exact-active-class="active">Vue 1</b-nav-item>

当前显示效果如下:

  • [3] 中,执行了以下路由规则:

path: '/vue1', name: 'vue1', component: Component1

因此,[Component1] 组件再次被显示,从而呈现了视图 1 [4]。现在,让我们点击 [View 2] 链接,其代码如下:


<b-nav-item to="/vue2" exact exact-active-class="active">Vue 2</b-nav-item>

此时,新的视图如下所示:

Image

  • [5] 中,执行了以下路由规则:

path: '/vue2', name: 'vue2', component: Component2

因此,显示了 [Component2] 组件,即视图 2。如果现在点击 [View 3] 链接,其代码如下:


<b-nav-item to="/vue3" exact exact-active-class="active">Vue 3</b-nav-item>

我们将看到以下新的视图:

Image

  • [6] 中,执行了以下路由规则:

path: '/vue3', name: 'vue3', component: Component3

因此,显示了 [Component3] 组件,即视图 #3 [8]