页面加载时,vue生命周期的触发顺序
那么进入某个路由对应的组件的时候,我们会触发哪些类型的周期呢?
根实例的加载相关的生命周期(beforeCreate、created、beforeMount、mounted)
组件实例的加载相关的生命周期(beforeCreate、created、beforeMount、mounted)
全局路由勾子(router.beforeEach)
组件路由勾子(beforeRouteEnter)
组件路由勾子的next里的回调(beforeRouteEnter)
指令的周期(bind,inserted)
nextTick方法的回调
接下来,让我们用vue-cli简单改造后的项目,做一个测试,看看各个声明周期的触发顺序是怎样的
main.js
router.beforeEach((to, from, next) => {console.log('路由全局勾子:beforeEach')next()
})router.afterEach((to, from) => {console.log('路由全局勾子:afterEach')
})new Vue({beforeCreate () {console.log('根组件:beforeCreate')},created () {console.log('根组件:created')},beforeMount () {console.log('根组件:beforeMount')},mounted () {console.log('根组件:mounted')}el: '#app',router,template: '<App/>',components: { App }
})
test.vue
<template><h1 v-ooo @click = "$router.push('/')">test</h1>
</template>
<script>
export default {beforeRouteEnter (to, from, next) {console.log('组件路由勾子:beforeRouteEnter')next(vm => {console.log('组件路由勾子beforeRouteEnter的next')})},beforeCreate () {console.log('组件:beforeCreate')},created () {this.$nextTick(() => {console.log('nextTick')})console.log('组件:created')},beforeMount () {console.log('组件:beforeMount')},mounted () {console.log('组件:mounted')},directives: {ooo: {bind (el, binding, vnode) {console.log('指令binding')},inserted (el, binding, vnode) {console.log('指令inserted')}}}
}
</script>
接下来,直接进入test.vue对应的路由。在控制台,我们看到如下的输出
我们看到执行的顺序为
路由勾子 (beforeEach、beforeRouteEnter、afterEach)
根组件 (beforeCreate、created、beforeMount)
组件 (beforeCreate、created、beforeMount)
指令 (bind、inserted)
组件 mounted
根组件 mounted
beforeRouteEnter的next的回调
nextTick
结论
路由勾子执行周期非常早,甚至在根实例的渲染之前
具体的顺序 router.beforeEach > beforeRouteEnter > router.afterEach
在进行路由拦截的时候要避免使用实例内部的方法或属性。
在开发项目时候,我们脑门一拍把,具体拦截的程序,写在了根实例的方法上了,到beforeEach去调用。
结果导致整个拦截的周期,推迟到实例渲染的之后。
因此对于一些路由组件的beforeRouteEnter里的请求并无法拦截,页面看上去好像已经拦截下来了。
实际上请求依然发了出去,beforeRouteEnter内的函数依然执行了。
指令的绑定在组件mounted之前,组件的beforeMount之后
不得不提的, beforeRouteEnter的next勾子
beforeRouteEnter的执行顺序是如此靠前,而其中next的回调勾子的函数,执行则非常靠后,在mounted之后!!
我们通常是在beforeRouteEnter中加载一些首屏用数据,待数据收到后,再调用next勾子,通过回调的参数vm将数据绑定到实例上。
因此,请注意next的勾子是非常靠后的。
nextTick
越早注册的nextTick触发越早
转载自https://segmentfault.com/a/1190000008923105
页面加载时,vue生命周期的触发顺序相关推荐
- 异步加载在Vue生命周期哪个阶段更合理
react高阶面试题中有这么一道:为什么异步请求数据在didMount阶段更合适?同为MVVM中的翘楚,Vue是否也有类似问题呢?另外,我在平时也无开发过程中也会发现,每个人选择的那个生命周期阶段去异 ...
- vue 加载页面时触发时间_详解Vue.js在页面加载时执行某个方法
详解Vue.js在页面加载时执行某个方法 jQuery中可以这样写 vue中,如果要达到相同效果,可以使用vue的生命周期函数,如create或者mounted 附上vue.js的生命周期函数执行流程 ...
- html页面展示大括号,vue 防止页面加载时看到花括号的解决操作
如下所示: [v-cloak]{ display:none } v-cloak v-text v-html v-cloak用于大段 v-text用于单个标签 v-html用于带有标签的处理 补充知识: ...
- 【iOS开发】-UIViewController加载过程和生命周期
文章目录 前言 ViewController执行过程的探讨 ViewControllerOne 函数介绍 顺序引入 ViewControllerSecond引入 ViewControllerOne点击 ...
- Javascript在页面加载时的执行顺序
一.在HTML中嵌入Javasript的方法 直接在Javascript代码放在标记对<script>和</script>之间 由<script />标记的src属 ...
- Javascript在页面加载时的执行顺序(转载)
原文:http://dancewithnet.com/2007/03/22/order-of-execution-of-javascript-on-web/ 一.在HTML中嵌入Javasript的方 ...
- 加载页面就触发ajax,AJAX post方法,有时会在页面加载时触发,有时不会
我对AJAX有一个奇怪的问题,我在页面加载时使用AJAX POST方法返回对象地图. 我正在调试该过程,有时会调用该方法,并且Java Servlet有时会运行. 我正确地包含了JS导入,其他jQue ...
- 解决JS文件页面加载时的阻塞
关于页面加载时的时间消费,许多书中都做出了介绍,也提出了很多种方法.本文章就详细介绍XHR注入. 概述:JS分拆的方法 1.XHR注入:就是用ajax异步请求同域包含脚本的文件,然后将返回的字符串转化 ...
- chromium禁用ajax,页面加载时,jQuery AJAX不会在Chrome / Chromium中启动
| 场景:我拥有的是一个上传表单,该表单使用nginx uploadProgress模块报告上传进度.下面的代码在Firefox中可以正常工作,但是使用Chrome和Chromium时,页面加载时 ...
最新文章
- css折叠样式(1)——使用css样式的三种方式
- SDwebimage使用原理(转载)
- 写了个Linux包过滤防火墙
- 使用装饰者模式做有趣的事情
- Flink countWindow窗口
- 太赞了!用200道题彻底搞定Python数据处理!
- OpenCR arduino problem list
- 236.二叉树的最近公共祖先
- 深井软岩巷道群支护技术与应用_金能煤业公司组织观看千米深井软岩巷道大变形机理及围岩控制技术讲座...
- Windows Store App 音频和视频
- ubuntu14.04LTS 安装后几个基本设置
- 虚拟机在教学实验中的应用
- LBP算法的Matlab代码
- 【Unity Shader入门】☀️ | 使用Shader实现一个彩虹球效果✨!闪闪发光的特效离我又近了一步!
- 完美解决vmware连接摄像头问题(驱动程序错误)
- neo4j--Cypher语法练习(WITH、 FOREACH、Aggregation、UNWIND、UNION、CALL)
- 2019CISCN web题赛-JustSoSo;love_math(复现)
- 一共81个,开源大数据处理工具汇总(下)转
- 使用Calibre转换任意格式为支持KF8的mobi文件
- 驱动程序开发:多点电容触摸屏