飞道的博客

【vue2】vue生命周期的理解

419人阅读  评论(0)

🥳博       主:初映CY的前说(前端领域)

🌞个人信条:想要变成得到,中间还有做到!

🤘本文核心:vue生命周期的介绍、vue生命周期钩子函数详解,vue生命周期的执行顺序


目录

一、生命周期介绍

二、生命周期的构成

1. 生命周期的四个阶段 :

2.八大钩子作用:

1.beforeCreate():

2.created()

3.beforeMont()

4.monted()

5.beforeUpdata()

6.updated()

7.beforeDestroy()

8.destroyed()

三、执行顺序


一、生命周期介绍

概念:

即一个组件从创建到销毁的一个完整的过程

二、生命周期的构成

钩子概念: vue从创建到销毁过程中,会执行的一些回调函数

1. 生命周期的四个阶段 :

  •  初始化阶段:  beforeCreate、 created
  •  挂载阶段 : beforeMount、mounted
  •  更新阶段 : beforeUpdate、updated
  •  销毁阶段:  beforeDestroy、destroyed
执行顺序 钩子函数 执行时机
1 beforeCreate(){}

vue实例创建了,但是el和data还没有创建 (准备创建data)

底层(初始化vue实例,初始化钩子函数,初始化一些事件和侦听器配置项)

2 created() {}

data数据创建了,但是el挂载点还没有创建 (准备创建el)

底层:初始化data中的数据和methods中的方法

3 beforeMount() {}

el挂载点创建了,但是data数据还没有渲染(准备渲染中)

底层:创建el挂载点,并且生成虚拟DOM

4 mounted() {}

data数据 第一次 渲染完毕 (完成初始渲染)

底层:将虚拟dom渲染成真实DOM

5 beforeUpdate() {} 检测到data数据变化,但是还没有开始重新渲染 (data变了,准备重新渲染中) 会执行多次
6 updated() {} 变化后的data数据 ,完成渲染到页面 (完成重新渲染,会重复执行
7 beforeDestroy() {}

vue实例销毁即将销毁(解除data与el的关联),之后修改data,页面不会被渲染

底层 : 解除 事件绑定、侦听器、组件

8 destroyed() {}

vue实例已经销毁

2.八大钩子作用:

[前置准备]先创建一个空的vue文件,写入我们需要的素材


  
  1. <template>
  2. <div>
  3. <button @click=" name='李四' ">点我改名字 </button>
  4. <button @click="$destroy()">点我销毁 </button>
  5. <p>{{ name }} </p>
  6. <p>{{ age }} </p>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. data( ) {
  12. return {
  13. name: "张三",
  14. age: 20
  15. };
  16. }
  17. };
  18. </script>
  19. <style>
  20. </style>

上述文页面浏览效果如下:


1.beforeCreate():

  • vue实例创建了,但是el和data还没有创建 (准备创建data)
  • 底层(初始化vue实例,初始化钩子函数,初始化一些事件和侦听器配置项)

  
  1. /* 生命周期钩子 */
  2. // 1. beforeCreate() : 创建了vue实例,但是还没有创建data
  3. beforeCreate( ) {
  4. console. log( 1);
  5. console. log( this);
  6. console. log( this. name);
  7. }

写入beforeCreate页面效果查看:

我们是生成了初始的vue实例,但是我们存放在data中的数据没有取到

2.created()

  • 创建初始了data,但是还没有挂载
  • 经典应用 : 页面一加载, ajax请求数据渲染页面。一般写在这个钩子里面

  
  1. // 2.created() : 创建了data,但是还没有挂载
  2. /* 常用: 最早可以获取data的钩子, 一般在这个钩子发送ajax */
  3. created( ) {
  4. console. log( 2);
  5. console. log( this);
  6. console. log( this. name);
  7. console. log( this. $el);
  8. }

写入created页面效果查看:

此时我们存放在data中的数据被找到了 ,但是我们的挂载点没有被找到

3.beforeMont()

  • 创建挂载点,但是还没有把data挂载到el

  
  1. // 3.beforeMount() : 创建挂载点,但是还没有把data挂载到el
  2. beforeMount( ) {
  3. console. log( 3);
  4. console. log( this);
  5. // html环境,这个钩子$el可以获取挂载点。 脚手架环境, 这个钩子$el获取的是undefined
  6. console. log( this. $el);
  7. const p = document. querySelector( "p");
  8. console. log(p); //null 没有渲染,所以无法获取dom
  9. }

 写入beforeMont页面效果查看:

这一步是生成创建我们的挂载点 

4.monted()

  • 完成初始渲染。 把data数据渲染到挂载点el
  • 经典应用 : 一般常用于操作dom(页面一家在需要操作DOM在这个钩子上)

  
  1. mounted( ) {
  2. console. log( 4);
  3. console. log( this);
  4. console. log( this. $el);
  5. const p = document. querySelector( "p");
  6. console. log(p); // p标签 完成渲染
  7. }

  写入monted页面效果查看:

我们的挂载点创建成功,讲我们data中的数据存放进去并渲染成功啦!


经历了上述的四个阶段的操作现在我们完成了组件data中的被数据获取到页面渲染的整个流程,接下来的钩子是用于修改data数据与销毁我们的vue实例

5.beforeUpdata()

  •  检测到data数据发生变化,但是还没有更新el
  • 检测data数据变化, 修改虚拟DOM
  • 当有data数据改变 – 重复这个循环( beforeUpdata()与updated() )

 写入beforeUpdata页面效果查看:

 第一步:先在我们的vue中打一个debuddgr断点,防止我们走到updataed的位置


  
  1. beforeUpdate( ) {
  2. console. log( 5);
  3. console. log( this); // 获取的是变化后的数据, 但是页面还是显示之前的数据
  4. debugger
  5. }

第二步:我们现在在vuetools中修改data中的数据,当修改数据后面不变化!当我确定的时候会依旧变成张三。但是我们的内存中会显示出我们修改过的内容

 可以看到我们的vue实例对象中的name被我们成功的修改了,但是大家看右上角的张三,并没有被我们修成。

【再次验证】这是我们直接修改data中的数据,当我们点击 “点我改名字”这个按钮的时候也会出现

之后我们卡在这里了,当我们点击箭头的时候,我们的vue就更新了 

6.updated()

  • 更新之后的data,完成渲染
  • 完成data渲染(将虚拟DOM渲染成真实DOM)

  
  1. // 6.updated(): 更新之后的data,完成渲染
  2. updated( ) {
  3. console. log( 6);
  4. console. log( this);
  5. }

 写入updated页面效果查看:

显而易见当我们修改之后我们的数据马上就渲染到页面上了。实现了彻底更新的操作

7.beforeDestroy()

  •  正在销毁(接触data与el绑定、移除事件监听、移除侦听器)
      触发销毁钩子的两个条件 
      (1)对组件使用v-if
      (2)调用组件的 this.$destroy() 

 写入beforeDestroy页面效果查看:

我们的vue实例正在被销毁

8.destroyed()

  • 完成销毁

  
  1. //8.destroyed(): 完成销毁
  2. destroyed( ) {
  3. console. log( 8);
  4. console. log( this);
  5. }

   写入destroy页面效果查看:

至此我们的vue实例对象从出生创建到销毁喽

上述操作的源代码见下:

App.vue


  
  1. <template>
  2. <div>
  3. <button @click="name = '李四'">点我改名字 </button>
  4. <button @click="$destroy()">点我销毁 </button>
  5. <p>{{ name }} </p>
  6. <p>{{ age }} </p>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. data( ) {
  12. return {
  13. name: '张三',
  14. age: 20,
  15. }
  16. },
  17. /* 生命周期钩子 */
  18. // 1. beforeCreate() : 创建了vue实例,但是还没有创建data
  19. beforeCreate( ) {
  20. console. log( 1)
  21. console. log( this)
  22. console. log( this. name)
  23. },
  24. // 2.created() : 创建了data,但是还没有挂载
  25. /* 常用: 最早可以获取data的钩子, 一般在这个钩子发送ajax */
  26. created( ) {
  27. console. log( 2)
  28. console. log( this)
  29. console. log( this. name)
  30. console. log( this. $el)
  31. },
  32. // 3.beforeMount() : 创建挂载点,但是还没有把data挂载到el
  33. beforeMount( ) {
  34. console. log( 3)
  35. console. log( this)
  36. // html环境,这个钩子$el可以获取挂载点。 脚手架环境, 这个钩子$el获取的是undefined
  37. console. log( this. $el)
  38. const p = document. querySelector( 'p')
  39. console. log(p) //null 没有渲染,所以无法获取dom')
  40. },
  41. // 4.mounted() : 完成初始渲染。 把data数据渲染到挂载点el
  42. /* 常用: 最早可以操作DOM的钩子 */
  43. mounted( ) {
  44. console. log( 4)
  45. console. log( this)
  46. console. log( this. $el)
  47. const p = document. querySelector( 'p')
  48. console. log(p) // p标签 完成渲染
  49. },
  50. // 5.beforeUpdate() : 检测到data数据发生变化,但是还没有更新el
  51. beforeUpdate( ) {
  52. console. log( 5)
  53. console. log( this) // 获取的是变化后的数据, 但是页面还是显示之前的数据
  54. // eslint-disable-next-line no-debugger
  55. debugger
  56. },
  57. // 6.updated(): 更新之后的data,完成渲染
  58. updated( ) {
  59. console. log( 6)
  60. console. log( this)
  61. },
  62. // 7.beforeDestroy(): 正在销毁(接触data与el绑定、移除事件监听、移除侦听器)
  63. /*触发销毁钩子的两个条件
  64. (1)对组件使用v-if
  65. (2)调用组件的 this.$destroy()
  66. */
  67. beforeDestroy( ) {
  68. console. log( 7)
  69. console. log( this)
  70. // eslint-disable-next-line no-debugger
  71. },
  72. //8.destroyed(): 完成销毁
  73. destroyed( ) {
  74. console. log( 8)
  75. console. log( this)
  76. },
  77. }
  78. </script>
  79. <style>
  80. </style>

三、执行顺序

即按照我们介绍钩子函数的顺序依次往下执行

App.vue


  
  1. <template>
  2. <div>
  3. <!-- 导入子组件 -->
  4. <son> </son>
  5. </div>
  6. </template>
  7. <script>
  8. import son from '@/components/son.vue'
  9. export default {
  10. components: { son },
  11. /* 生命周期钩子 */
  12. // 1. beforeCreate() : 创建了vue实例,但是还没有创建data
  13. beforeCreate( ) {
  14. console. log( '父的beforeCreate')
  15. },
  16. // 2.created() : 创建了data,但是还没有挂载
  17. /* 常用: 最早可以获取data的钩子, 一般在这个钩子发送ajax */
  18. created( ) {
  19. console. log( '父的Created')
  20. },
  21. // 3.beforeMount() : 创建挂载点,但是还没有把data挂载到el
  22. beforeMount( ) {
  23. console. log( '父的beforeMount')
  24. },
  25. // 4.mounted() : 完成初始渲染。 把data数据渲染到挂载点el
  26. /* 常用: 最早可以操作DOM的钩子 */
  27. mounted( ) {
  28. console. log( '父的Mounted')
  29. },
  30. }
  31. </script>
  32. <style>
  33. </style>

 son.vue


  
  1. <!-- eslint-disable vue/multi-word-component-names -->
  2. <template>
  3. <div>
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. beforeCreate( ) {
  9. console. log( '子的beforeCreate')
  10. },
  11. // 2.created() : 创建了data,但是还没有挂载
  12. /* 常用: 最早可以获取data的钩子, 一般在这个钩子发送ajax */
  13. created( ) {
  14. console. log( '子的Created')
  15. },
  16. // 3.beforeMount() : 创建挂载点,但是还没有把data挂载到el
  17. beforeMount( ) {
  18. // html环境,这个钩子$el可以获取挂载点。 脚手架环境, 这个钩子$el获取的是undefined
  19. console. log( '子的beforeMount')
  20. },
  21. // 4.mounted() : 完成初始渲染。 把data数据渲染到挂载点el
  22. /* 常用: 最早可以操作DOM的钩子 */
  23. mounted( ) {
  24. console. log( '子的Mounted')
  25. },
  26. }
  27. </script>
  28. <style>
  29. </style>

 我们跑一下看下执行效果:

 发现是我们父元素先执行到beforeMont,随后等子渲染完成(执行子的mounted)最后讲父的mounted给执行,完成我们最终的渲染。虽然是有包含关系,但是执行流程是不变的。


转载:https://blog.csdn.net/m0_61118311/article/details/128714732
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场