# vue-router 的简单使用

使用 vue-router 和 vue 可以非常方便的实现复杂单页应用的动态路由功能。

官网:https://router.vuejs.org/zh-cn/ (opens new window)

cdn 网址:

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue-router.js"></script>

vue-router 基本使用步骤如下:

  1. 引入相关的库文件

  2. 添加路由链接

  3. 添加路由填充位

  4. 定义路由组件

  5. 配置路由规则并创建路由实例

  6. 把路由挂载到 Vue 根实例中

其中,在之前的内容中,我们已经完成了第 4 步。

# step 1: 引入相关的库文件

在 index.html 中以直接引入的方式使用

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue-router.js"></script>

:: tip (未来)在 vue-cli 中安装使用:

  • 使用 @vue/cli 安装(建议)

    vue add router
    
  • 使用 npm/yarn 安装(不建议):

     npm install vue-router --save
     yarn add vue-router --save
    

:::

# step 2: 添加路由链接

在页面上使用 <router-link> 元素。

router-link 是 vue 中提供的用于改变 URI 的标签,它默认会被渲染为 <a> 标签。

页面跳转控制:

<div id="app">
    <!-- router-link 来指定跳转的路径-->
    <router-link to="/login">登录</router-link>
    <router-link to="/register">注册</router-link>
    ...
</div>

<router-link> 默认会被渲染为 <a> 标签,而它的 to 属性显然就是被渲染为 <a> 标签的 href 属性。

to 属性的属性值(例如,这里的 /login/register会被渲染为以 # 开头的 hash 地址。也就是说

  • 当点击 登录 时,浏览器的 URI 会变为 /#/login

  • 当点击 注册 时,浏览器的 URI 会变为 /#/register

注意

当浏览器的 URI 发生变化,变为 /#/login/#/register 之后,会发生什么事情,会跳转显示什么样的页面,那就是『另一件事情』了,与 router-link 无关了。

  • 通过 <router-view> 来指定一个锚点,当路由的路径匹配时,vue-router 会自动把对应组件放到锚点位置进行渲染

# step 3: 添加路由填充位

在页面上添加 <router-view></router-view>

<div id="app">
    ...
    <div>
        <!--vue-router 的锚点-->
        <router-view></router-view>
    </div>
</div>

在 vue 所实现的单页应用(SPA)中,页面是一个公共资源,在单页应用中并没有太多的(甚至完全没有)页面跳转。

你所看到的“所谓的”页面的跳转实际上是大家轮流在使用同一个页面。“你方唱罢,我登场。”

<router-view> 元素就是负责在页面上标注出一个公共区域,未来,大家轮流使用这个位置,展示各自的内容。

# step 4: 定义路由组件

之前的准备工作中,已经完成了这一项工作。

定义了 LoginForm 和 RegisterForm 两个组件,并在 vue 中进行了注册:

var vm = new Vue({
    el:"#app",
    components:{ // 引用 loginForm 和 registerForm 组件
        loginForm,
        registerForm
    },
    ...
})

# step 5: 配置路由规则

我们之前做了 3 件事情:

  • 通过使用 <router-link> 来引起 URI 的变化
  • 通过使用 <router-view> 在页面上划出一个“公共区域”
  • 定义了多个组件

现在,我们需要将这三件事情关联起来:

当 URI 是 xxx 时,在“公共区域”显示组件 A;当 URI 是 yyy 是,在“公共区域”显示组件 B;...

为了实现这个目标,我们需要『配置路由规则』。

新建 vue-router 对象,通过它的 routes 属性来指定路由规则:

// 创建 VueRouter 对象
const router = new VueRouter({
  // 编写路由规则
  routes: [ 
    { path: "/login", component: loginForm },
    { path: "/register", component: registerForm }
  ]
})

上述配置十分容易理解:

  • 当 URI 是 /login 事,在公共区域 <router-view> 处,展现 loginForm 组件;

  • 当 URI 是 /register 时,在公共区域 <router-view> 处,展现 registerForm 组件。

在 vue-router 的 routers 属性的配置中, path 配置的是路由的路径;component 配置的是组件名称。

# step 6: 把路由挂载到 Vue 根实例中

通过 vue-router 对象定义出路由规则(将上述的三件事关联在一起)之后,我们需要将 vueRouter 对象(即路由规则) 告知 Vue 。

现在在创建 vue 对象时,我们要『多』传入一个 vue-router 对象了:

var vm = new Vue({
    el: "#app",
    components: { ... },
    router // 引用上面定义的 router 对象
})

效果:

更多的关于 vue-router 的进阶功能,我们在 vue-cli 中再一一展示。