vue-router

76 阅读5分钟

路由基础使⽤

作⽤:vue-router是Vue官⽅的路由管理器,是⼀个⽤来实现 SPA(single page web application) 的vue 插件。它和 Vue.js 的核⼼深度集成,让构建单⻚⾯应⽤变得易如反掌。

官⽅⽂档:vue-router

安装: npm install vue-router@4

使⽤步骤:

1. 路由配置

import { createRouter, createWebHashHistory, createWebHistory } from "vue

router";

import Login from '../views/Login.vue'

const routes = [

{

path: "/",

name: "login",

component: Login

},

{

path: "/register",

name: "register",

component: () =>

import( "../views/Register.vue"),

},

];

const router = createRouter({

history: createWebHashHistory(),

routes

})

export default router;

2. 主⽂件引⼊

import { createApp } from 'vue'

import './style.css'

import router from './router/index'

import App from './App.vue'

createApp(App).use(router).mount('#app')

3. 组件使⽤

<template>

<router-link to="/">登录</router-link>

<router-link to="/register">注册</router-link>

<router-view></router-view>

</template>

<script setup>

import { ref, reactive } from 'vue';

</script>

<style scoped>

</style>

路由属性配置说明

routes: [

{

path: string, //路径

component: Component; //⻚⾯组件

name: string; // 命名路由-路由名称

components: { [name: string]: Component }; // 命名视图组件

redirect: string | Location | Function; // 重定向

props: boolean | string | Function; // 路由组件传递参数

alias: string | Array<string>; // 路由别名

children: Array<RouteConfig>; // 嵌套⼦路由

beforeEnter?: (to: Route, from: Route, next: Function) => void;

// 路由单独钩⼦

meta: any; // ⾃定义标签属性,⽐如:是否需要登录

icon: any; // 图标

// 2.6.0+

caseSensitive: boolean; // 匹配规则是否⼤⼩写敏感?(默认值:false)

pathToRegexpOptions: Object; // 编译正则的选项

}

]

编程式路由导航

作⽤:通过js语句实现路由跳转

常⽤API

API作⽤
router.push(path)相当于点击路由链接(可以返回到当前路由界⾯)
router.replace(path)⽤新路由替换当前路由(不可以返回到当前路由界⾯)
router.back()请求(返回)上⼀个记录路由
router.go(-1)请求(返回)上⼀个记录路由
router.go(1)请求下⼀个记录路由

示例

<template>

<div class="container">

<div class="login-wrapper">

<div class="header">Login</div>

<div class="form-wrapper">

<input type="text" name="username" placeholder="username"

class="input-item">

<input type="password" name="password" placeholder="passwo

rd" class="input-item">

<div class="btn" @click="login">Login</div>

</div>

<div class="msg">

Don't have account?

<a href="#" @click.prevent="register">Sign up</a>

</div>

</div>

</div>

</template>

<script setup>

import { ref, reactive } from 'vue';

import { useRouter } from 'vue-router';

// 创建⼀个路由的管理员

const router = useRouter();

// 登录

function login(){

// 跳转⾸⻚

router.push('/home');

}

// 前往注册⻚

function register(){

console.log(router);

// 跳转注册⻚

router.push('/register');

}

</script>

路由传值

作⽤:路由跳转时传递参数

分类

  • query
  1. 可以传递多个参数 域名/list?name=aaa&pass=bbb
  2. 不需要额外配置路由
  • param
    特点:
  1. 需要额外配置路由

示例:query与params的实现

================================Login.vue================================

<template>

<div class="container">

<div class="login-wrapper">

<div class="header">Login</div>

<div class="form-wrapper">

<input type="text" name="username" placeholder="usernam

e" class="input-item">

<input type="password" name="password" placeholder="passw

ord" class="input-item">

// query⽅式实现

<div class="btn" @click="login">Login</div>

<router-link :to="{ path: '/home', query: adObj }">前往ho

me⻚</router-link>

</div>

<div class="msg">

Don't have account?

// params⽅式实现

<a href="#" @click.prevent="register">注册</a>

<br>

<router-link :to="{ name: 'register', params: address }">

跳转注册⻚</router-link>

</div>

</div>

</div>

</template>

<script setup>

import { ref, reactive } from 'vue';

import { useRouter } from 'vue-router';

const adObj = ref({

title: '让乡村宜居⼜宜业',

content: '近年来,河南省修武县的⺠宿“云上院⼦”声誉鹊起,慕名来访者络绎不绝,节假

⽇更是⼀房难求。曾经河南省北部云台⼭深处⼀处年久失修的废弃⼩学,经过“⽂艺范⼉”的改造,

蝶变成当地有代表性的⺠宿之⼀。'

})

// 由于路由表中没有配置接收province的字段,所以传递的这个字段是浪费的,在跳转的路由⻚

⾯获取不到的

const address = ref({ city: '合肥', code: '0551', province: '安徽' });

// 创建⼀个路由的管理员

const router = useRouter();
// 登录

function login() {

// 跳转⾸⻚

router.push({

path: '/home',

query: adObj.value

});

}

// 前往注册⻚

function register() {

console.log(router);

// 跳转注册⻚

router.push({ name: 'register', params: address.value });

}

</script>

============================Register.vue=================================

==

<template>

<h2>这是来⾃{{ city }}的⽤户正在注册</h2>

</template>

<script setup>

import { ref, reactive, onMounted } from 'vue';

import { useRoute } from 'vue-router';

// 路由的信息集合

const route = useRoute();

// 当前城市信息

const city = ref('');

onMounted(() => {

// 获取params传递过来的参数

console.log(route.params);

city.value = route.params.city

// 后续的操作

// ...axios

})

</script>

<style scoped></style>
==========================routers/index.js===============================

==

import { createRouter, createWebHashHistory, createWebHistory } from 'vue

-router'

import Login from '../views/Login.vue'

// import About from '../views/About.vue'

// 创建路由表

const routes = [

{

path: '/',

component: Login,

},

{

path: '/home',

component: () => import('../views/Home.vue'),

},

{

path: '/register/:city/:code',

name: 'register',

component: () => import('../views/Register.vue')

},

{

path: '/about',

name: 'about',

component: () => import('../views/About.vue')

},

]

// 3. 创建路由实例并传递 `routes` 配置

// 你可以在这⾥输⼊更多的配置,但我们在这⾥

// 暂时保持简单

const router = createRouter({

// 4. 内部提供了 history 模式的实现。为了简单起⻅,我们在这⾥使⽤ hash 模式。

history: createWebHistory(),

routes, // `routes: routes` 的缩写

})

嵌套路由

案例:实现⻚⾯的⼆级导航

示例

import Vue from 'vue'

import { createRouter, createWebHashHistory, createWebHistory } from "vue

router";

import Login from '../views/Login.vue'

import Home from '../views/Home.vue'

import News from '../views/News.vue'

import Ad from '../views/Ad.vue'

export default createRouter({

routes: [{

path: '/login',

component: Login

}, {

path: '/home',

component: Home,

children:[

{

// 注意:path配置的值,最左侧的/永远是根路由

path:'/home/news',

component:News

},

{

// 简化写法,path前⾯不加/,那么就代表是⽗路径下的某个路径

path:'ad',

component:Ad

},

{

path:"",

redirect:"news"

}

]

},{

path:'/',

redirect:'/login'

}

]

})

========================================================

<template>

<div>

<div>
<ul>

<li>

<router-link to="/home/news">新闻</router-link>

</li>

<li>

<router-link to="/home/ad">⼴告</router-link>

</li>

</ul>

</div>

<div>

<router-view></router-view>

</div>

</div>

</template>

<script setup>

</script>

<style scoped></style>

路由守卫

路由守卫⽤于在导航到路由或离开路由时执⾏特定的操作,⽐如验证⽤户权限、检查登录状态等。在 Vue 3中,路由守卫分为全局守卫、路由独享守卫和组件内守卫。

全局守卫

全局守卫直接作⽤于整个应⽤的路由。Vue Router提供了 beforeEachbeforeResolveafterEach 这三个全局守卫钩⼦函数。

import { createRouter, createWebHistory } from 'vue-router';

const router = createRouter({

history: createWebHistory(),

routes: [...yourRoutes]

});

// to:即将要进⼊的⽬标

// from:当前导航正要离开的路由

// next下⼀步要做什么

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

// 在路由导航之前执⾏操作

// 可以进⾏身份验证、权限检查等

next(); // 调⽤ next() 继续导航

});

router.beforeResolve((to, from, next) => {

// 在导航被确认之前,所有组件内的守卫和异步路由组件被解析之后执⾏

next();

});

router.afterEach((to, from) => {

// 在导航成功完成后执⾏,可以⽤来记录路由变化等操作

});

路由独享守卫

路由独享守卫作⽤于单个路由对象上,可以通过在路由配置中定义beforeEnter来使⽤。

const router = createRouter({

history: createWebHistory(),

routes: [

{

path: '/example',

component: ExampleComponent,

beforeEnter: (to, from, next) => {

// 在进⼊特定路由前执⾏操作

next();

}

},

// Other routes...

]

});

组件内守卫

组件内守卫⽤于在组件内部定义的路由守卫,可⽤于单个组件内。

import { onBeforeRouteEnter, onBeforeRouteLeave, onBeforeRouteUpdate } fro

m 'vue-router';

const Component = {

// 在组件进⼊路由前执⾏

beforeRouteEnter(to, from, next) {

// ⽆法访问 this,但可以通过回调获取实例

next(vm => {

// 通过 `vm` 访问组件实例

});

},

// 在路由更新时调⽤

beforeRouteUpdate(to, from, next) {

// 可以访问 this

next();

},

// 在离开当前路由时调⽤

beforeRouteLeave(to, from, next) {

// 可以访问 this

next();

}

};