来给您详细讲解一下 "Vue的路由及路由钩子函数的实现"。
一、Vue的路由机制
Vue.js 是一款轻量级的 JavaScript 框架,为我们提供了一套完整的解决方案。Vue 的路由机制实现了单页应用(SPA)的核心,通过改变 URL 地址实现页面的切换,而不像传统的多页应用刷新整个页面。Vue 的路由是以插件形式进行管理的,它提供了很多的路由接口和钩子函数。
路由所提供的核心功能就是实现了单页应用内对 URL 的处理,我们可以通过路由来跳转到不同的页面。在 Vue-router 中,它有三个基础概念:Router、Route、VueRouter。
-
Router 是 Vue 当中创建路由的一个实例化对象,用于接收一些配置参数、传递到对应组件。它的主要功能是初始化全局路由,监听 URL 变化,处理路由匹配。
-
Route 就是路由映射的对象,每个 Route 对象对应着一个 URL。
-
VueRouter 是 Vue.js 官方的 router 模块,它是构建单页应用必不可少的核心代码之一,VueRouter 的主要作用就是实现路由跳转、页面切换等功能。
下面是一个简单的实例来帮助您更好的理解:
import Vue from "vue";
import Router from "vue-router";
Vue.use(Router);
const routes = [{
path: "/",
name: "home",
component: () => import("@/views/Home.vue")
}, {
path: "/about",
name: "about",
component: () => import("@/views/About.vue")
}]
const router = new Router({
mode: "history",
base: process.env.BASE_URL,
routes
})
export default router;
在这里,我们通过 import Router
引入了路由并通过 Vue.use(Router)
进行注册。设置好了路由相关的参数后,再通过 new Router()
创建一个路由实例,这里参数的意义分别是:
-
mode
为路由模式,默认是 hash 模式,可以改成 history 模式 -
base
表示配置路由的根路径 -
routes
表示路由列表,里面都是路由对象,包含路由的路径、名称、对应的组件等属性
最后,我们将 router 实例暴露出去,再在 main.js 里面导入并挂载到 Vue 实例上即可:
import Vue from "vue";
import App from "./App.vue";
import router from "./router";
Vue.config.productionTip = false;
new Vue({
router,
render: h => h(App)
}).$mount("#app");
二、路由钩子函数
路由钩子函数就是在路由到达前或离开后执行的一些操作,这些操作主要有以下几种:
-
全局守卫: 当导航到某个路由时可以触发的钩子函数,包括
beforeEach
、beforeResolve
和afterEach
。 -
组件内守卫: 即在组件内定义的钩子函数,包括
beforeRouteEnter
、beforeRouteUpdate
和beforeRouteLeave
。
1. 全局守卫
Vue-router 提供了一些全局钩子函数,可以在路由导航过程中,在不同的生命周期阶段调用这些函数。
beforeEach(to, from, next)
全局前置守卫,类似于路由拦截器。在路由跳转前,可以做一些跳转前所需的逻辑。如果调用的 next 函数,则路由会继续往下执行,否则路由就会停止跳转。
router.beforeEach((to, from, next) => {
//to: 要进入的路,from: 从哪个路由离开的,next: 继续往下执行
if(to.meta.requiresAuth && !store.getters.isLoggedIn) {
next('/login')
} else {
next()
}
})
beforeResolve(to, from, next)
全局解析守卫,可以在所有组件内守卫和异步路由组件被解析之后调用。
router.beforeResolve((to, from, next) => {
console.log('全局解析守卫');
next();
})
afterEach(to, from)
全局后置钩子函数,类似于请求拦截器的返回拦截器,不会接受 next 函数。afterEach 只是要通知你已经完成了一些操作,你不需要再调用 next(),跳转已经完成。
router.afterEach((to, from) => {
console.log('已经完成了路由跳转');
})
2. 组件内守卫
这些守卫函数被组件内的路由钩子调用。它们可以有许多用例,例如在进入或离开页面时,需要验证或修改组件的一些数据。
beforeRouteEnter(to, from, next)
访问路由之前为组件生成实例,有时候在组件里的钩子函数,我们拿到的是 undefined,这时候需要用到 beforeRouteEnter 组件钩子,它提供一个回调函数next,可以在回调函数next里面接受这个实例。
export default {
beforeRouteEnter(to, from, next) {
console.log('beforeRouteEnter')
next(vm => {
//vm 是 beforeRouteEnter 里面的 this 实例
vm.xxx = "hello world"
})
},
data() {
return {
xxx: ""
}
}
}
beforeRouteUpdate(to, from, next)
beforeRouteUpdate 可以监测到 $route 对象的变化,通常用于复用组件时,当在当前路由中使用组件时,如果路由参数发生变化,组件会进行复用,这时候可以使用 beforeRouteUpdate 钩子函数来更新组件的数据。
export default {
//更新时有参数对应,to 表示更新的路由
beforeRouteUpdate(to, from, next) {
const id = to.params.id
console.log('beforeRouteUpdate for -> :', id)
this.fetchData(id)
next()
},
methods: {
fetchData(id) {
console.log('beforeRouteEnter fetchData for -> :', id)
}
}
}
beforeRouteLeave(to, from, next)
beforeRouteLeave 在路由离开时调用,离开组件之前,通过 next 回调函数中传递 true 或 false,来控制离开行为。
export default {
beforeRouteLeave(to, from, next) {
console.log('beforeRouteLeave')
if(confirm('确定离开?')) {
next()
} else {
next(false)
}
}
}
总结
Vue-router 作为 Vue.js 框架中的一部分,使用方便简单,提供了路由的基础功能,同时支持多种钩子函数,这些钩子函数可以帮助我们在路由跳转前或后,自定义处理一些逻辑,提高了项目的可扩展性、可维护性。
以上就是 "Vue的路由及路由钩子函数的实现" 的详细讲解,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue的路由及路由钩子函数的实现 - Python技术站