zoukankan      html  css  js  c++  java
  • 【转】Vue生命周期

    Vue所有的生命周期钩子自动绑定在this上下文到实例中,因此你可以访问数据,对属性和方法进行运算。这意味着你不能使用箭头函数来定义一个生命周期方法。这是因为箭头函数绑定了父上下文,因此this与你期待的Vue实例不同。

    1、beforeCreate

      在实例初始化之后,数据观测和event/watcher时间配置之前被调用。
      
    2、created

      实例已经创建完成之后被调用。在这一步,实例已经完成以下的配置:数据观测,属性和方法的运算,watch/event事件回调。然而,挂载阶段还没开始,$el属性目前不可见。
      
    3、beforeMount

      在挂载开始之前被调用:相关的render函数首次被调用。
      该钩子在服务器端渲染期间不被调用。
      
    4、mounted

    el被新创建的 vm.$el替换,并挂在到实例上去之后调用该钩子函数。如果root实例挂载了一个文档内元素,当mounted被调用时vm.$el也在文档内。该钩子在服务端渲染期间不被调用。
      
    5、beforeUpdate

      数据更新时调用,发生在虚拟DOM重新渲染和打补丁之前。
      你可以在这个钩子中进一步第更改状态,这不会触发附加的重渲染过程。
      该钩子在服务端渲染期间不被调用。
      
    6、updated

      由于数据更改导致的虚拟DOM重新渲染和打补丁,在这之后会调用该钩子。
      当这个钩子被调用时,组件DOM已经更新,所以你现在可以执行依赖于DOM的操作。然而在大多数情况下,你应该避免在此期间更改状态,因为这可能会导致更新无限循环。
      该钩子在服务端渲染期间不被调用。
      
    7、activated

      keep-alive组件激活时调用。
      该钩子在服务器端渲染期间不被调用。
      
    8、deactivated

      keep-alive组件停用时调用。
      该钩子在服务端渲染期间不被调用。
      
    9、beforeDestroy 【类似于React生命周期的componentWillUnmount】

      实例销毁之间调用。在这一步,实例仍然完全可用。
      该钩子在服务端渲染期间不被调用。
      
    10、destroyed

      Vue实例销毁后调用。调用后,Vue实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

      

    含有keep-alive 生命周期钩子:

    在被keep-alive包含的组件/路由中,会多出两个生命周期的钩子: activated 与 deactivated。
    在 2.2.0 及其更高版本中,activated 和 deactivated 将会在 树内的所有嵌套组件中触发。

    activated在组件第一次渲染时会被调用,之后在每次缓存组件被激活时调用。


    activated调用时机:

    第一次进入缓存路由/组件,在mounted后面,beforeRouteEnter守卫传给 next 的回调函数之前调用:

        beforeMount=> 如果你是从别的路由/组件进来(组件销毁destroyed/或离开缓存deactivated)=>
        mounted=> activated 进入缓存组件 => 执行 beforeRouteEnter回调

    因为组件被缓存了,再次进入缓存路由/组件时,不会触发这些钩子:

       // beforeCreate created beforeMount mounted 都不会触发。
    • 1

    所以之后的调用时机是:

     组件销毁destroyed/或离开缓存deactivated => activated 进入当前缓存组件 
        => 执行 beforeRouteEnter回调
        // 组件缓存或销毁,嵌套组件的销毁和缓存也在这里触发
    • 1
    • 2
    • 3

    deactivated:组件被停用(离开路由)时调用

    使用了keep-alive就不会调用beforeDestroy(组件销毁前钩子)和destroyed(组件销毁),因为组件没被销毁,被缓存起来了。
    这个钩子可以看作beforeDestroy的替代,如果你缓存了组件,要在组件销毁的的时候做一些事情,你可以放在这个钩子里。
    如果你离开了路由,会依次触发:

     组件内的离开当前路由钩子beforeRouteLeave =>  路由前置守卫 beforeEach =>
     全局后置钩子afterEach => deactivated 离开缓存组件 => activated 进入缓存组件(如果你进入的也是缓存路由)
    
     // 如果离开的组件没有缓存的话 beforeDestroy会替换deactivated 
     // 如果进入的路由也没有缓存的话  全局后置钩子afterEach=>销毁 destroyed=> beforeCreate等
    

     


    关于生命周期钩子需要注意的内容:

    • ajax请求最好放在created里面,因为此时已经可以访问this了,请求到数据就可以直接放在data里面。
      这里也碰到过几次,面试官问:ajax请求应该放在哪个生命周期。

    • 关于dom的操作要放在mounted里面,在mounted前面访问dom会是undefined。

    • 每次进入/离开组件都要做一些事情,用什么钩子:

      (1)不缓存:
      进入的时候可以用created和mounted钩子,离开的时候用beforeDestory和destroyed钩子,beforeDestory可以访问this,destroyed不可以访问this。

      (2)缓存了组件:
      缓存了组件之后,再次进入组件不会触发beforeCreate、created 、beforeMount、 mounted,如果你想每次进入组件都做一些事情的话,你可以放在activated进入缓存组件的钩子中。
      同理:离开缓存组件的时候,beforeDestroy和destroyed并不会触发,可以使用deactivated离开缓存组件的钩子来代替。


    触发钩子的完整顺序:

    将路由导航、keep-alive、和组件生命周期钩子结合起来的,触发顺序,假设是从a组件离开,第一次进入b组件:

    1- beforeRouteLeave:路由组件的组件离开路由前钩子,可取消路由离开。

    2- beforeEach: 路由全局前置守卫,可用于登录验证、全局路由loading等。

    3- beforeEnter: 路由独享守卫

    4- beforeRouteEnter: 路由组件的组件进入路由前钩子。

    5- beforeResolve:路由全局解析守卫

    6- afterEach:路由全局后置钩子

    7- beforeCreate:组件生命周期,不能访问this。

    8- created:组件生命周期,可以访问this,不能访问dom。

    9- beforeMount:组件生命周期

    10- deactivated: 离开缓存组件a,或者触发a的beforeDestroy和destroyed组件销毁钩子。

    11- mounted:访问/操作dom。

    12- activated:进入缓存组件,进入a的嵌套子组件(如果有的话)。

    13- 执行beforeRouteEnter回调函数next。

     转自https://blog.csdn.net/qq_24147051/article/details/81167093

  • 相关阅读:
    简单两步快速实现shiro的配置和使用,包含登录验证、角色验证、权限验证以及shiro登录注销流程(基于spring的方式,使用maven构建)
    使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例
    关于cas-client单点登录客户端拦截请求和忽略/排除不需要拦截的请求URL的问题(不需要修改任何代码,只需要一个配置)
    javacpp-opencv图像处理系列:国内车辆牌照检测识别系统(万份测试车牌识别准确率99.7%以上,单次平均耗时39ms)
    最全面的Java字节byte操作,处理Java基本数据的转换及进制转换操作工具,流媒体及java底层开发项目常用工具类
    基于java.util.logging实现轻量级日志记录库(增加根据当前类class初始化,修复线程池模型(javaEE)下的堆栈轨迹顺序与当前调用方法不一致问题)
    java原生实现屏幕设备遍历和屏幕采集(捕获)等功能
    用java实现简单快速的webservice客户端/数据采集器(支持soap1.1和soap1.2标准,支持utf-8编码)
    javacpp-opencv图像处理3:使用opencv原生方法遍历摄像头设备及调用(增加实时帧率计算方法)
    mybatis批量增、删、改(更新)操作oracle和mysql批量写法小记
  • 原文地址:https://www.cnblogs.com/z45281625/p/10036849.html
Copyright © 2011-2022 走看看