Vue2、Vue3、小程序页面生命周期详解

本篇将对比 Vue2、Vue3 以及小程序页面/组件的生命周期,简单梳理各自特点、差异、新增优化点。


Vue2 生命周期

beforeCreate → created → beforeMount → mounted → beforeUpdate → updated → beforeDestroy → destroyed

说明:

生命周期钩子 含义
beforeCreate 实例初始化之前,数据未挂载
created 实例创建完成,data 可访问
beforeMount 挂载前,$el 和模板已生成但未插入 DOM
mounted 挂载完成,DOM 可访问
beforeUpdate 数据更新前触发
updated 数据更新后触发(更新 DOM 后)
beforeDestroy 实例销毁前,可做清理工作
destroyed 实例销毁后

示例:

export default {
data() {
return { count: 0 }
},
created() {
console.log('组件创建完成')
},
mounted() {
console.log('DOM已挂载')
}
}

Vue3 生命周期

Vue3 提供了与 Vue2 一致的生命周期概念,并新增组合式 API 的方式定义。

组合式 API 写法

import { onMounted, onUpdated, onUnmounted } from 'vue';

export default {
setup() {
onMounted(() => {
console.log('Vue3 组件挂载')
});
}
}

Vue3 生命周期钩子对比:

Vue2 Vue3 Options API Vue3 Composition API
beforeCreate beforeCreate setup() 中逻辑
created created setup() 中逻辑
beforeMount beforeMount onBeforeMount
mounted mounted onMounted
beforeUpdate beforeUpdate onBeforeUpdate
updated updated onUpdated
beforeDestroy beforeUnmount onBeforeUnmount
destroyed unmounted onUnmounted

Vue 3 新特性与优势

  1. Composition API(组合式API)

    • 把零散的代码逻辑按功能打包成「积木块」,想用哪块插哪块,告别满屏乱跳的 datamethods

    • 示例代码

      <script setup>
      // 以前:data、methods、computed 散落各处
      // 现在:按功能聚合
      import { ref, computed } from 'vue' // 计数器逻辑打包成一个「积木块」
      function useCounter() {
      const count = ref(0)
      const double = computed(() => count.value * 2)
      const increment = () => count.value++
      return { count, double, increment }
      } // 直接插到组件里用
      const { count, double, increment } = useCounter()
      </script>
  2. 性能暴击(Proxy 取代 defineProperty)

    • Vue2 用「贴纸条」(Object.defineProperty)监听数据,Vue3 改用「监控摄像头」(Proxy),数组修改、对象新增属性再也不用手动 $set

    • 示例代码

      // Vue2:数组 push 需要特殊处理
      this.$set(this.list, index, newValue) // Vue3:直接莽,全自动监听
      const list = reactive([1, 2, 3])
      list.push(4) // 触发响应式更新
  3. 按需编译 + Tree Shaking

    • 打包时只带走真正用到的代码,比如不用 v-model 就不打包相关逻辑,项目体积瘦身 30%+。
  4. 碎片化组件(Fragment + Teleport)

    • 组件终于能像普通 HTML 一样写多个根标签(不用强行套 div),还能用 <Teleport> 把模态框「传送」到 body 根部,避免 CSS 层级问题。

    • 示例代码

      <template>
      <!-- 合法!多个根元素 -->
      <header>标题</header>
      <main>内容</main> <!-- 把弹窗传送到 body 末尾 -->
      <Teleport to="body">
      <div class="modal">我是全局弹窗</div>
      </Teleport>
      </template>
  5. TypeScript 原生支持

    • 代码提示精准到毛孔,类型检查直接内置,再也不用和 Vue.extend 斗智斗勇。

    • 示例代码

      interface User {
      id: number
      name: string
      } const user = ref<User>({ id: 1, name: '张三' }) // 类型安全!
  6. 其他实用武器库

    • Suspense:异步组件加载时显示 loading 状态(类似 React)。
    • 自定义渲染器:用 Vue 语法开发小程序/Canvas 应用。
    • Vite 加持:秒级热更新,告别 webpack 漫长等待。

Vue 组件相关生命周期

生命周期 含义
props 更新 Vue2 和 Vue3 均可监听 props 变化(通过 watch)
slot 渲染 在 mounted 后插槽内容可以访问
异步组件 Vue3 支持 defineAsyncComponent 封装异步组件

示例:异步组件

import { defineAsyncComponent } from 'vue';

const MyAsync = defineAsyncComponent(() => import('./MyComponent.vue'));

小程序生命周期

页面生命周期

onLoad → onShow → onReady → onHide → onUnload
生命周期 含义
onLoad 页面加载,接受参数
onShow 页面显示,类似 activated
onReady 页面初次渲染完成
onHide 页面隐藏
onUnload 页面卸载

组件生命周期

created → attached → ready → detached
生命周期 含义
created 组件实例刚创建
attached 节点插入页面 DOM
ready 组件布局完成
detached 节点从页面移除

示例:页面

Page({
onLoad(query) {
console.log('页面加载', query);
},
onReady() {
console.log('页面初次渲染完成');
}
})

示例:组件

Component({
lifetimes: {
created() {
console.log('组件创建');
},
ready() {
console.log('组件渲染完成');
}
}
})

总结对比

平台 生命周期粒度 特点
Vue2 清晰但耦合 生命周期集中在 Options 中
Vue3 更灵活 Composition API 更利于逻辑复用、类型支持更好
小程序 分页面/组件 生命周期更贴近原生环境,适合事件驱动模型

适配建议:

  • 如果要构建大规模应用,Vue3 推荐使用组合式 API 搭配 TypeScript;
  • 小程序推荐封装一层统一生命周期处理,方便复用;
  • Vue2 项目可以渐进迁移 Vue3,重构时可引入 Composition API。

推荐工具:

  • Vue3 Composition API 官方指南
  • 小程序开发者工具调试生命周期
  • Vueuse 处理常见生命周期逻辑

vue2&vue3&小程序简介的更多相关文章

  1. 入门系列(一) 微信小程序简介

    一.简介 1.目录结构 首先,我们使用微信公众平台提供的开发者工具,创建一个简单的小程序项目,观察项目的目录结构 不难看出,一个典型的微信小程序,通常包含一个描述整体的主体部分,以及一个描述页面的 p ...

  2. 微信小程序简介

    什么是微信小程序? 今年下半年的时候,微信推出了微信小程序,当然刚刚推出来的时候还是处于内测阶段,但是这并不影响这家伙的热度,也许这是一个新的时代的开启.但是什么是微信小程序呢?微信应用号是一个app ...

  3. 「小程序JAVA实战」微信小程序简介(一)

    转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-01/ 一直想学习小程序,苦于比较忙,加班比较多没时间,其实这都是理由,很多时候习惯了搬砖,习惯了固 ...

  4. Windows学习总结(11)——Windows批处理命令编写代码及小程序简介

    批处理(Batch)也称为批处理脚本.顾名思义,就是对某对象进行批量的处理.DOS批处理是基于DOS命令,用来自动地批量地执行DOS命令以实现特定操作的脚本.批处理是一种简化的脚本语言,它应用于DOS ...

  5. 微信小程序-简介

    微信小程序定位 1. 不需要下载安装即可使用 2. 用户用完即走,不用关系是否安装太多应用 3. 应用无处不在,随时可用 # 不要安装可使用是个伪命题,因为小程序的安装包小于1M,下载安装到使用的过程 ...

  6. P2_小程序简介

    小程序与普通网页开发的区别 运行环境不同 网页运行在浏览器环境中 小程序运行在微信环境中 API 不同 由于运行环境的不同,所以小程序中,无法调用 DOM 和 BOM 的 API. 但是,小程序中可以 ...

  7. vue开发小程序简介

    开发环境搭建 nodejs 安装最新版的nodejs,同时安装cnpm包管理器 jdk1.8 apache-maven3.3.9 Intellij Idea2018 [后端开发工具] vscode[前 ...

  8. 微信小程序t填坑之旅一(接入)

    一.小程序简介 小程序是什么? 首先"程序"这两个字我们不陌生.看看你手机上的各个软件,那就是程序.平时的程序是直接跑在我们原生的操作系统上面的.小程序是间接跑在原生系统上的.因为 ...

  9. 微信小程序开发问题汇总

    前言 经过将近一个多月的开发,我们团队开发的微信小程序 "出发吧一起" 终于开发完成,现在的线上版本为 2.2.4-beta 版 本文档主要介绍该小程序在开发中所用到的技术,已经在 ...

  10. 零基础入门微信小程序开发

    注:本文来源于:<零基础入门微信小程序开发> 课程介绍 本达人课是一个系列入门教程,目标是从 0 开始带领读者上手实战,课程以微信小程序的核心概念作为主线,介绍配置文件.页面样式文件.Ja ...

随机推荐

  1. Spring AI 提交 PR 实战指南:避免常见坑

    今天,我们将简单地了解如何向 Spring AI 提交 PR(Pull Request).在这个过程中,有一些常见的坑需要大家注意和避免,特别是在 Git 操作方面.我们会重点关注提交信息的规范,如何 ...

  2. FOFA 图标哈希值大全

    FOFA 图标哈希值大全 服务 图标 哈希值 默认端口 Atlassian Crowd icon_hash="-1231308448" 8095 CouchDB icon_hash ...

  3. Q:查看服务器内存和cpu占用排名

    pid 表示进程 ID,cmd 表示进程命令行,%mem 表示进程占用内存百分比,%cpu 表示进程占用 CPU 百分比,--sort=-%mem 表示按照内存占用率从高到低排序. 1.内存占比排序 ...

  4. Q:Win10关闭内存压缩功能

    微软在Win10中就已经启用了内存压缩机制,在Win11当中继续了这一设定. 通过任务管理器查看. taskmgr ·通过命令行查看. 使用系统管理员权限,打开PowerShell,然后输入以下命令: ...

  5. Q:浏览器不能上网,但是可以ping通外网ip,dns配置也没问题(TCP/IP 无法建立传出连接)

    问题症状 每隔一段时间,浏览器不能访问外网,重启电脑又正常,重置网卡无效 可以ping通外网ip地址,可以ping通外网域名 ping不通外网端口端口 查看日志 每次出现不能上网情况时都会有至少两条T ...

  6. Q:su命令无法切换用户问题,密码正确可登录

    一.文件权限问题 查看文件权限: ll -a /bin/su /usr/bin/passwd 正确的结果为: 错误的结果为: suid和普通x执行权限 s:当普通用户使用su的时候,采用的是owner ...

  7. THUWC 之后到 2.9 的总结

    考试 题解还没来得及写. 还是出现没有得到预期得分的情况,有时是没有调试完成,有时是挂分. 但是从做题情况看来,做我熟悉的题目比方说偏数学和性质的一般没有劣势.但是在数据结构比较不熟练,技巧和 tri ...

  8. HT-018 Div3 构造 题解 [ 黄 ] [ 数学 ] [ 结论 ]

    构造:结论题,gcy数竞大佬tql%%%orz. 结论 先放结论:如果 \(x \bmod 4=2\) ,那么 \(x\) 无法被表示为 \(a^2-b^2\) 的形式:除此之外的其他数都可以. 证明 ...

  9. Thymeleaf 嵌套循环

    <label th:each="role:${roles}" class="check-box"> <input th:each=" ...

  10. 用于敏捷开发的最佳免费 UML 工具 2022

    Table of Contents  hide  1 最好的在线免费 UML图工具 2 免费的 UML Visual Paradigm 在线平台 3 其他福利 4 用于正式和大规模可视化建模的 Vis ...