
Vue 作为前端三大框架之一,凭借其简洁的 API 和优秀的性能深受开发者青睐。随着 Vue 3 的全面普及,基于 Proxy 的响应式系统、组合式 API 等特性为大型应用开发提供了更强大的支持。本文将从 Vue 3 的核心原理出发,详解组合式 API 的实战技巧,结合案例分析状态管理与路由设计,并提供可落地的性能优化方案,帮助开发者快速掌握 Vue 3 开发精髓。
Vue 3 的响应式系统是框架的核心,相比 Vue 2 有了根本性升级,其演进过程和核心差异如下:
版本 | 实现方式 | 核心局限 | 优化点 |
|---|---|---|---|
Vue 2 | Object.defineProperty | 无法监听数组索引变化、对象新增属性 | 需通过 $set 手动触发响应 |
Vue 3 | Proxy | 无上述局限,原生支持数组 / 对象动态变化 | 自动监听所有属性操作 |
响应式工作流程:

代码示例:
// Vue 3响应式核心实现(简化版)
function reactive(target) {
  return new Proxy(target, {
  get(target, key) {
  track(target, key); // 收集依赖
  return Reflect.get(target, key);
  },
  set(target, key, value) {
  Reflect.set(target, key, value);
  trigger(target, key); // 触发更新
  }
  });
}Vue 3 的虚拟 DOM 进行了重写,结合编译时优化,大幅提升渲染性能。其核心改进包括:
// 编译后带PatchFlag的VNode
createVNode('div', { id: 'app' }, \[
  createVNode('p', null, '静态文本', 1 /\* TEXT \*/),
  createVNode('p', null, ctx.message, 2 /\* PROPS \*/, \['message'])
])@click),避免每次渲染创建新函数导致的不必要更新。
Vue 3 的组件渲染流程可分为三个阶段,配合生命周期钩子形成完整闭环:

关键生命周期节点:
setup:组件初始化入口,替代 Vue 2 的created
onMounted:DOM 挂载完成后执行
onUpdated:组件更新完成后执行
onUnmounted:组件卸载时清理资源(如事件监听、定时器)
组合式 API 解决了选项式 API 在大型组件中逻辑分散的问题,两者核心差异对比:
维度 | 选项式 API | 组合式 API |
|---|---|---|
逻辑组织 | 按data/methods/computed拆分 | 按功能模块聚合相关逻辑 |
代码复用 | 依赖 mixin(易冲突) | 自定义组合函数(清晰可控) |
类型支持 | 需额外配置 | 原生支持 TypeScript |
示例:用户信息模块
\<!-- 组合式API:逻辑聚合 -->
\<script setup>
import { ref, onMounted } from 'vue'
// 状态
const user = ref(null)
const loading = ref(true)
// 方法
const fetchUser = async () => {
  loading.value = true
  user.value = await api.getUser()
  loading.value = false
}
// 生命周期
onMounted(fetchUser)
\</script>ref:用于基础类型(String/Number/Boolean),通过.value访问const count = ref(0)
count.value++ // 触发更新reactive:用于对象 / 数组,直接访问属性const user = reactive({ name: 'Vue' })
user.name = 'Vue 3' // 触发更新computed:计算属性,自动追踪依赖const fullName = computed(() => \`\${user.firstName} \${user.lastName}\`)watch:监听数据变化// 监听ref
watch(count, (newVal, oldVal) => { ... })
// 监听对象属性
watch(() => user.name, (newVal) => { ... })watchEffect:自动追踪依赖,无需指定监听源watchEffect(() => {
  // 自动监听user.name的变化
  console.log('Name changed:', user.name)
})onMounted + 清理副作用onMounted(() => {
  const timer = setInterval(updateData, 1000)
  // 组件卸载时清理
  onUnmounted(() => clearInterval(timer))
})自定义组合函数是代码复用的最佳实践,命名规范为useXxx,例如:
// useLocalStorage.js
import { ref, watchEffect } from 'vue'
export function useLocalStorage(key, defaultValue) {
  // 从localStorage读取初始值
  const value = ref(JSON.parse(localStorage.getItem(key)) || defaultValue)
  
  // 监听变化并同步到localStorage
  watchEffect(() => {
  localStorage.setItem(key, JSON.stringify(value.value))
  })
  
  return value
}组件中使用:
\<script setup>
import { useLocalStorage } from './useLocalStorage'
// 自动同步到localStorage的响应式状态
const theme = useLocalStorage('theme', 'light')
\</script>根据应用规模选择合适的状态管理方案:
reactive + provide/inject\<!-- 父组件提供状态 -->
\<script setup>
import { reactive, provide } from 'vue'
const store = reactive({ count: 0, increment: () => store.count++ })
provide('store', store)
\</script>
\<!-- 子组件注入状态 -->
\<script setup>
import { inject } from 'vue'
const store = inject('store')
\</script>// stores/cart.js
import { defineStore } from 'pinia'
export const useCartStore = defineStore('cart', {
  state: () => ({ items: \[] }),
  actions: {
  addItem(item) {
  this.items.push(item)
  }
  },
  getters: {
  totalPrice() {
  return this.items.reduce((sum, item) => sum + item.price, 0)
  }
  }
})Vue Router 4 专为 Vue 3 设计,支持组合式 API,核心功能包括:
// router/index.js
import { createRouter, createWebHistory } from 'vue-router'
const routes = \[
  { path: '/', component: () => import('@/views/Home.vue') },
  { path: '/user/:id', component: () => import('@/views/User.vue') }
]
const router = createRouter({
  history: createWebHistory(),
  routes
})\<script setup>
import { useRoute, useRouter } from 'vue-router'
const route = useRoute() // 当前路由信息
const router = useRouter() // 路由操作方法
// 获取路由参数
console.log(route.params.id)
// 编程式导航
const goBack = () => router.back()
\</script>// 全局前置守卫
router.beforeEach((to, from) => {
  // 未登录访问需要授权的页面时跳转登录页
  if (to.meta.requiresAuth && !isLogin()) {
  return '/login'
  }
})shallowRef/shallowReactive处理深层数据(仅监听顶层属性)
markRaw标记不需要响应式的对象(如第三方库实例)
key(推荐唯一 ID 而非索引)
vue-virtual-scroller)
\<KeepAlive>
  \<component :is="activeComponent" />
\</KeepAlive><KeepAlive>缓存不常变化的组件(如标签页内容)const HeavyComponent = defineAsyncComponent(() => 
  import('./HeavyComponent.vue')
)lodash-es替代lodash)
webpack-bundle-analyzer分析包体积

基于 Vue 3 + Pinia + Vue Router 实现的 Todo 应用,核心功能包括:
\<!-- TodoList.vue -->
\<script setup>
import { useTodoStore } from '@/stores/todo'
import { computed } from 'vue'
const todoStore = useTodoStore()
const currentFilter = ref('all')
// 基于筛选条件的计算属性
const filteredTodos = computed(() => {
  switch(currentFilter.value) {
  case 'done': return todoStore.todos.filter(t => t.done)
  case 'active': return todoStore.todos.filter(t => !t.done)
  default: return todoStore.todos
  }
})
\</script>computed缓存筛选结果
v-memo避免不必要更新
useLocalStorage组合函数同步数据
Vue 3 通过 Proxy 响应式系统、组合式 API 和编译时优化,为开发者提供了更强大、更灵活的开发体验。随着 Nuxt 3 的成熟和 Vue Compiler 的发展,Vue 生态将在服务端渲染、跨平台开发等领域持续突破。
建议开发者重点掌握:
通过官方文档(vuejs.org)和实战项目深入学习,可快速提升 Vue 3 开发能力。