Vue 3 基础用法与和 Vue 2 的写法差异

太微2025-04-08前端VueVue3入门

Vue 3 基础用法与和 Vue 2 的写法差异

Vue 3 在保留 选项式 API(Options API) 的同时,引入 组合式 API(Composition API)<script setup> SFC 语法糖,并统一用 createApp 创建应用实例。下面先讲「Vue 3 怎么写」,再对照 Vue 2 说明写法上的区别新增模式,以及优缺点

1. 应用入口:从 new VuecreateApp

import { createApp } from "vue";
import App from "./App.vue";

createApp(App).mount("#app");
对比项Vue 2Vue 3
创建应用new Vue({ ... })createApp(...)
挂载vm.$mount("#app")elapp.mount("#app")
全局注册Vue.component / Vue.useapp.component / app.use

同一页可挂载多个应用,互不污染全局配置;插件与全局 API 挂在 app 实例上,而不是 Vue 构造函数。

2. 组合式 API:逻辑按「功能」组织

Vue 3 推荐用 setup(或 <script setup>)把「同一业务相关的状态与计算」写在一起,而不是按 data / methods / computed 拆开。

2.1 ref / reactive 与 Vue 2 的 data

  • ref:包装基本类型或对象;在模板里自动解包,在 setup 里要用 .value 读写(对象除外仍建议 .value 访问引用)。
  • reactive:返回对象的代理,适合「一组键值对象」;解构会丢失响应式,需 toRefsstoreToRefs(Pinia)等。

Vue 2 里 data 返回的对象经 Object.defineProperty 处理;Vue 3 用 Proxy新增/删除属性一般也能被追踪,不再依赖 Vue.set(老项目迁移时这点差异最大)。

2.2 computed / watch / watchEffect

写法从「选项里的函数」变为 computed(() => ...)watch(source, callback)watchEffect(() => ...)watchEffect自动收集依赖,适合「多个源一起变就执行」的场景。

2.3 生命周期:命名与调用方式

Vue 2(选项)Vue 3 组合式(setup 内)
beforeCreate / created直接在 setup 顶层写代码(无 beforeCreate 等价)
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeDestroyonBeforeUnmount
destroyedonUnmounted

销毁阶段在 Vue 3 中统一为 Unmount 语义。

3. <script setup>:当前默认的「新写法」

SFC 中,<script setup><script> 二选一(或搭配使用需遵循文档规则)。特点:

  • 顶层绑定(变量、函数、import)自动暴露给模板,无需 return
  • defineProps / defineEmits / defineExpose / defineOptions(Vue 3.3+)为编译期宏,无需 import
  • 类型友好:可与 TypeScript泛型 props 配合。

与 Vue 2 典型写法相比:少写 export default { ... } 一大坨选项props / emits 声明更贴近类型

4. 与 Vue 2 相比:写法对照简表

能力Vue 2 常见写法Vue 3 常见写法
组件状态data() { return { n: 0 } }const n = ref(0)reactive({ n: 0 })
方法methods: { inc() {} }顶层 function inc() {}const inc = () => {}
计算属性computed: { ... }computed(() => ...)
侦听watch: { a() {} }watch(() => a, ...)watchEffect
全局 APIVue.xxx具名导出:import { ... } from 'vue'(如 nextTick
过滤器 filter{{ msg | capitalize }}已移除,用 方法计算属性

5. Vue 3 新增或强化的「模式」与能力(节选)

  • 多根节点(Fragment):模板可有多个根节点,不必再包一层无意义 <div>
  • Teleport:把模态框、弹层挂载到 body 等任意 DOM 节点,避免层级嵌套问题。
  • Suspense(实验性):异步组件与「加载中占位」的协调写法。
  • v-memo / v-once:在特定场景下减少不必要的重渲染(需按文档使用)。
  • 多个 v-model:同一组件可绑定多个双向值,如 v-model:titlev-model:visible 等(对应 emit 更新)。
  • <script setup> + defineProps / defineEmits:声明式、类型友好的 props / 事件。

6. 优点

优点说明
组合式 API大型组件里逻辑可按功能聚合,复用用 composables(组合函数)比 mixin 更清晰
响应式模型Proxy 对对象增删、数组下标等更自然,心智负担小于 Vue 2 的 $set 场景
性能与体积更细粒度的更新、tree-shaking 友好,按 API 引入更易摇掉未用代码
TypeScript<script setup>、泛型 props 配合更好
生态官方推荐 Vite,开发体验与 Vue 3 配套成熟

7. 缺点与注意点

缺点 / 注意点说明
学习曲线需理解 ref/reactive解构丢失响应式setup 执行时机等
选项式仍可用团队可混用,但需约定规范,避免同一组件内风格分裂
破坏性变更过滤器移除、全局 API 变更、事件总线需用 mitt 等替代方案自行接入
浏览器若需支持 IE11,Vue 3 不支持,只能维持 Vue 2 或换技术栈

8. 小结

Last Updated 4/9/2026, 6:16:02 AM