Vue.js 生命周期详解:从创建到销毁的全过程

  💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

c5c2338b28e742a49cf5b6dc4547747c.gif

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
 

 

前言

在前端开发的世界里,Vue.js 因其简洁的 API 和高效的数据绑定特性而广受欢迎。Vue 实例的生命周期是 Vue.js 开发中的一个核心概念,它描述了从 Vue 实例的创建到销毁的整个过程。在这篇博客中,我将深入探讨 Vue 的生命周期,并通过示例代码展示如何在不同的生命周期钩子中执行代码,从而帮助大家在开发中更好地利用 Vue 的功能。

 

1. Vue 生命周期概述

Vue 实例的生命周期可以分为四个主要阶段:创建阶段挂载阶段更新阶段销毁阶段。每个阶段都伴随着特定的生命周期钩子,允许开发者在特定的时间点执行代码。

生命周期四个阶段:① 创建 ② 挂载 ③ 更新 ④ 销毁

3ef9bdda6cbc4b4d9d2d707239fab5ff.png

 

1.创建阶段:创建响应式数据

在创建阶段,Vue 实例被初始化,数据观测(reactive data observation)开始,但模板还未挂载,也未渲染到页面上。这个阶段有两个主要的生命周期钩子:

  • beforeCreate:在这个阶段,实例刚刚被初始化,数据观测和事件/侦听器的配置都还未开始。此时,你无法访问数据、计算属性、方法或监听器等。
  • created:在这个阶段,实例已完成数据观测、属性和方法的运算、watch/event 事件回调的配置。然而,挂载阶段还没开始,$el 属性目前不可见。这通常是你执行异步数据请求的最佳时机。
  • 代码:
    beforeCreate() {  
      console.log('beforeCreate 响应式数据准备好之前', this.count); // 输出:undefined  
    },  
    created() {  
      console.log('created 响应式数据准备好之后', this.count); // 输出:100  
      // 这里可以发起数据请求  
    },

     

2.挂载阶段:渲染模板

在挂载阶段,Vue 实例的模板被渲染到页面上,实例成为 DOM 树的一部分。这个阶段也有两个生命周期钩子:

  • beforeMount:在挂载开始之前被调用,相关的 render 函数首次被调用。此时模板编译完成,但尚未替换挂载点上的 HTML,所以此时页面上仍然显示的是旧的 DOM。
  • mounted:在 el 被新创建的 vm.el替换,并挂载到实例上去之后调用该钩子。如果根实例挂载了文档内元素,当mounted被调用时vm.el 也在文档内。这意味着你可以安全地操作 DOM 了。
beforeMount() {  
  console.log('beforeMount 模板渲染之前', document.querySelector('h3').innerHTML); // 输出:{{ title }}  
},  
mounted() {  
  console.log('mounted 模板渲染之后', document.querySelector('h3').innerHTML); // 输出:计数器  
  // 此时可以操作 DOM  
},

 

 

3.更新阶段:修改数据,更新视图

当 Vue 实例的数据变化时,Vue 将重新渲染 DOM 以匹配最新的数据。这个过程中也有两个生命周期钩子:

  • beforeUpdate:数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。
  • updated:由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用这个钩子。当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。但要避免更改状态,因为这可能会导致无限更新循环。
beforeUpdate() {  
  console.log('beforeUpdate 数据修改了,视图还没更新', document.querySelector('span').innerHTML); // 输出:100  
},  
updated() {  
  console.log('updated 数据修改了,视图已经更新', document.querySelector('span').innerHTML); // 更新后的数据  
},

4.销毁阶段:销毁Vue实例

在 Vue 实例销毁的过程中,会调用两个生命周期钩子:

  • beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。
  • destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

 

beforeDestroy() {  
  console.log('beforeDestroy, 卸载前');  
  // 清除定时器、事件监听器等  
},  
destroyed() {  
  console.log('destroyed,卸载后');  
},

 

 

2. Vue生命周期钩子

Vue生命周期过程中,会自动运行一些函数,被称为【生命周期钩子】→ 让开发者可以在【特定阶段】运行自己的代码

db38aa7c598943938ccb8921d6db3f5a.png

 

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>

  <div id="app">
    <h3>{{ title }}</h3>
    <div>
      <button @click="count--">-</button>
      <span>{{ count }}</span>
      <button @click="count++">+</button>
    </div>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        count: 100,
        title: '计数器'
      },
      // 1. 创建阶段(准备数据)
      beforeCreate () {
        console.log('beforeCreate 响应式数据准备好之前', this.count)
      },
      created () {
        console.log('created 响应式数据准备好之后', this.count)
        // this.数据名 = 请求回来的数据
        // 可以开始发送初始化渲染的请求了
      },

      // 2. 挂载阶段(渲染模板)
      beforeMount () {
        console.log('beforeMount 模板渲染之前', document.querySelector('h3').innerHTML)
      },
      mounted () {
        console.log('mounted 模板渲染之后', document.querySelector('h3').innerHTML)
        // 可以开始操作dom了
      },

      // 3. 更新阶段(修改数据 → 更新视图)
      beforeUpdate () {
        console.log('beforeUpdate 数据修改了,视图还没更新', document.querySelector('span').innerHTML)
      },
      updated () {
        console.log('updated 数据修改了,视图已经更新', document.querySelector('span').innerHTML)
      },

      // 4. 卸载阶段
      beforeDestroy () {
        console.log('beforeDestroy, 卸载前')
        console.log('清除掉一些Vue以外的资源占用,定时器,延时器...')
      },
      destroyed () {
        console.log('destroyed,卸载后')
      }
    })
  </script>
</body>
</html>

 

总结

Vue.js 的生命周期为开发者提供了在不同阶段执行代码的机会,从而让我们能够更灵活地控制 Vue 实例的行为。通过合理利用生命周期钩子,我们可以更好地组织代码,提高应用的性能和可维护性。希望这篇博客能帮助你更好地理解 Vue 的生命周期,并在实际开发中灵活运用

 

 

 

❤️❤️❤️小郑是普通学生水平,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

 

c5da5fff2816463981af4698a2cb53ad.gif

 

  • 33
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值