Vue (七) vue-route路由

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') })
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

久醉绕心弦,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值