Vue Router 是啥?
Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。

简单来说,有了 Vue Router,页面切换以及跳转的控制权完全交由前端,后端只负责返回数据,不用像 Spring MVC 那样返回一个视图名称来进行跳转或者重定向,真正实现前后端分离。

一、路由的基本使用

1、创建 Vue 项目并引入 vue-router

首先,创建一个 vue-cli 项目,具体可参考链接:https://blog.csdn.net/qq_45716120/article/details/112848675

进入到项目目录下,在命令行中安装 Vue router,可类比于安装 maven 依赖

npm install vue-router --save-dev

然后,就可以在 main.js 中引入 vue-router

import VueRouter from 'vue-router'

Vue 中需要显示声明才能使用:

Vue.use(VueRouter);

2、编写 Components 组件

在 src 的 components 目录下,新建三个 Component:Main.vue、Login.vue、Register.vue
在这里插入图片描述
Main.vue

<template>
    <h1>这是 Main 组件</h1>
</template>

<script>
export default {
    name: 'Main'
}
</script>

<style scoped>

</style>

Login.vue

<template>
    <h1>这是 Login 组件</h1>
</template>

<script>
export default {
    name: "Login"
}
</script>

<style scoped>

</style>

Register.vue

<template>
    <h1>这是 Register 组件</h1>
</template>

<script>
export default {
    name: "Register"
}
</script>

<style scoped>

</style>

3、编写路由文件

在 src 下新建一个 router 目录,其中创建 index.js,作为路由的主配置文件
routes 为一数组,每个路由都是一个对象,用大括号包裹,其主要参数如下:
path :跳转的路径,相当于 Spring MVC 中 Controller 中 return 的路径
name :自定义的组件名称
component :引入的 Vue 组件名称
index.js

import Vue from 'vue'
import VueRouter from 'vue-router'

// 组件通过export暴露接口,路由中导入组件
import Login from '../components/Login'
import Main from '../components/Main'
import Register from '../components/Register'

// 导入 vue-router 依赖
Vue.use(VueRouter);

export default new VueRouter({
    routes: [
        {
            path: '/login',   // 跳转路径
            name: 'login',    // 名称
            component: Login  // 组件
        },
        {
            path: '/main',
            name: 'main',
            component: Main
        },
        {
            path: '/register',
            name: 'register',
            component: Register
        }
    ]
});

4、在主文件 Main.js 中引入路由

在 Main.js 中引入路由,即上一步中的 index.js,路径只需写其所在目录即可扫描到
Main.js

import Vue from 'vue'
import App from './App'
import router from './router'

Vue.config.productionTip = false

new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

5、添加 router-link 以及 router-view

路由配置完了,主文件也引入成功,那么在页面中如何使用呢?
这就需要通过 router-link 以及 router-view 标签了。
在 App.vue 中的 template 中添加 router-link、router-view
router-link 相当于 a 标签, to 属性相当于 href 属性,用于配置路由中声明的路径,即对应 index.js 中路由的 path,匹配成功则进行跳转切换
router-view 用于展示视图,要通过它才能将跳转的视图展示出来
App.vue

<template>
  <div id="app">
      <router-link to="/main">Main</router-link>
      <router-link to="/login">Login</router-link>
      <router-link to="/register">Register</router-link>
      <router-view></router-view>
  </div>
</template>

<script>
export default {
  name: 'App'
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

6、测试效果

在项目目录的终端窗口(命令行)中输入:

npm run dev

浏览器中运行:
在这里插入图片描述
点击超链接可以实现组件的替换,说明我们的路由跳转生效了。
在这里插入图片描述

二、参数传递以及重定向

1、参数传递

方式1

修改 App.vue 中 route-link 的 to 属性,让其携带参数:

<router-link :to="{name:'login', params:{id:1}}">Login</router-link>

修改 index.js 中的路由的 path 属性

{
    path: '/login/:id',   // 跳转路径
    name: 'login',    // 名称
    component: Login  // 组件
},

重新测试:
在这里插入图片描述
以上方式实现的效果与 Controller 中的 RequestMapping 和 PathVariable 是类似的,同样都为 RestFul 风格方式的传参

方式2

在 index.js 的路由配置中增加 “props: true” 属性

{
     path: '/login/:id',   // 跳转路径
     name: 'login',    // 名称
     component: Login,  // 组件
     props: true
 },

在 Login.vue 中通过 props 接受 id 参数

<script>
export default {
    props: ['id'],
    name: 'Main'
}
</script>

同样可实现如下效果:
在这里插入图片描述

2、重定向

添加 redirect 属性即可
修改路由中 register 的配置,删掉 Component,用 redirect 取代,路径为 “/Main”,即重定向至 Main

{
    path: '/register',
    redirect: '/main'
}

重新运行,点击 Register,可以看到重定向至 Main
在这里插入图片描述

三、404 跳转处理

Tips:要想取消浏览器地址栏中地址中间的 # 号,需在 routes 前添加:

mode: 'history'

在 Component 目录下新建一个 NotFound.vue,用于404统一跳转
NotFound.vue

<template>
    <div>
        <h1>404,您访问的页面不存在!</h1>
    </div>        
</template>

<script>
export default {
    name: 'NotFound'    
}
</script>

<style scoped>

</style>

创建完视图后,当然就是配置路由了,在 index.js 的末尾添加多一项路由:

{
    path: '*',
    component: NotFound 
}

星号表示匹配所有请求,也就是当上方的路由都匹配不到时,自动跳转到 NotFound.vue
测试效果如下:
在这里插入图片描述

四、进入路由前结合 Axios 获得后台数据

在进入视图前,往往需要做数据初始化,通过在目的视图的 beforeRouteEnter() 方法中发送 Ajax 请求获取后台接口数据即可
我们知道,Vue 中网络通信主要通过 Axios,所以首先需安装 Axios 的包

安装 axios

npm install axios

安装成功如下所示:
在这里插入图片描述
安装 vue-axios

npm install --save vue-axios

安装成功如下所示:
在这里插入图片描述
在 Main.js 中引入 Axios

import axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(VueAxios, axios)

在 static 下创建 mock 目录,其中添加一个 data.json,用于模拟后端接口数据
data.json

{
    "name": "今天要学习",
    "url": "https://www.baidu.com",
    "age": 3,
    "school": {
        "xiaoxue": "小学",
        "chuzhong": "初中",
        "gaozhong": "高中"
    },
    "friends": [
        {
            "name": "xiaoming",
            "age":1
        },
        {
            "name": "xiaohong",
            "age":2
        },
        {
            "name": "xiaohua",
            "age":3
        }
    ]
}

static 下的静态资源可直接被访问到:
在这里插入图片描述
在 Login.vue 中增加两个函数 :beforeRouteEnter 和 beforeRouteLeave
前者是在跳转路由前执行,后者是在路由跳转离开后执行
其中的 next() 方法可控制路由跳转及执行一些操作(其可以直接调用 Vue 实例中的 methods ),类似于后端的拦截器过滤器
我们只需要在路由跳转前通过 axios 发送 Ajax 请求获取后端返回的数据,然后通过 vue 加载渲染即可完成数据初始化操作

    beforeRouteEnter:(to,from,next)=>{
        console.log('进入路由之前');
        next(vm=>{
            vm.getData();
        });
    },
    beforeRouteLeave:(to,from,next)=>{
        console.log('进入路由之后');
        next();
    },
    methods: {
        getData: function() {
            this.axios({
                method: 'get',
                url: 'http://localhost:8081/static/mock/data.json'
            }).then(function (response) {
                console.log(response);
            })
        }
    } 

在浏览器的控制台中查看请求得到的 json 如下:
在这里插入图片描述
可以看到,在路由跳转前执行了 beforeRouteEnter() 方法,然后在其中调用 getData() 方法获得 json 数据

附录:
Vue Router 官方文档:https://router.vuejs.org/zh/installation.html
Axios 官方文档:http://www.axios-js.com/zh-cn/

Logo

基于 Vue 的企业级 UI 组件库和中后台系统解决方案,为数万开发者服务。

更多推荐