Skip to content
On this page

路由4.x

本文主要学习4.x在vue3中的使用姿势。
对比vue-router 3.xvue-router 4.x 具体参考至从Vue2迁移

安装

sh
cnpm install vue-router@4

配置路由规则

js
// 文件夹: src / router / index.js
// 主要用到  
	// createRouter:创建路由实例  
	// createWebHashHistory:hash路由模式  
	// createWebHistory: history路由模式
import { createRouter, createWebHistory, createWebHashHistory } from 'vue-router';

// 配置路由规则routes
const routes = [
	{
		path: '/',
		component: ()=>imports('./App.vue'),
		children:[
			path: 'home',
			component: ()=>imports('./Home.vue'),
		]	
	}
]

// 创建路由对象
const router = createRouter({
	routes,
	history: createWebHistory(),
	// 或者 hash: createWebHashHistory(),
})
// 暴露路由对象
export default router

挂载路由对象

js
import { createApp } from 'vue'
import router from '@/router/index.js'

const app = createApp(App)
// 使用并挂载路由
app.use(router);
app.mount('#app');

编程式导航

js
import {useRoute, useRouter} from 'vue-router';
const route = useRoute();
const router = useRouter();
console.log(route.path);
router.push({path: '/home',params: {user: 'admin'}});

导航守卫

支持通过返回false取消导航。
支持通过返回一个路由地址来替代next()
依旧支持next, 并且next变为可选参数

全局路由守卫

js
const router = createRouter({
	routes
});

// 前置路由守卫
router.beforeEach((to,from,next) =>{
	if(to.path == '/admin'){
		// 返回false取消导航
		return false;
	}
	else if(to.path == '/user'){
		return {path: '/home'};
		// 或者 return {name: 'Home'}
	}
	next()
})

路由独享的守卫

js
// 路由独享的守卫,与3.x版本写法一样
const routes = [
	{
		path: '/about',
		beforeEnter: (to,from)=>{
			return false
		}	
	}
]

组件独享的守卫

选项式API中,组件路由守卫依旧是beforeRouteEnter,beforeRouteUpdatebeforeRouteLeave。 这里我们主要学习组合式APIsetup语法糖中,组件路由守卫的写法。

js
// 引入 onBeforeRouteUpdate 和 onBeforeRouteLeave 表示当前组件内,路由更新和离开的守卫
import { onBeforeRouteUpdate, onBeforeRouteLeave } from 'vue-router'
import { ref } from 'vue';
const flag = ref(false);
// 组件内路由更新: onBeforeRouteUpdate
onBeforeRouteUpdate((to,from,next)=>{
	// ... 写条件
	if(!flag){
		return false;
	}
	next()
})
// 组件内路由离开: onBeforeRouteLeave
onBeforeRouteLeave((to,from,next)=>{
	// ...同上
})

从vue2迁移

与vue2的大致区别如下:

意义版本2版本3说明
引入vueRouter由引入整个类,转换为解构类的方法。
创建路由实例new vueRouter()createRouter()创建,转换为函数创建
路由模式mode:'history'history: createWebHistory()mode指定字符串, 转换由history或者hash指定函数返回值
挂载路由Vue.use + 选项式 router:routerapp.use(router), 不需要指定挂载到app上
编程式导航this.$route, this.$routeruseRoute(), useRouter()全局属性, 转换为函数返回值
指定渲染tagtag="span"v-slot="{ navigate }"由props指定,更改为使用v-slot作用域插槽形式

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