vue2&vue3&小程序简介
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 新特性与优势
Composition API(组合式API)
把零散的代码逻辑按功能打包成「积木块」,想用哪块插哪块,告别满屏乱跳的
data和methods。示例代码:
<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>
性能暴击(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) // 触发响应式更新
按需编译 + Tree Shaking
- 打包时只带走真正用到的代码,比如不用
v-model就不打包相关逻辑,项目体积瘦身 30%+。
- 打包时只带走真正用到的代码,比如不用
碎片化组件(Fragment + Teleport)
组件终于能像普通 HTML 一样写多个根标签(不用强行套
div),还能用<Teleport>把模态框「传送」到body根部,避免 CSS 层级问题。示例代码:
<template>
<!-- 合法!多个根元素 -->
<header>标题</header>
<main>内容</main> <!-- 把弹窗传送到 body 末尾 -->
<Teleport to="body">
<div class="modal">我是全局弹窗</div>
</Teleport>
</template>
TypeScript 原生支持
代码提示精准到毛孔,类型检查直接内置,再也不用和
Vue.extend斗智斗勇。示例代码:
interface User {
id: number
name: string
} const user = ref<User>({ id: 1, name: '张三' }) // 类型安全!
其他实用武器库
- 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.目录结构 首先,我们使用微信公众平台提供的开发者工具,创建一个简单的小程序项目,观察项目的目录结构 不难看出,一个典型的微信小程序,通常包含一个描述整体的主体部分,以及一个描述页面的 p ...
- 微信小程序简介
什么是微信小程序? 今年下半年的时候,微信推出了微信小程序,当然刚刚推出来的时候还是处于内测阶段,但是这并不影响这家伙的热度,也许这是一个新的时代的开启.但是什么是微信小程序呢?微信应用号是一个app ...
- 「小程序JAVA实战」微信小程序简介(一)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-01/ 一直想学习小程序,苦于比较忙,加班比较多没时间,其实这都是理由,很多时候习惯了搬砖,习惯了固 ...
- Windows学习总结(11)——Windows批处理命令编写代码及小程序简介
批处理(Batch)也称为批处理脚本.顾名思义,就是对某对象进行批量的处理.DOS批处理是基于DOS命令,用来自动地批量地执行DOS命令以实现特定操作的脚本.批处理是一种简化的脚本语言,它应用于DOS ...
- 微信小程序-简介
微信小程序定位 1. 不需要下载安装即可使用 2. 用户用完即走,不用关系是否安装太多应用 3. 应用无处不在,随时可用 # 不要安装可使用是个伪命题,因为小程序的安装包小于1M,下载安装到使用的过程 ...
- P2_小程序简介
小程序与普通网页开发的区别 运行环境不同 网页运行在浏览器环境中 小程序运行在微信环境中 API 不同 由于运行环境的不同,所以小程序中,无法调用 DOM 和 BOM 的 API. 但是,小程序中可以 ...
- vue开发小程序简介
开发环境搭建 nodejs 安装最新版的nodejs,同时安装cnpm包管理器 jdk1.8 apache-maven3.3.9 Intellij Idea2018 [后端开发工具] vscode[前 ...
- 微信小程序t填坑之旅一(接入)
一.小程序简介 小程序是什么? 首先"程序"这两个字我们不陌生.看看你手机上的各个软件,那就是程序.平时的程序是直接跑在我们原生的操作系统上面的.小程序是间接跑在原生系统上的.因为 ...
- 微信小程序开发问题汇总
前言 经过将近一个多月的开发,我们团队开发的微信小程序 "出发吧一起" 终于开发完成,现在的线上版本为 2.2.4-beta 版 本文档主要介绍该小程序在开发中所用到的技术,已经在 ...
- 零基础入门微信小程序开发
注:本文来源于:<零基础入门微信小程序开发> 课程介绍 本达人课是一个系列入门教程,目标是从 0 开始带领读者上手实战,课程以微信小程序的核心概念作为主线,介绍配置文件.页面样式文件.Ja ...
随机推荐
- C# 单例简单实例
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Li ...
- make学习
make学习,参考「Makefile 20分钟入门,简简单单,展示如何使用Makefile管理和编译C++代码」 程序见:https://github.com/ShiqiYu/CPP/tree/mai ...
- 在没有网关的IP地址上编写路由,实现另一个网段可以访问到该主机
应用场景:该主机两个网卡分别对应两个IP地址 192.168.1.2网段为医保网,并且主机使用了改网段的的网关.192.168.100.99网段地址为互联网地址,没有使用该网段的网关. 我们开发小组通 ...
- 使用xtrabackup对MySQL8.0.34进行备份和恢复
Percona XtraBackup 是一款开源的.用于 MySQL 和 MariaDB 的热备份工具,它可以在不停止数据库服务的情况下进行全量或增量备份,并且能够快速恢复数据.以下从特点.安装.备份 ...
- docker上安装并启动redis
//查看镜像 [root@VM-0-3-centos ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEredis latest cc69ae1 ...
- 解决tsc编译器版本过低问题
我们知道,tsc是TypeScript的编译器,可以将TypeScript脚本(.ts文件)编译为JavaScript脚本(.js文件).根据约定,TypeScript脚本文件使用.ts后缀名,Jav ...
- Clickhouse常见异常
一.异常 1)DB::Exception: Nested type Array(String) cannot be inside Nullable type (version 20.4.6.53 (o ...
- JUC并发—2.Thread源码分析及案例应用
大纲 1.什么是线程以及并发编程 2.微服务注册中心案例 3.以工作线程模式开启微服务的注册和心跳线程 4.微服务注册中心的服务注册功能 5.微服务注册中心的心跳续约功能 6.微服务的存活状态监控线程 ...
- Tensorflow 安装和测试(Anaconda4.7.10+windows10)
一. 软件下载 二. 配置相关 1. 修改 Jupyter notebook 默认工作路径 (1)打开 Anaconda Prompt ,输入 jupyter notebook --generate- ...
- 安装mysql报错5.7.13-Table 'mysql.user' doesn't existFor more information
临时写的一个小系统客户要求用mysql,所以下载一个来研究下.解压后开始配置my.ini 配置my.ini [mysql]# 设置mysql客户端默认字符集default-character-set= ...