Skip to content
On this page

vue路由

安装和引入

vue
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.7.0/vue.js"></script>
<!-- 首先引入vue2, 建议引入2.7.0及以上版本,2.6.0-2.6.8版本无法正确渲染router-link -->
<script src="https://cdn.bootcdn.net/ajax/libs/vue-router/3.5.0/vue-router.js"></script>
<!-- 再引入vue-router -->

编写组件页面,和创建全局组件

vue
<!-- app根组件 -->
<div id="app">      
</div>
<!-- one组件 -->
<template id="one">
        <div>
            <h1>我是one组件</h1>
        </div>
</template>
<!-- two组件 -->
<template id="two">
    <div>
        <h1>我是two组件</h1>
    </div>
</template>
<!-- 注册组件 -->
<script>
	<!-- 注意:此处用了2个变量名 接收组件,目的是在编写路由规则routes的时候, 便于使用/引入组件 -->
	const one = Vue.component("one",{
		template: "#one"
	});
	const two = Vue.component("two",{
		template: "#two"
	});
</script>

创建路由对象,和编写路由规则

vue
<!-- 用router接收路由对象,便于在app内引入路由 -->
<!-- 用new VueRouter()注册对象,里面是{}配置对象 -->
const router = new VueRouter({
	<!-- 路由组件的配置对象包裹:
		1. routes:  路由规则,数组类型,里面由多个pnc,r(r表示重定向 redirect)对象组成。 其中component: 组件变量名。
		2. mode: "hash" 默认为哈希模式,带#。 可指定为"history", 不带#
		3. linkActiveClass: "router-link-active" 默认激活状态下,跳转标签的类名。也可以修改为自定义类名。例如:"a-active"
	 -->
	 routes: [
			{
		 		path: "/one",
		 		component: one
		 	},
		 	{
		 		path: "/two",
		 		component: two
		 	},
		 	{
		 		path: "/",
		 		redirect: "/one"
		 	}
 	 ],
 	 mode: "history", //修改为历史模式
 	 linkActiveClass: "a-active"
})

注册路由对象,和使用路由

vue
<!-- 在app里面注册路由对象 -->
new Vue({
		el: "#app",
		router: router
	});

<!-- 在app页面使用路由 -->
<router-link to="/one" tag="button">跳转到one路由</router-link>
<router-link to="/two" tag="button">跳转到two路由</router-link>
<!-- 用 to属性指定跳转的路劲,类似于a标签的url,用tag标签自定义渲染后的标签,不指定tag时默认渲染a标签 -->

<!-- 显示当前匹配的路由的组件内容 -->
<router-view></router-view>

完整案例:

html
<head>
    <!-- <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.5/vue.js"></script> -->
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.7.0/vue.js"></script>
    <!-- 注意:vue 2.6.0到vue 2.6.8都无法将router-link渲染为a标签 -->
    <script src="https://cdn.bootcdn.net/ajax/libs/vue-router/3.5.0/vue-router.js"></script>
    <title>Document</title>
    <!-- 先引入vue,再引入vue-router -->
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .o-active {
            color: red;
        }
    </style>
</head>

<body>
	<div id="app">
	    <!-- 在使用router-link标签替换a标签,to属性选择切换的路由路劲名。 
	    当前默认渲染为a标签。也可以使用tag标签,指定渲染后的标签,例如 tag="button"
	    -->
	    <!-- 当前激活的状态默认含有类名 router-link-active, 官方建议修改类名,在定义路由的时候,除了pnc,还可以使用linkActiveClass 指定别的类名。 -->
	    <router-link to="/one">切换到one</router-link>
	    <router-link to="/two">切换到two</router-link>
	    <!-- <router-link to="/two" tag="button">切换到two</router-link> -->
	    <router-view></router-view>
	    <!-- 使用router-view 渲染当前匹配路由的组件 -->
	</div>
	<template id="one">
	    <div>
	        <h1>我是one组件</h1>
	    </div>
	</template>
	<template id="two">
	    <div>
	        <h1>我是two组件</h1>
	    </div>
	</template>
	<script>
	    // 注意此处定义全局组件的时候,必须用一个变量接收,表示该组件。
	    //不然在配置路由规则的时候,无法将此组件引入。
	    const one = Vue.component("one", {
	        template: "#one"
	    });
	    const two = Vue.component("two", {
	        template: "#two"
	    });
	    // 定义一个路由对象VueRouter(),由router变量接收。
	    // 配置对象是数组,里面由路由pnc对象组成。
	    const router = new VueRouter({
	        // 注意配置对象名称为: routes
	        routes: [
	            {
	                path: "/one", component: one
	                // 使用linkActiveClass 指定激活类名为"o-active", 默认是router-link-active
	            },
	            {
	                path: "/two", component: two
	            },
	            {
	                path: "/", redirect: "/one"
	                // 使用linkActiveClass 指定激活类名为"o-active", 默认是router-link-active
	            },
	            // {
	            //     path: "/one", component: one
	            //     // 使用linkActiveClass 指定激活类名为"o-active", 默认是router-link-active
	            // },
	        ],
	        mode: "history",
	        // 与routes同级别,mode 修改模式,默认值是"hash", 带#。 可以修改为"history",此时不带#
	        linkActiveClass: "o-active"
	        // 与routes同级别,linkActiveClass修改激活时的类名,便于添加自定义样式
	    });

	    new Vue({
	        el: "#app",
	        router: router,
	        // 绑定路由对象到根组件上面。
	        components: {
	            one: one,
	            two: two
	        }
	    });
	</script>
</body>

路由对象之路由守卫

全局路由守卫:

router.beforeEach((from,to,next)=>{})

js
// 全局路由守卫是路由对象可以指定的方法: .beforeEach()
// 例如路由对象如下
const router = new VueRouter({
	routes: [{
		path: "/one",
		component: one
	}]
});
// 定义全局路由守卫: 路由对象的方法。
router.beforeEach(
	// 该方法接收一个回调函数,回调函数里面由三个参数组成
	// from,to,next, 
	// from表示来自哪个,要离开的路由对象,from.name则表示要离开的路由的name
	// to 表示即将去哪个路由对象,to.name则表示即将去的路由的name
	// next() 是一个方法,不带参数是表示默认去向to的路由,也可以带一个路由路径的名字符串,或者路由对象
	// 例如:next(), next("/two"), next({name: "two"})
		(from,to,next) => {
			if(to.name == "one"){
				...
				// 定义一些localstorage之类的操作。
				next("/two"); //必须带上这个方法,不然不跳转
				// 或者用next
			}
			else next()
		}
	);

局部路由守卫

仅供该路由规则独享,beforeEnter属性,属性值为回调函数。 定义在路由规则内部的指定的路由对象(pnc)上面的方法。

js
const router = new VueRouter({
	routes: [
	{
		path: "/one",
		component: one,
		beforeEnter: (from, to, next)=>{
			if(to.path === "/two"){
				next("/one");
				// 模拟实现了重定向的功能,
				// 禁止跳转到"/two"路由的功能。
			}
		}
	},
	]
});

一个陪你成长的前端博客 - XDocs