Code前端首页关于Code前端联系我们

Vue3 学习&实战,这些关键问题你得搞懂

terry 2小时前 阅读数 4 #SEO
文章标签 Vue3;学习实战

Vue3 到底新在哪?适合现在学吗?

Vue3 是 Vue.js 框架的重大版本更新,核心在性能、开发体验、可维护性上做了升级,先看最直观的变化:

性能上,重写响应式系统(用 Proxy 代替 Object.defineProperty),能精准追踪数据变化,数组和对象新增属性也能响应;编译阶段做了静态提升、Patch Flags 等优化,渲染速度比 Vue2 快不少。

开发体验上,新增 Composition API(组合式 API),把零散逻辑按功能聚合,大项目复用、维护更方便;支持多根节点组件,不用额外套 div;模板语法更灵活,v-bind 缩写场景更丰富。

生态适配方面,主流 UI 库(Element Plus、Ant Design Vue 等)都基于 Vue3 重构,Vite 作为官方推荐工具链,启动和热更新速度碾压旧脚手架;状态管理工具 Pinia 替代 Vuex 成新宠,API 更简洁,天生支持组合式写法。

至于“适不适合现在学”:新手直接学 Vue3 没毛病,官方文档友好、生态成熟;Vue2 老用户建议逐步过渡(很多公司项目没全迁,但新项目基本用 Vue3),早学早占优势。

Composition API 和 Options API 该选哪个?

这俩是不同代码组织方式,得看项目场景和习惯:

Options API 是 Vue2 主流,把组件逻辑拆成 datamethodscomputed 等选项,好处是“新手友好”——结构清晰,小项目逻辑少时分层直观,但项目变大后,一个功能的逻辑可能分散在多个选项(比如表单验证,data 存字段、methods 写验证、watch 监听),维护时得来回翻代码,像“逻辑分散症”。

Composition API 是 Vue3 主推写法,用 setup 函数 + reactiveref 等函数,把同一功能逻辑打包成自定义 Hook,比如用户登录功能,把“账号密码状态、验证规则、登录方法”塞到 useLogin 函数里,其他组件能直接复用,对中大型项目、需逻辑复用的场景,可读性和可维护性直线上升,但刚接触得习惯“函数式”组织方式,初期理解成本稍高。

实际项目可灵活选:快速迭代小项目用 Options API 写得快;长期维护的复杂项目用 Composition API 更抗打,甚至很多项目混合用——老组件保留 Options,新组件用 Composition,过渡阶段常见。

Vue3 的响应式系统和 Vue2 有啥不一样?

Vue2 用 Object.defineProperty 劫持数据,Vue3 换成 ES6 的 Proxy,核心区别带来这些变化:

  1. 数据追踪颗粒度
    Vue2 里,对象新增/删除属性、数组直接改索引/长度,没法触发响应式更新,得用 $set/$delete 兜底;Vue3 用 Proxy 代理整个对象,不管对象、数组怎么操作,都能精准捕获,不用记“特殊情况”。

  2. 性能优化
    Vue2 初始化要递归遍历 data 所有对象,给每个属性加 getter/setter,数据层级深时初始化慢,Vue3 用 Proxy 代理整个对象,初始化时不递归,访问属性时再劫持(懒代理),大对象场景启动更快,更新时,Proxy 能精准知道哪些属性变了,减少不必要渲染。

  3. 语法层面影响
    Vue3 处理基础类型(字符串、数字等)得用 ref 包裹(变成响应式对象),对象/数组用 reactive 包裹,这和 Vue2 直接把基础类型丢 data 自动响应不同,所以得先理解 refreactive 区别,以及怎么解包(ref 在模板自动解包,setup 里要 .value)。

学 Vue3 前得先掌握哪些基础?

Vue3 是框架升级,不是推翻重来,基础前端知识和 Vue 核心思想得打牢:

  1. JS 基础+ES6+
    熟练掌握 let/const、箭头函数、解构赋值等 ES6 语法(Composition API 大量用函数式写法);理解 ProxyReflect 等 ES6 新特性(不用自己实现响应式,但得懂原理);掌握 async/await(项目里调接口、处理加载状态常用)。

  2. HTML+CSS 基本功
    组件模板是 HTML 扩展,得懂标签结构、属性绑定;CSS 要会基础布局、样式作用域(Vue3 里 scoped 样式和插槽、动态类名怎么配合),用 Sass/Less 得熟悉语法和配置。

  3. Vue2 核心概念(可选但建议了解)
    完全没接触过 Vue 也能学 Vue3,但懂 Vue2 响应式、组件通信(props/$emit)、生命周期,学 Composition API 时更容易对比理解,Vue2 的 created 对应 Vue3 onMounted 之前的逻辑,理解生命周期钩子变化更顺。

  4. 构建工具基础
    Vue3 项目主流用 Vite 初始化,得了解 Vite 基本配置(alias 路径别名、.env 环境变量)、依赖预构建;用 Webpack 迁移的项目,得懂 loaderplugin,但优先级没 Vite 高(Vite 更轻量化)。

Vue3 项目里怎么处理路由和状态管理?

路由和状态管理是中大型项目刚需,Vue3 生态有成熟方案:

路由:Vue Router 4.x

和 Vue3 深度整合,支持 Composition API,核心变化:

  • 路由配置支持 defineAsyncComponent 做异步加载,配合 Suspense 组件实现加载态更丝滑;
  • 新增 useRouteruseRoute 组合式函数,setup 里不用 this.$router,直接 import { useRouter } from 'vue-router' 再调用 router.push(...),更简洁;
  • 路由守卫可用组合式写法,比如组件内用 onBeforeRouteUpdate 监听路由更新,逻辑内聚性更强。

实际开发,配置路由和 Vue2 逻辑差不多:定义路由表、配置懒加载、处理嵌套路由,但写法更偏向函数式(动态路由匹配、参数传递等场景,用组合式 API 更顺手)。

状态管理:Pinia 替代 Vuex

Vuex 4.x 也支持 Vue3,但 Pinia 是官方推荐的新一代状态管理库,优势明显:

  • 语法更简洁:不用分 mutationsactionsgetters 三层,直接定义 stateactions(同步异步都能写)、getters,代码量少一半;
  • 天生支持 Composition API:Store 里能用 refcomputed,也能把 Store 逻辑拆成自定义 Hook 复用;
  • TypeScript 友好:类型推导自然,不用像 Vuex 写一堆泛型;
  • 体积更小:打包后比 Vuex 轻量,适合性能敏感项目。

举个场景:用户信息存储,用 Pinia 定义 useUserStorestateuserInfoactionsloginlogout 方法,组件里用 useUserStore() 拿到实例,直接调用方法或访问状态,比 Vuex 的 mapStatemapActions 简洁太多。

Vue3 的性能优化点体现在哪儿?

Vue3 从编译时、运行时、包体积多维度优化,开发和用户体验双提升:

编译阶段优化

  • 静态提升(Static Hoisting):模板里的静态元素(纯文本、不变标签)被提取到渲染函数外,每次渲染不再重复创建,减少内存开销。<div>固定文案</div><button @click="handle">按钮</button>,“固定文案”会被提升,只有按钮是动态节点。
  • Patch Flags:给动态节点打标记(比如类名变化标记为 1、文本变化标记为 2),渲染时只对比对应标记内容,减少 Diff 时间。
  • 缓存事件处理函数:模板里的 @click 等事件编译后会被缓存,避免每次渲染创建新函数,减少不必要更新。

运行时优化

  • 响应式系统重构Proxy 替代 Object.defineProperty 后,数据追踪更精准,无“新增属性不响应”坑;初始化时懒代理,大对象场景启动更快。
  • 渲染器优化:重构虚拟 DOM 渲染逻辑,静态节点跳过 Diff、动态节点按标记精准更新,整体渲染性能比 Vue2 提升近一倍(官方 benchmark 数据)。

包体积优化

  • Tree-shaking 友好:Composition API 是函数式导出,没用的 API 会被打包工具摇掉;Vue3 核心库拆分更细,reactivity 包可单独用于非 Vue 项目做响应式,按需引入减少体积。
  • 移除冗余 API:废弃 filter(推荐用 computed 或方法代替)、移除 $on/$off 等事件总线 API,减少核心库代码量。

用 Vue3 写组件有哪些新技巧?

组件是 Vue 开发核心,Vue3 给了不少新玩法:

多根节点组件(Fragment)

Vue2 组件必须单根节点,常套无意义 div,Vue3 支持多根节点,

<template>
  <header>头部</header>
  <main>主体</main>
  <footer>底部</footer>
</template>

更语义化,避免额外 DOM 层级,对 SEO 和样式布局友好。

Teleport(传送门)组件 渲染到任意 DOM 节点下,解决弹窗、通知等组件受父级样式(overflow: hiddenz-index)影响的问题,用法:

<template>
  <button @click="show = true">打开弹窗</button>
  <Teleport to="body">
    <div v-if="show" class="modal">我是弹窗,渲染到 body 下啦</div>
  </Teleport>
</template>

Suspense 组件(实验性但实用)

处理异步组件加载状态,不用手动管理 loading

<template>
  <Suspense>
    <template #default><AsyncComponent /></template>
    <template #fallback><div>加载中...</div></template>
  </Suspense>
</template>
<script setup>
const AsyncComponent = defineAsyncComponent(() => import('./AsyncComponent.vue'))
</script>

自动处理异步组件加载和错误捕获(配合 errorCaptured 钩子)。

自定义指令更灵活

Vue3 自定义指令钩子和组件生命周期对齐(如 bindbeforeMount),支持 Composition API,比如自动聚焦指令:

<script setup>
const vFocus = { mounted(el) { el.focus() } }
</script>
<template><input v-focus placeholder="自动聚焦" /></template>

生态工具(Vite、Pinia)和 Vue3 怎么配合?

Vue3 生态里,工具链和框架联动让开发体验起飞:

Vite + Vue3:极速开发体验

Vite 是 Vue 团队主推构建工具,和 Vue3 天生适配:

  • 冷启动快:不用像 Webpack 打包整个项目,秒级启动开发服务器;
  • 热更新(HMR)丝滑:修改组件只更新当前组件,保留状态,不用整页刷新;
  • 按需编译:用 ESModule 加载模块,只编译用到的代码,开发时性能拉满;
  • 配置简单vite.config.js 里配置 Vue 插件只需一行 import vue from '@vitejs/plugin-vue',比 Webpack 简洁太多。

npm create vite@latest 选 vue 模板,快速初始化 Vue3 + Vite 项目,搭配 ESLint、Prettier 做代码规范,开发流程顺畅。

Pinia + Vue3:轻量化状态管理

Pinia 是新一代状态管理库,和 Vue3 组合式 API 完美配合:

  • Store 里用 Composition API:在 Store 的 setup 函数里,用 refcomputed 定义状态和计算属性,用函数定义业务逻辑,和组件写法一致;
  • 跨组件逻辑复用:把 Store 逻辑拆成自定义 Hook,useCartStore 封装“添加购物车、计算总价”,其他组件 import 后直接用;
  • DevTools 支持:和 Vue DevTools 深度集成,能看状态变化时间线、调用栈,调试比 Vuex 方便。

UI 库适配:Element Plus、Naive UI 等

主流 UI 库都适配 Vue3,以 Element Plus 为例:

  • 组件写法支持 Composition API,setup 里用 ElMessage.success('成功')
  • 主题定制更灵活,Vite 下用 unocss 或自定义 SCSS 变量,快速改整套风格;
  • 组件内部用 Vue3 新特性重构,性能和可维护性比 Vue2 版本好很多。

Vue3 对 TypeScript 的支持好在哪?

Vue3 从架构层面做了 TypeScript 友好设计,写 TS 项目比 Vue2 舒服太多:

组件语法层面的类型推导

  • defineComponent 增强:自动推导 propsemits 类型。
    export default defineComponent({
    props: { title: String, count: { type: Number, required: true } },
    emits: ['change'],
    setup(props, { emit }) {
      // props.title 类型是 string | undefined,props.count 是 number
    }
    })
  • <script setup lang="ts"> 更丝滑:用 defineProps 定义 props,可结合接口:
    <script setup lang="ts">
    interface Props { title?: string; count: number }
    const props = defineProps<Props>()
    // props.title 类型是 string | undefined,props.count 是 number
    </script>

Composition API 的类型友好性

  • refreactive 自动推导ref<number>(0) 类型是 Ref<number>reactive({ count: 0 }) 推导成 { count: number } 的响应式对象;
  • 自定义 Hook 的类型传递:写 useCounter 这样的 Hook,返回值类型能清晰传递给调用者:
    export function useCounter(initial: number) {
    const count = ref(initial)
    const increment = () => count.value++
    return { count, increment }
    }
    // 组件里用:
    const { count, increment } = useCounter(10)
    // count 是 Ref<number>,increment 是 () => void,TS 精准提示

生态工具的 TS 支持

  • Vue Router 4.x:路由配置里的 pathcomponentparams 等有类型推导,避免路径拼写错误;
  • Pinia:Store 里的 stateactions 类型自动推导,调用时检查参数类型;
  • Vite:配置文件 vite.config.ts 用 TS 写,插件和环境变量类型提示完善,减少配置错误。

从 Vue2 迁移到 Vue3 要注意什么?

团队迁 Vue2 项目到 Vue3,得关注兼容性、代码改动、生态适配

兼容性处理

Vue3 提供兼容包 @vue/compat 帮助平滑迁移:

  1. 安装 @vue/compat,替换 package.json 里的 vue,并安装 vue-loader@^16.5.0(Webpack 项目);
  2. 项目保留 Vue2 写法(如 filter$on),逐步替换成 Vue3 语法;
  3. vue-eslint-plugin 检测过时语法,逐步整改。

代码层面的改动点

  • 生命周期钩子beforeDestroyonBeforeUnmountdestroyedonUnmounted,其他钩子前缀加 oncreated 对应 onCreated 除外,因 setupcreated 前执行,用 onMounted 等);
  • 全局 API 变化Vue.prototype.$xxxapp.config.globalProperties.xxxVue.directiveapp.directive
  • 过滤器(filter)废弃:用 computed 或方法代替,{{ message | uppercase }} 改成 {{ uppercase(message) }}
  • v-forv-if 优先级:Vue3 里同节点时 v-if 优先级更高(Vue2 是 v-for 更高),需检查逻辑是否正确。

生态工具的迁移

  • Vue Router:从 3.x 迁到 4.x,改路由模式(mode: 'history'history: createWebHistory())、路由

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门