(精华)2020年7月12日 vue vue-router路由的使用

74 阅读1分钟

基本用法

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>路由基本用法</title>
	<style>
		/* .router-link-active{
			font-size:20px;
			color:#ff7300;
			text-decoration:none;
		} */
		.active{
			font-size:20px;
			color:#ff7300;
			text-decoration:none;
		}
	</style>
	<script src="js/vue.js"></script>
	<script src="js/vue-router.js"></script>
</head>
<body>
	<div id="itapp">
        <div>
            <!-- a标签 -->
            <router-link to='/home' >主页</router-link>  
            <router-link to='/news'>新闻</router-link> 
        </div>
        <div>
            <!-- 用来显示内容 -->
            <router-view></router-view>
        </div>
	</div>

	<script>
        // 1.定义组件
        var Home={
			template:'<h3>我是主页</h3>'
		}
		var News={
			template:'<h3>我是新闻</h3>'
		}
		
        // 2.配置路由
        var routesAll= [{
            path:'/home',
            component:Home
        },{
            path:'/news',
            component:News
        }];
        //3. 创建路由实例

        var router = new VueRouter({
            routes:routesAll,
            mode:'hash', //history
            linkActiveClass:'active' //当前所处的链接的class
        })

        // 4.将router挂载在vue实例上
		new Vue({
			el:'#itapp',
            // router:router , 
            router  //注入路由
		});
	</script>
</body>
</html>

路由嵌套传递参数和路由守卫

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<title>路由嵌套和参数传递 tag</title>
	<style>
		.active {
			font-size: 20px;
			color: #ff7300;
			text-decoration: none;
		}
	</style>
	<script src="js/vue.js"></script>
	<script src="js/vue-router.js"></script>
</head>

<body>
	<div id="itapp">
		<div style="position: fixed;top:180px">
			<router-link to="/home">主页</router-link>
			<router-link to="/user">用户</router-link>
		</div>
		<div style="height:2000px">
			<router-view></router-view>
		</div>

		<hr>
		<button @click="push">添加路由</button>
		<button @click="replace">替换路由</button>
	</div>

	<template id="user">
		<div style="height:2000px">
			<h2>用户信息</h2>
			<ul>
				<router-link to='/user/login?name=tom&pwd=123'>用户登录</router-link>
				<router-link to='/user/regist/alice/456'>用户注册</router-link>
			</ul>
			<router-view></router-view>
		</div>
	</template>

	<script>
		var Home = {
			template: '<div><h3>我是主页 {{$route.params}}</h3></div>'
		}
		var User = {
			template: '#user'
		}
		var Login = {
			template: '<h4>用户登陆。。。获取参数:{{$route.query}},{{$route.path}}</h4>'
		}
		var Regist = {
			template: '<h4>用户注册。。。获取参数:{{$route.params}},{{$route.path}}</h4>'
		}

		const routes = [{
				path: '/home',
				name: 'home',
				component: Home
			},
			{
				path: '/user',
				name: 'user',
				component: User,
				beforeEnter(from, to, next) {
					console.log(`from ${from.fullPath},to ${to.fullPath}`);
					setTimeout(() => {
						next();
					}, 500)
				},
				// beforeLeave(from,to,next){
				//     console.log(`from ${from.fullPath},to ${to.fullPath}`);
				//     console.log('beforeLeave');
				//     next();
				// },
				//子路由使用: 需要在上一级 (User)路由页面加上router-view
				// 子路由使用,需要再上一级路由页面加上 router-view 显示。
				// 使用children属性实现路由嵌套,子路由path前不要加/,否则永远以根路径开始请求
				children: [{
					path: 'login',
					name: 'login',
					component: Login
				}, {
					path: 'regist/:username/:password',
					name: 'regist',
					component: Regist
				}]

			},
			{
				path: '*',
				redirect: '/home'
			}
		]

		const routerAll = new VueRouter({
			routes: routes, //简写,相当于routes:routes
			linkActiveClass: 'active', //更新活动链接的class类名,默认的激活的 class
			linkExactActiveClass: 'active-extact', //精确激活的 class
			mode: "hash", //默认
			//   页面跳转后,页面是否滚动
			scrollBehavior(to, from, savedPostion) {
				if (savedPostion) {
					return savedPostion;
				} else {
					return {
						x: 0,
						y: 0
					}; //每次切换页面都是滚动到页面顶部
				}
			}
		});

		var vm = new Vue({
			el: '#itapp',
			router: routerAll, //注入路由
			// test:routerAll,  //一般不这么写
			methods: {
				push() {
					// 1.字符串形式
					// this.$router.push('/home')
					// //2. 对象
					// this.$router.push({
					//     path:'/home'
					// })

					//  //2. 对象,带查询参数
					//  this.$router.push({
					//     path:'/home',
					//     query:{
					//         plan:'private'
					//     }
					// })
					// 获取参数$route.query, 相当于get

					// 3.命令路由
					// this.$options.test({
					//     name:'home',
					//     params:{
					//         userid:'123'
					//     }
					// });

					this.$router.push({
						name: 'home',
						params: {
							userid: '123'
						}
					})
					// 获取参数$route.params

				},
				replace() {
					routerAll.replace({
						path: 'user'
					}); //替换路由,没有历史记录
				}
			}
		});
	</script>
</body>

</html>