03 Vue生命周期钩子 - 图1


一:生命周期图

1.官网原图


03 Vue生命周期钩子 - 图2

2.我理解的图


03 Vue生命周期钩子 - 图3

二:生命周期

钩子函数 描述
beforeCreate 创建Vue实例之前调用
created 创建Vue实例成功后调用(可以在此处发送异步请求后端数据)
beforeMount 渲染DOM之前调用
mounted 渲染DOM之后调用
beforeUpdate 重新渲染之前调用(数据更新等操作时,控制DOM重新渲染)
updated 重新渲染完成之后调用
beforeDestroy 销毁之前调用
destroyed 销毁之后调用

create


  1. let vm = new Vue()

mount


挂载,把div挂载到组件中
03 Vue生命周期钩子 - 图4

update


  1. let vm = new Vue({
  2. el: '#box',
  3. data: {
  4. isShow: true // 修改这个内容
  5. },
  6. methods: {
  7. handleClick() {
  8. console.log('我是根组件')
  9. }
  10. }
  11. })

1.bedoreCreate


2.created


3.beforeMount


4.mounted(用得最多)


这时候可以向后端发送数据了

5.beforeUpdate


6.updated


7.beforeDestroy


8.destroyed


组件销毁 - 给组件写一个定时器

  1. setTimeout() // 延迟3s干什么事
  2. setInterval() // 延迟3s干什么事

测试代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>生命周期</title>
  6. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="box">
  10. <child v-if="isShow"></child>
  11. <br>
  12. <button @click="terminate">删除子组件</button>
  13. <button @click="reborn">显示子组件</button>
  14. </div>
  15. </body>
  16. <script>
  17. Vue.component('child', {
  18. template: `
  19. <div>
  20. {{name}}
  21. <button @click="name='Darker1'">更新数据1</button>
  22. <button @click="name='Darker2'">更新数据2</button>
  23. </div>`,
  24. data() {
  25. return {
  26. name: 'Darker1',
  27. }
  28. },
  29. beforeCreate() {
  30. console.group('当前状态:beforeCreate')
  31. console.log('当前el状态:', this.$el)
  32. console.log('当前data状态:', this.$data)
  33. console.log('当前name状态:', this.name)
  34. },
  35. created() {
  36. console.group('当前状态:created')
  37. console.log('当前el状态:', this.$el)
  38. console.log('当前data状态:', this.$data)
  39. console.log('当前name状态:', this.name)
  40. },
  41. beforeMount() {
  42. console.group('当前状态:beforeMount')
  43. console.log('当前el状态:', this.$el)
  44. console.log('当前data状态:', this.$data)
  45. console.log('当前name状态:', this.name)
  46. },
  47. mounted() {
  48. console.group('当前状态:mounted')
  49. console.log('当前el状态:', this.$el)
  50. console.log('当前data状态:', this.$data)
  51. console.log('当前name状态:', this.name)
  52. //用的最多,向后端加载数据,创建定时器等
  53. console.log("页面已被vue实例渲染, data, methods已更新");
  54. console.log('mounted')
  55. this.t = setInterval(function () {
  56. console.log('daada')
  57. }, 3000)
  58. },
  59. beforeUpdate() {
  60. console.group('当前状态:beforeUpdate')
  61. console.log('当前el状态:', this.$el)
  62. console.log('当前data状态:', this.$data)
  63. console.log('当前name状态:', this.name)
  64. },
  65. updated() {
  66. console.group('当前状态:updated')
  67. console.log('当前el状态:', this.$el)
  68. console.log('当前data状态:', this.$data)
  69. console.log('当前name状态:', this.name)
  70. },
  71. beforeDestroy() {
  72. console.group('当前状态:beforeDestroy')
  73. console.log('当前el状态:', this.$el)
  74. console.log('当前data状态:', this.$data)
  75. console.log('当前name状态:', this.name)
  76. },
  77. destroyed() {
  78. console.group('当前状态:destroyed')
  79. console.log('当前el状态:', this.$el)
  80. console.log('当前data状态:', this.$data)
  81. console.log('当前name状态:', this.name)
  82. //组件销毁,清理定时器
  83. clearInterval(this.t)
  84. this.t = null
  85. console.log('destoryed')
  86. },
  87. })
  88. let vm = new Vue({
  89. el: '#box',
  90. data: {
  91. isShow: true
  92. },
  93. methods: {
  94. terminate() {
  95. this.isShow = false
  96. },
  97. reborn() {
  98. this.isShow = true
  99. }
  100. }
  101. })
  102. </script>
  103. </html>