-
2022-03-14 11:27:18
路由钩子函数分为三种:
全局前置守卫 router.beforeEach 全局解析守卫 router.beforeResolve 全局后置钩子 router.afterEach 路由独享的守卫 beforeEnter 组件内的守卫 beforeRouteEnter beforeRouteUpdate beforeRouteLeave
1:全局钩子:
全局前置守卫
beforeEach
const router = createRouter({ ... }) router.beforeEach((to, from) => { // ... // 返回 false 以取消导航 return false })
全局解析守卫 beforeResolve
这和
router.beforeEach
类似,因为它在 每次导航时都会触发,但是确保在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被正确调用。router.beforeResolve(async to => { if (to.meta.requiresCamera) { try { await askForCameraPermission() } catch (error) { if (error instanceof NotAllowedError) { // ... 处理错误,然后取消导航 return false } else { // 意料之外的错误,取消导航并把错误传给全局处理器 throw error } } } })
router.beforeResolve
是获取数据或执行任何其他操作(如果用户无法进入页面时你希望避免执行的操作)的理想位置。2:单个路由里面的钩子: beforeEnter
const routes = [ { path: '/users/:id', component: UserDetails, beforeEnter: (to, from) => { // reject the navigation return false }, }, ]
beforeEnter
守卫 只在进入路由时触发,不会在params
、query
或hash
改变时触发。例如,从/users/2
进入到/users/3
或者从/users/2#info
进入到/users/2#projects
。它们只有在 从一个不同的 路由导航时,才会被触发。你也可以将一个函数数组传递给
beforeEnter
,这在为不同的路由重用守卫时很有用:3: 组件路由:beforeRouteEnter、 beforeRouteUpdate、 beforeRouteLeave
const UserDetails = { template: `...`, beforeRouteEnter(to, from) { // 在渲染该组件的对应路由被验证前调用 // 不能获取组件实例 `this` ! // 因为当守卫执行时,组件实例还没被创建! }, beforeRouteUpdate(to, from) { // 在当前路由改变,但是该组件被复用时调用 // 举例来说,对于一个带有动态参数的路径 `/users/:id`,在 `/users/1` 和 `/users/2` 之间跳转的时候, // 由于会渲染同样的 `UserDetails` 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。 // 因为在这种情况发生的时候,组件已经挂载好了,导航守卫可以访问组件实例 `this` }, beforeRouteLeave(to, from) { // 在导航离开渲染该组件的对应路由时调用 // 与 `beforeRouteUpdate` 一样,它可以访问组件实例 `this` }, }
更多相关内容 -
vue组件级路由钩子函数
2019-05-05 20:32:20vue组件级路由钩子函数(beforeRouteEnter/beforeRouteUpdate/beforeRouteLeave) beforeRouteEnter(to, from, next):进入路由之前执行的函数,写在组件里可根据路由进行页面判断或传值。 beforeRouteLeave(to, ...vue组件级路由钩子函数(beforeRouteEnter/beforeRouteUpdate/beforeRouteLeave)
beforeRouteEnter(to, from, next):进入路由之前执行的函数,写在组件里可根据路由进行页面判断或传值。
beforeRouteLeave(to, from, next):离开路由之前执行的函数,可用于页面的反向传值,页面跳转。
// 点击后拿到数据返回给下单地址 beforeRouteLeave (to, from, next) { if (to.name === 'home') { to.query.temp = '这里是参数,选中后的地址' } console.log(to) console.log(from) next()//一定不要忘记写 },
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
beforeRouteEnter(to,from,next)
beforeRouteEnter 函数内部 this 是undefined,这是因为在执行路由钩子函数beforRouteEnter时候,组件还没有被创建出来;先执行beforRouteEnter,再执行组件周期钩子函数beforeCreate。我们可以通过 next 获取组件的实例对象,如:next( (vm)=>{} ),参数vm就是组件的实例化对象。
<template> <div> 我是about <hr> <ul class="subnave f-cb"> <router-link :to='{name:"About"}' exact tag="li"> <a>study</a> </router-link> <router-link :to='{name:"Work"}' tag="li"> <a>work</a> </router-link> <router-link :to='{name:"Hobby"}' tag="li"> <a>hobby</a> </router-link> </ul> 测试数据:{{test}} <router-view></router-view> </div> </template> <script> export default { data(){ return { test:'改变之前' } }, beforeCreate(){//组件生命周期函数 console.log('beforeCreate') }, //当进入组件之前,执行 beforRouteEnter 路由钩子函数 beforeRouteEnter(to,from,next){ console.log('beforRouteEnter') console.log(this) // 结果为undefined,因为在执行beforRouteEnter时候,组件还没有被创建出来;先执行beforRouteEnter,再执行beforeCreate next((vm)=>{ //参数vm就是当前组件的实例。 vm.test = '我被改变了' }) } } </script>
beforeRouteUpdate(to,from,next)
About组件是有二级导航的,在切换二级导航的时候,对应的内容是在变化的;但是about组件是复用的,只会生成一次,切换二级导航的时,如何知道导航在更新呢?
一个组件有二级导航的时候,点击二级导航的时候导航路径更新了,会触发路由钩子函数beforeRouteUpdate。
beforeRouteUpdate(to,from,next){ console.log('beforeRouteUpdate') next() }
beforeRouteLeave(to,from,next)
当在about切换到user时,about页面有些数据还没有加载完成,这时候我们不让它切换到user。
beforeRouteLeave(to,from,next){//离开组件的时候触发 //什么都不写的时候,不会离开(走下一步) next() }
完整demo代码
<template> <div> 我是about <hr> <ul class="subnave f-cb"> <!-- a标签中href属性不需要写地址,页面编译完成后自动会在href中加入对应的路劲 --> <router-link :to='{name:"About"}' exact tag="li"> <a>study</a> </router-link> <router-link :to='{name:"Work"}' tag="li"> <a>work</a> </router-link> <router-link :to='{name:"Hobby"}' tag="li"> <a>hobby</a> </router-link> </ul> 测试数据:{{test}} <router-view></router-view> </div> </template> <script> export default { data(){ return { test:'改变之前' } }, beforeCreate(){//组件生命周期函数 console.log('beforeCreate') }, //当进入组件之前,执行 beforRouteEnter 路由钩子函数 beforeRouteEnter(to,from,next){ console.log('beforRouteEnter') console.log(this) // 结果为undefined,因为在执行beforRouteEnter时候,组件还没有被创建出来;先执行beforRouteEnter,再执行beforeCreate next((vm)=>{ //参数vm就是当前组件的实例。 vm.test = '我被改变了' }) }, beforeRouteUpdate(to,from,next){ console.log('beforeRouteUpdate') next() }, beforeRouteLeave(to,from,next){//离开组件的时候触发 //什么都不写的时候,不会离开(走下一步) next() } } </script>
-
vue-router全局钩子函数+单个路由钩子函数+组件内钩子函数
2018-08-17 11:06:401. vue-router全局钩子函数 beforeEach和afterEach是vue-router实例对象的属性 特别提醒:每次路由跳转,都会执行beforeEach和afterEach beforeEach var router=new Router({ routes: [ { path: '/', ...1. vue-router全局钩子函数
beforeEach和afterEach是vue-router实例对象的属性
特别提醒:每次路由跳转,都会执行beforeEach和afterEach
beforeEachvar router=new Router({ routes: [ { path: '/', name: 'Chat', component: Chat } ] });
router.beforeEach有三个参数:to/from/next
router.beforeEach(function (to,from,next) { console.log(to);//到达的路由 console.log(next);//管道中,可以跳转到其他路由 console.log(from);//离开的路由 next(); })
router.afterEach有两个参数:to/from
router.afterEach(function (to,from) { console.log(to);//到达的路由 console.log(from);//离开的路由 })
2. 单个路由钩子函数beforeEnter
beforeEnter有三个参数:to/from/next{ path: '/', name: 'Login', component: Login, beforeEnter: (to, from, next) => { console.log("我即将进入login1111111111111"); next(); } },
3.组件内钩子函数
beforeRouteEnter+beforeRouteUpdate+beforeRouteLeave
都有三个参数:to/from/next
beforeRouteEnter:进入这个组建路由之前
beforeRouteLeave:离开这个组建路由
特别注意:
beforeRouteUpdate:再本路由的下级路由切换才会触发beforeRouteUpdatemethods:{ success:function(){ this.$router.push({ path: '/chat' }); }, }, computed:{ }, beforeRouteEnter:function(to,from,next){ console.log("进入这个组建1111111"); next() }, beforeRouteUpdate:function(to,from,next){ console.log("在二级导航里面切换了22222"); next() }, beforeRouteLeave:function(to,from,next){ console.log("离开这个组建更新3333333"); next() },
-
Vue父子组件钩子函数调用顺序
2021-08-23 15:50:49通常我们在父组件中的mounted中执行initMap()来初始化地图对象(其他钩子函数中执行initMap()将不会渲染出地图),而在上面的测试中我们可以看到子组件的mounted要比父组件的mounted先执行,导致子组件中获取的map...参考:https://blog.csdn.net/csdn_yudong/article/details/113035397
结果:
通常我们在父组件中的mounted中执行initMap()来初始化地图对象(其他钩子函数中执行initMap()将不会渲染出地图),而在上面的测试中我们可以看到子组件的mounted要比父组件的mounted先执行,导致子组件中获取的map为空对象。因此现在我们要考虑一种方式,可以先执行父组件的mounted,后执行子组件的mounted(只有这样子组件中才能获取父组件传过来的Map对象)。
beforeMount() { // _isMounted是当前实例mouned()是否执行 此时为false window.parentMounted = this._isMounted; }, mounted() { //父组件中初始化地图对象map //this.initMap();//在这里执行初始化操作 // _isMounted是当前实例mouned()是否执行 此时为true window.parentMounted = this._isMounted; },
mounted() { let pMountedTimer = {}; //定时器 pMountedTimer = setInterval(() => { if (window.parentMounted) { //在这里执行初始化 this.addDrawLayer(); clearInterval(pMountedTimer); //清除定时器 } }, 1000); },
此外,还可以先不加载子组件,即最开始先把子组件的v-if设为false,想使用子组件时直接把子组件v-if设为true即可
-
vue父子组件钩子函数的执行顺序
2020-12-19 03:56:17Vue父子组件生命周期 转载自:https://blog.csdn.net/a8725585/article/details/79092505 vue父子组件钩子函数触发顺序 beforeMount后mounted前构造子组 ... Vue生命周期 钩子函数和组件传值 Vue生命周期 钩子函数 ... -
Vue组件生命周期、钩子函数
2018-08-11 09:49:53beforeCreate beforeCreate() { // 在组件还没有创建好时,是不能访问组件的任何方法和属性的 console.log('beforeCreate 组件开始创建前') }, created created() { // 组件创建好之后可以组件实... -
解决Vue中mounted钩子函数获取节点高度出错问题
2020-11-30 16:00:11最近在开发一个Vue的项目,好几个页面都有用到一个 页面楼层滑动的组件,我就直接封装成了一个,但是遇到一个bug,就是我需要得到这个组件的offsetTop,然后页面滚动到这个位置的时候,就设置position属性为fixed,... -
vue中的钩子函数
2020-07-06 15:57:49在开发一般的业务来说,不需要知道 Vue 中钩子函数过多的执行细节。但是如果你想写出足够稳健的代码,或者想开发一些通用库,那么就少不了要深入了解各种钩子的执行时机了。 组件生命周期 hook 在组件树中的调用... -
Vue常用的钩子函数
2020-12-31 16:20:52初学Vue,对几个钩子函数还是比较模糊,有时候想在钩子函数中做一些事情,但什么时候做,在那个函数中做,还不是很清楚。 于是,开始探索: 生命周期函数: <body> <div id="app"> <h3 id="h3"&... -
vue父子组件的钩子函数执行先后顺序
2019-08-23 13:56:34父子组件的钩子函数执行先后顺序 父组件 export default { name: 'app', components: { Child }, beforeCreate() { console.log('父组件组件beforeCreate') }, created() { console.log('父组件created'... -
VUE 钩子函数
2022-01-12 17:15:52“Vue钩子函数就是指在一个Vue实例从创建到销毁的过程自动执行的函数。” 引用知乎SpiritTracks 作者的话 “就是在生命周期执行流程中预留的一个能让我们执行自己代码的地方。叫钩子函数,很形象的,钩子钩子,挂载... -
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
2020-10-15 01:37:13主要介绍了vue中父子组件传值,解决钩子函数mounted只运行一次的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
【vue3 vue-router 钩子函数】
2022-03-09 14:09:53vue3 vue-router 钩子函数 全局路由守卫(vue-router4.0中将next取消了,可写可不写,return false取消导航,undefined或者是return true验证导航通过) router.beforeEach((to,from)=>{}),next是可选参数,可写... -
vue生命周期钩子函数 面试必问 组件初始化、运行中、销毁......
2020-10-13 20:52:07生命周期钩子函数 组件从创建到销毁的一系列过程叫做组件的声明周期。 vue在整个生命周期里面提供了一些函数,可以在内部实现一些业务逻辑, 并且这些函数会在一些特定的场合下去执行。(在生命周期的某一个时刻... -
史上最全的Vue生命周期钩子函数11个
2021-04-23 15:07:16什么是生命周期? 生命周期: Vue是一个构造函数,当执行执行这个函数时,相当于初始化vue实例;...生命周期的钩子函数中的this,会默认指向vue的实例; 什么是钩子函数? beforeCreate created[可以.. -
Vue父子组件钩子函数
2018-01-18 10:24:07vue父子组件钩子函数触发顺序 beforeMount后mounted前构造子组件 依次遍历 beforeCreate-父组件 created-父组件 beforeMount-父组件 beforeCreate-子组件 created-子组件 beforeMount-子组件 beforeCreate-次子... -
深入理解Vue 的钩子函数
2020-12-10 05:35:39说到Vue的钩子函数,可能很多人只停留在一些很简单常用的钩子( created , mounted ),而且对于里面的区别,什么时候该用什么钩子,并没有仔细的去研究过,且Vue的生命周期在面试中也算是比较高频的考点,那么该如何... -
Vue中组件生命周期中涉及的钩子函数
2020-05-13 21:35:59钩子函数简要说明 beforeCreate与created (1) beforeCreate 为组件完全创建前调用的函数,使用不多,但常用于定时器; (2) created 为组件完全创建后调用的函数,此时可以获取后端数据然后对组件中的数据属性进行... -
vue中组件生命周期( 组件内钩子 )
2019-04-23 21:22:48组件生命周期( 组件内钩子 ) 钩子函数,就是options里面的key, 它的值是函数 钩子函数写在其他配置项的后面 组件的有哪几个阶段? 初始化阶段 运行中阶段 销毁阶段 初始化阶段 分为两个大阶段, 每一个大... -
vue八种钩子函数
2020-09-04 09:03:47组件生命周期钩子函数 一个组件从创建到销毁会经历一系列的特殊过程,把执行过程叫做组件的生命周期 每个生命周期都会执行特殊的函数,把这些函数称为生命钩子函数 vue生命周期4组8个常用 创建前后,挂载前后︰更新... -
Vue的路由钩子函数有哪些?
2021-08-02 09:11:091、全局的路由钩子函数 1.1、beforeEach(全局前置钩子),意思是在每次每一个路由改变的时候都要执行一遍 它有三个参数: to: route:即将要进入的目标 路由对象 from:route:当前导航正要离开的路由 ... -
vue生命周期钩子函数详解
2018-07-26 11:12:03钩子函数 触发的行为 在此阶段可以做的事情 beforeCreadted vue实例的挂载元素$el和数据对象data都为undefined,还未初始化。 加loading事件 created vue实例的数据对象data有了,$el还没有 结束... -
vue路由的钩子函数以及用法详解
2020-08-21 18:38:14关于vue路由的钩子函数,无论实际项目中还是面试中都是很重要的话题,下面根据自己实际项目中的了解简单介绍下vue路由的几个钩子函数以及在项目中的用处 beforeEach 这个钩子函数一般用于全局级别的,对整个项目的... -
vue生命周期钩子函数有哪些
2021-05-20 21:00:54每个vue实例从创建到销毁的过程就是vue的一个生命周期,每个阶段都有对应的钩子函数,当我们想在vue的不同时期操作vue实例是,就可以在不同的钩子函数中进行 vue有8种生命周期函数: beforeCreate(实例创建前)... -
Vue 的路由钩子函数/路由守卫有哪些
2021-11-17 20:55:40Vue 的路由钩子函数/路由守卫有哪些全局前置守卫全局后置钩子路由独享的守卫组件内的守卫(只对当前组件生效) 全局前置守卫 o 当一个导航触发时,全局前置守卫(在进入组件之前)按照创建顺序调用。 o vue-router ... -
UserList.vue组件中用钩子函数初始化第一页的分页数据
2021-05-03 17:59:14文章目录UserList.vue组件中用钩子函数初始化第一页的分页数据需求created钩子函数的代码getUserList方法UserList.vue组件中的分页数据SpringBoot后端控制器中接收pageuser请求的方法getUserList动态代理接口UserDao... -
vue路由钩子函数(进入和离开钩子函数)
2021-05-04 16:50:48beforeRouteEnter:(to, from, next) => { console.log("准备... console.log("进入路由后要调用的函数") ); }, beforeRouteLeave:(to, from, next) => { console.log("准备离开这个路由"); next( cons.