1、安装vue-router
路由,根据不同的访问路径,返回不同的内容,在页面上有两个部分,一个是点击部分,一个是点击之后显示内容的部分。
方式一:使用npm安装
安装命令:
npm install vue-router
在main.js中进行注册
import Vue from 'vue' import VueRouter from 'vue-router'
Vue.use(VueRouter)
方式二:引入全局的 script 标签
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
2、vue-router的基本使用
//1、定义路由对应的组件
const Login = {template: `<h1>登录页面</h1>`}
const Home = {template: `<h1>项目首页</h1>`}
//2、创建一个路由对象,设置路由匹配规则
const router = new VueRouter({routes:[{ path: '/login', component: Login },{ path: '/home', component: Home }]})
//3、将路由对象挂载到vue实例中
var vm= new Vue({ el:'#app', router:router })
//4、<router-link></router-link>组件导航、通过传入’to‘属性来指定路径
<router-link to='/login'>登录</router-link>
<router-link to='/home'>首页</router-link>
//5、路由出口,#app中使用<router-view>标签来定义路由展示位,匹配到的路由组件展示到这里
<router-view></router-view>
举例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
</head>
<body>
<div id="app">
<router-link to='/login'>
<button type="button">登录</button>
</router-link>
<router-link to='/home'>
<button type="button">首页</button>
</router-link>
<!-- 组件展示位 -->
<router-view></router-view>
</div>
<script type="text/javascript">
//定义路由对应的组件
const login = { template:`<h3>登录页面</h3>`}
const home = { template:`<h3>首页</h3>`}
// 配置路由访问规则
const routes = [{path:'/login',component:login},{path:'/home',component:home}]
// 创建一个路由对象,传入配置好的路由规则
var router = new VueRouter({
routes:routes
})
// 创建vue实例,将路由挂载进去
var vm = new Vue({
el:'#app',
router:router
})
</script>
</body>
</html>
点击登录
点击首页
3、路由跳转方式
1.声明式
<router-link to="/login">登录</router-link>
// to后面是一个对象时,要使用属性绑定
<router-link :to="{ path: '/login'}">登录</router-link>
2.编程式
在项目中有些时候需要主动去访问某个路由,比如登录成功之后,需要跳转到项目首页,那么 在 Vue 实例内部,可以调用 this.$router.push ,主动访问某个路由
this.$router.push('/login')
this.$router.push({path: '/login'})
举例:点击登录时跳转至首页
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
</head>
<body>
<div id="app">
<!-- 组件展示位 -->
<router-view></router-view>
</div>
<script type="text/javascript">
//定义路由对应的组件
const login = {
template: `<button type="button" @click="login">登录</button>`,
methods:{
login() {
this.$router.push('/home')
}
}
}
const home = {
template: `<h3>首页</h3>`,
}
// 配置路由访问规则
const routes = [{
path: '/login',
component: login
}, {
path: '/home',
component: home
}]
// 创建一个路由对象,传入配置好的路由规则
var router = new VueRouter({
routes: routes
})
// 创建vue实例,将路由挂载进去
var vm = new Vue({
el: '#app',
router: router
})
</script>
</body>
</html>
4、路由重定向
通过redirect可以指定重定向的路由地址
const routes = [{path: '/',redirect: '/login'}]
举例如下:配置路由访问规则,当访问根路径时可以指定到登录路径
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
</head>
<body>
<div id="app">
<!-- 组件展示位 -->
<router-view></router-view>
</div>
<script type="text/javascript">
//定义路由对应的组件
const login = {
template: `<button type="button" @click="login">登录</button>`,
methods: {
login() {
this.$router.push('/home')
}
}
}
const home = {
template: `<h3>首页</h3>`,
}
// 配置路由访问规则
const routes = [{
path: '/login',
component: login
}, {
path: '/home',
component: home
},
{
path: '/',
redirect: '/login'
}
]
// 创建一个路由对象,传入配置好的路由规则
var router = new VueRouter({
routes: routes
})
// 创建vue实例,将路由挂载进去
var vm = new Vue({
el: '#app',
router: router
})
</script>
</body>
</html>
5、命名路由
可以在创建 Router 实例的时候,在 routes 配置中给某个路由设置名称,获取路由时可以通过name。
const routes = [{path: '/login',name:'login',component:login}]
举例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
</head>
<body>
<div id="app">
<!-- 组件展示位 -->
<router-view></router-view>
</div>
<script type="text/javascript">
//定义路由对应的组件
const login = {
template: `<button type="button" @click="login">登录</button>`,
methods: {
login() {
this.$router.push({name:'home'})
}
}
}
const home = {
template: `<h3>首页</h3>`,
}
// 配置路由访问规则
const routes = [{
path: '/login',
name: 'login',
component: login
}, {
path: '/home',
name:'home',
component: home
},
{
path: '/',
redirect: '/login'
}
]
// 创建一个路由对象,传入配置好的路由规则
var router = new VueRouter({
routes: routes
})
// 创建vue实例,将路由挂载进去
var vm = new Vue({
el: '#app',
router: router
})
</script>
</body>
</html>
6、路由嵌套
一个路由中嵌套多个子路由(一个页面中根据不同的情况显示不同的内容),通过children定义,而路由组件中需要通过< router-view>< /router-view>展示位给子路由预留的位置。
const routes = [
{path: '/login',
name:'login',
component:login,
children: [{path: '/menu',component: menu}]
}]
举例:
当访问home中的子路由menu路径时,内容将展示在home组件中的< router-view>< /router-view>中。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
</head>
<body>
<div id="app">
<!-- 组件展示位 -->
<router-view></router-view>
</div>
<script type="text/javascript">
//定义路由对应的组件
const login = {
template: `<button type="button" @click="login">登录</button>`,
methods: {
login() {
this.$router.push({
name: 'home'
})
}
}
}
const home = {
template: `<div>
<h3>首页</h3>
<div style="height: 100px;width:100px;background-color: #0000FF;">
<router-view></router-view>
</div>
</div>`,
}
const menu = {
template: ` <h3>子路由</h3>
`
}
// 配置路由访问规则
const routes = [{
path: '/login',
name: 'login',
component: login
}, {
path: '/home',
name: 'home',
component: home,
children: [{
path: '/menu',
component: menu
}]
},
{
path: '/',
redirect: '/login'
}
]
// 创建一个路由对象,传入配置好的路由规则
var router = new VueRouter({
routes: routes
})
// 创建vue实例,将路由挂载进去
var vm = new Vue({
el: '#app',
router: router
})
</script>
</body>
</html>
7、路由动态匹配及参数
1、动态路径匹配
在项目中可能会需要把 /user/1 和 /user/2 都将映射到同一个路由,此时只需要在配置路由规则的时候将user后面的数据参数化处理即可
const routes = [{path: '/user/:id',component: User}]
举例:当访问不同的id时映射到同一个路由
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
</head>
<body>
<div id="app">
<router-view></router-view>
</div>
<script type="text/javascript">
const Home = {
template: `<h4>首页</h4>`
}
const Login = {
template: `<h4>登录</h4>`
}
const User = {
template: `<h4>用户</h4>`
}
const routes = [{
path: '/',
component: Home
}, {
path: '/login',
component: Login
}, {
path: '/user/:id',
component: User
}]
var router = new VueRouter({
routes: routes
})
var vm = new Vue({
el: '#app',
router: router
})
</script>
</body>
</html>
2、参数传递
<router-link :to="{name:'user',params:{id:111}}">
<button type="button">用户</button>
</router-link>
this.$router.push({ name:'user',params:{id:111,key:'login'}})
3、查询参数query
查询参数类似于get请求的参数形式, /user/login/?user=123&pwd=23333
<router-link :to="{name:'user',query:{id:111}}">
<button type="button">用户</button>
</router-link>
4、获取参数的值通过$ route.query.参数、$route.params/.参数
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
</head>
<body>
<div id="app">
<router-link to="/">
<button type="button">首页</button>
</router-link>
<router-link :to="{name:'login',query:{user:'test',pwd:'123456'}}">
<button type="button">登录</button>
</router-link>
<router-link :to="{name:'user',params:{id:111}}">
<button type="button">用户</button>
</router-link>
<router-view></router-view>
</div>
<script type="text/javascript">
const Home = {
template: `<h4>首页</h4>`
}
const Login = {
template: `<h4>登录的参数为:{{$route.query}}</h4>`
}
const User = {
template: `<h4>用户id为:{{$route.params.id}}</h4>`
}
const routes = [{
path: '/',
component: Home
}, {
path: '/login',
name:'login',
component: Login
}, {
path: '/user/:id',
name: 'user',
component: User
}]
var router = new VueRouter({
routes: routes
})
var vm = new Vue({
el: '#app',
router: router
})
</script>
</body>
</html>
在方法中获取值:
method:{
login(){
this.$route.query
}
}
8、路由导航守卫
路由全局前置拦截器: router.beforeEach
在项目开发中每一次路由的切换或者页面的刷新都需要判断用户是否已经登录,vue-router提供了全局前置导航钩子 beforeEach
router.beforeEach((to, from, next) => {
// to:表示将要访问的路径
// from 代表从哪个路径而来
// next 是一个函数,表示执行下一步
//判断是否访问的是登录页面
if (to.path === '/login') return next()
// 判断当前是否能获取到token
if (window.sessionStorage.getItem('token')) return next()
// 没有token,则跳转到登录页面
return next('/login') })