FE-10-Vue 3 进阶:响应式原理、Composition API 与性能
本节目标:深入理解 Vue 3 的响应式系统(Proxy vs defineProperty)、Composition API、生命周期、性能优化。
1. Vue 3 vs Vue 2
| 特性 | Vue 2 | Vue 3 |
|---|---|---|
| 响应式实现 | Object.defineProperty |
Proxy |
| API 风格 | Options API 为主 | Composition API + Options |
| TypeScript | 凑合 | 一流 |
| 包大小 | 较大 | Tree-shakable,按需引入 |
| Fragment | 不支持 | 支持(多根节点) |
| Teleport | 第三方 | 内置 |
| Suspense | 无 | 内置 |
| 性能 | 一般 | 1.3-2x 提升 |
2. 响应式原理:Proxy
2.1 Vue 2 的痛点
1 | // Vue 2 用 Object.defineProperty |
问题:
- 不能监听新增/删除属性(要
Vue.set/Vue.delete) - 不能监听数组下标(要重写 7 个方法)
- 初始化时遍历所有属性,大对象慢
2.2 Vue 3 的 Proxy
1 | // Vue 3 用 Proxy |
优势:
- 监听新增/删除属性自然支持
- 数组下标、length 变化都监听
- 懒代理(访问时才包装)
2.3 依赖收集与派发
1 | render() 被调用 |
3. Composition API
核心组合式函数:ref、reactive、computed、watch、watchEffect、生命周期钩子。
3.1 ref
1 | import { ref } from 'vue'; |
3.2 reactive
1 | import { reactive } from 'vue'; |
ref vs reactive 选型:
- 基本类型:
ref - 对象:
reactive(更直观) - 混合:都可以,看团队习惯
3.3 computed
1 | import { ref, computed } from 'vue'; |
computed vs methods:
computed:有缓存,依赖不变就不重新算methods:每次调用都执行
3.4 watch
1 | import { ref, watch } from 'vue'; |
3.5 watchEffect
自动收集依赖:
1 | import { watchEffect } from 'vue'; |
watch vs watchEffect:
watch:显式指定依赖watchEffect:自动收集
3.6 生命周期
1 | import { onMounted, onUpdated, onUnmounted, onBeforeMount, onBeforeUnmount } from 'vue'; |
Vue 3 生命周期对照:
| Vue 2 | Vue 3 |
|---|---|
| beforeCreate | (无,setup 是替代) |
| created | (无,setup 是替代) |
| beforeMount | onBeforeMount |
| mounted | onMounted |
| beforeUpdate | onBeforeUpdate |
| updated | onUpdated |
| beforeDestroy | onBeforeUnmount |
| destroyed | onUnmounted |
| errorCaptured | onErrorCaptured |
Composition API 用 onXxx 注册,必须在 setup 同步执行。
4. 组件通信
4.1 Props / Emits
1 | // 父 |
4.2 Provide / Inject
跨层级传值(替代 Event Bus):
1 | // 祖先 |
最佳实践:用 Symbol 作 key 避免冲突 + provide 类型
1 | // keys.ts |
4.3 v-model 升级
Vue 3 的 v-model 拆解:
1 | <!-- 父 --> |
多 v-model:
1 | <Form v-model:title="title" v-model:body="body" /> |
5. 性能优化
5.1 v-memo(Vue 3.2+)
模板片段记忆化:
1 | <div v-for="item in list" :key="item.id" v-memo="[item.id, item.selected]"> |
5.2 shallowRef / shallowReactive
只对顶层响应,深层不包装:
1 | import { shallowRef, shallowReactive } from 'vue'; |
5.3 markRaw
标记对象永远不响应:
1 | import { reactive, markRaw } from 'vue'; |
5.4 组件定义
1 | // 同步引入(默认) |
5.5 列表渲染
1 | <!-- ✓ 稳定的 key --> |
5.6 computed 缓存
1 | // ✓ 缓存:依赖不变不重算 |
6. Suspense(异步组件)
1 | <template> |
配合 async setup:
1 | // UserProfile.vue |
7. Teleport(传送门)
把组件渲染到 DOM 任意位置:
1 | <template> |
用途:Modal、Toast、Tooltip 等浮层。
8. 自定义指令
1 | // v-focus |
9. 状态管理 Pinia
1 | npm install pinia |
1 | // stores/user.ts |
10. 服务端渲染(Nuxt 3)
1 | npx nuxi@latest init my-nuxt-app |
1 | <!-- pages/index.vue --> |
Nuxt 3 优势:
- 默认 SSR
- 文件路由
- 自动 import
- 集成 server(server/api/)
11. Vue 3 生态推荐(2026)
| 类别 | 推荐 |
|---|---|
| 全栈框架 | Nuxt 3 |
| 状态管理 | Pinia(官方) |
| UI 组件 | Element Plus、Naive UI、Vuetify |
| 表单 | VeeValidate 4 + Yup/Zod |
| 路由 | Vue Router 4(默认) |
| 测试 | Vitest + Vue Test Utils |
| 构建 | Vite(默认) |
| 静态站点 | VitePress / Nuxt Content |
小结
| 概念 | 关键点 |
|---|---|
| 响应式 | Proxy + 依赖收集(effect) |
| Composition | ref/reactive/computed/watch |
| 生命周期 | onXxx 钩子,setup 同步注册 |
| 性能 | v-memo、shallowRef、markRaw |
| 全栈 | Nuxt 3(首选) |
| 状态 | Pinia(替代 Vuex) |
Vue 3 选型建议:
- 已有 Vue 2 项目:升级到 Vue 3(Composition API 兼容层)
- 新项目:Vue 3 + Vite + Pinia + Element Plus
- 全栈:Nuxt 3
- 文档站:VitePress
下一节讲状态管理:Redux / Zustand / Pinia / MobX 对比。
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/09/22/FE-10-Vue3进阶:响应式与Composition/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!