学完Vue2真的能直接上手Vue3吗?还要补哪些核心技能?
身边最近转Vue3的朋友挺多的,有人上周刚搭好项目就写了俩页面,说没什么不一样;有人写了一天钩子用混,报错报得怀疑人生;还有人想用Composition API重构Vue2的老项目,结果越写越卡壳——明明都是Vue,怎么差距这么大?今天就聊透这个问题:学完Vue2到底能不能直接上手Vue3?上手前/上手过程中必须补的核心坑和核心技能,最后给一份不啰嗦的学习路径。
先给个准信:会不会用Options API直接上手写小项目?能!但大概率会慢半拍、踩一堆“没必要的小坑”
首先得明确,Vue3是完全向下兼容Vue2的Options API的——你把Vue2的代码原封不动(除了一些废弃API比如filters、$listeners这些)复制到Vue3项目里,改个入口文件挂载方式,就能直接跑起来,比如之前写过的TodoList,data、methods、computed、watch、mounted这些配置项,一个字不用改,甚至连组件通信的props/$emit/$attrs/$refs(ref组件的话用法稍微变了点,但还是能用字符串ref获取)都90%以上通用。
那为什么说会慢半拍、踩小坑?举几个上周刚听朋友吐槽的例子:
第一个,入口文件挂载错了,Vue2是new Vue({ el: '#app' })或者$mount('#app' ),Vue3得先从vue包里引入createApp,再createApp(App).use(router).use(pinia).mount('#app')——要是没注意这点,项目启动后页面会白屏半天,控制台也没个明确提示,新手很容易挠头;
第二个,v-for优先级没搞懂,Vue2里v-for的优先级比v-if高,但Vue3官方改了文档(但代码层面还是向下兼容,但生产环境可能会有警告),而且明确建议“永远不要把v-if和v-for放在同一个元素上”,之前Vue2养成的习惯,直接搬过来不仅看着乱,还可能被ESLint(Vue3的官方脚手架默认带更严格的规则)疯狂报错;
第三个,ref和reactive傻傻分不清,而且忘了解包,Vue2里ref就是个获取DOM/组件实例的属性,Vue3里ref既能存基本类型,又能存引用类型,但存基本类型的时候要通过.value访问,存引用类型虽然不需要,但用toRefs/toRef解构出来的单个属性又要——很多转过来的人要么忘了写.value导致数据不更新,要么滥用reactive存单个数字/字符串,平白增加代码复杂度;
第四个,废弃API没查清楚,比如Vue2常用的filters过滤器,Vue3直接废弃了,官方建议用computed或者methods代替;还有$on、$off、$once这些全局事件总线的方法,Vue3也给删了,得用mitt或者tiny-emitter第三方库;甚至连v-model的默认属性名和事件名,在原生组件上没变,但在自定义组件上从value/input改成了modelValue/update:modelValue——要是随便写个自定义Input组件,直接用props.value和this.$emit('input'),传参的时候用v-model="val",数据根本不会同步,得浪费不少时间排查。
所以结论是:如果只是用Vue2的Options API写一些逻辑不复杂的小项目,不用太补啥,花个10分钟看看入口文件、废弃API的小改动就能跑;但如果想真正用好Vue3,甚至重构老项目、做中大型企业级应用,那必须得把Composition API、响应式原理、新特性这些核心内容补扎实。
真正用好Vue3,必须补的5个核心技能
别听网上说的“Vue3就是多了几个钩子”——Composition API只是Vue3的“外衣”,真正的内核是Proxy的响应式原理、TypeScript的深度集成、更好的性能优化、组合式函数(Composables)的代码复用方式,还有SFC的新功能,下面一个一个说,每个技能都讲清楚“为什么要学”、“怎么快速学”、“学了有什么用”。
第一个:Composition API的核心用法(不是背钩子!是理解“按逻辑组织代码”的思想)
很多人学Composition API,一开始都是背“setup”、“ref”、“reactive”、“computed”、“watch”、“watchEffect”、“onMounted”这些钩子,但背完之后还是不知道怎么用——要么把所有代码都堆在setup里,比Options API还乱;要么滥用组合式函数,把一个简单的逻辑拆成五六个文件,维护起来更麻烦。
其实Composition API的核心不是钩子,是“按逻辑关注点组织代码”的思想——之前Options API是“按配置项组织代码”,比如一个TodoList的新增逻辑,data里写todoText、todos数组,methods里写addTodo,mounted里写从localStorage取数据,watch里写存数据到localStorage,这些逻辑散在好几个地方,要是项目大了,找一个逻辑得翻好几十行代码;而Composition API可以把新增Todo的所有逻辑(todoText的状态、addTodo的方法、localStorage的读写)都封装在一个叫useTodoList的组合式函数里,用的时候直接引入调用就行,代码一目了然,复用起来也特别方便。
那怎么快速学?别一开始就啃官方文档的底层原理,先找几个Vue2写的小项目(比如TodoList、购物车、登录注册页),用Composition API重构一遍: 第一步,先把Vue2的data里的基本类型改成ref,引用类型改成reactive,mounted改成onMounted,methods改成普通函数,computed和watch直接用setup里的同名钩子,这一步花个1-2天就能熟练; 第二步,把同一个逻辑的代码(比如登录页的表单验证、登录请求、token存储)抽成组合式函数,放在src/composables文件夹里,这一步能帮你理解“组合式函数”的真正意义; 第三步,学会用toRefs/toRef避免响应式丢失,用shallowRef/shallowReactive做性能优化,用watchEffect代替watch做自动依赖收集的逻辑——这些进阶用法不用一开始就会,但用的时候要知道查什么。
第二个:Proxy的响应式原理(不用啃源码!但要知道和Object.defineProperty的区别)
很多转Vue3的人觉得响应式原理不重要,反正数据更新页面就会变——其实知道响应式原理能帮你解决很多“莫名其妙的坑”,比如为什么Vue2里给对象新增属性、修改数组下标不会触发响应式更新?为什么Vue3里就可以?为什么Vue3里不用this.$set了?
Vue2的响应式原理是用Object.defineProperty的getter和setter来劫持数据的,但这个API有两个致命的缺点:一是只能劫持对象的已有属性,不能劫持新增属性和删除属性,所以得用this.$set和this.$delete;二是只能劫持数组的方法调用(push、pop、shift、unshift、splice、sort、reverse),不能劫持数组下标直接修改和数组长度直接修改,所以得用this.$set修改下标,或者用splice修改长度。
Vue3的响应式原理是用ES6的Proxy来劫持整个对象/数组的,Proxy可以劫持对象的所有操作:新增属性、删除属性、修改属性、访问属性、修改数组下标、修改数组长度,甚至可以劫持Map、Set、WeakMap、WeakSet这些ES6新增的数据结构——所以Vue3里不用this.$set了,直接修改就行。
那怎么快速学?不用啃Vue3的完整源码(如果想啃的话也可以,推荐先看简化版的响应式原理代码),只需要记住Proxy和Object.defineProperty的三个核心区别,再找几个例子验证一下就行: 第一个例子:Vue2里给对象新增属性,不用this.$set页面不会更新;Vue3里直接新增就行; 第二个例子:Vue2里修改数组下标,不用this.$set页面不会更新;Vue3里直接修改就行; 第三个例子:Vue2里不能劫持Map、Set;Vue3里可以直接用,数据更新页面就会变。
第三个:组合式函数(Composables)的封装技巧(这是Vue3代码复用的核心,比mixin强10倍)
很多Vue2的开发者喜欢用mixin做代码复用,但mixin有三个致命的缺点:一是命名冲突,多个mixin里有相同的data、methods、computed,后面的会覆盖前面的;二是来源不透明,用的时候不知道某个属性/方法是从哪个mixin里来的;三是难以维护,mixin多了之后,代码逻辑非常乱,重构起来特别麻烦。
Vue3的组合式函数(Composables)完美解决了mixin的这些问题:一是命名冲突可以通过返回值的重命名解决,比如const { todoText: addTodoText, addTodo: addNewTodo } = useTodoList();二是来源透明,用的时候直接看组合式函数的名字或者引入路径就知道;三是容易维护,每个组合式函数只负责一个逻辑,代码清晰,重构起来也方便。
那怎么快速学?先看官方文档里的几个例子(比如useMousePosition、useLocalStorage、useFetch),然后自己封装几个常用的组合式函数: 第一个:useLocalStorage,用来读写localStorage,支持响应式更新; 第二个:useMousePosition,用来获取鼠标的实时位置; 第三个:useDebounceRef,用来做输入框的防抖; 第四个:useFetch,用来封装网络请求,支持loading、error、data三个状态。
封装的时候要注意几个小技巧:一是组合式函数的名字要以use开头,这是官方约定的规范;二是组合式函数要返回一个对象或者数组,方便用户解构赋值;三是组合式函数里的副作用(比如定时器、事件监听、网络请求)要在onUnmounted里清理,避免内存泄漏;四是组合式函数要尽量保持纯函数的特性,尽量不要依赖外部的全局变量,最好通过参数传递。
第四个:TypeScript的深度集成(这是中大型企业级应用的标配)
Vue3从底层开始就是用TypeScript写的,所以对TypeScript的支持非常好——Vue2虽然也支持TypeScript,但要加很多装饰器(Component、@Prop、@Watch),代码写起来非常臃肿,而且类型推断也不完美;Vue3不用装饰器,直接用TypeScript的原生语法就能写,类型推断也非常精准。
很多转Vue3的人觉得TypeScript难,不想学——其实不用学完整的TypeScript,只需要学Vue3里常用的几个语法就行: 第一个:类型注解,给变量、函数参数、函数返回值加类型; 第二个:接口(Interface),用来定义对象的类型,比如props的类型; 第三个:泛型(Generic),用来定义可复用的类型,比如ref、reactive、useFetch的类型; 第四个:类型断言(Type Assertion),用来告诉编译器“我比你更懂这个变量的类型”; 第五个:可选链(Optional Chaining)和空值合并运算符(Nullish Coalescing Operator),虽然这是ES6+的语法,但在Vue3和TypeScript里用得非常多。
那怎么快速学?先找几个Vue3+TypeScript的小项目练手,比如官方的Vue3+TypeScript TodoList;然后把自己之前用Vue3写的小项目改成TypeScript版本;最后学一下Vue3官方推荐的defineProps、defineEmits、defineExpose这三个宏的TypeScript用法——这三个宏是Vue3 SFC里专门用来定义props、emits、暴露给父组件的属性/方法的,不用引入,直接用就行,类型推断也非常完美。
第五个:Vue3的性能优化技巧(不用太深入,但要知道常用的几个)
Vue3的性能本身就比Vue2好很多——比如Proxy的响应式原理比Object.defineProperty快,编译时的静态提升、PatchFlag、缓存事件处理器这些优化,让Vue3的渲染速度提高了2-3倍,打包体积也减少了40%左右,但如果项目特别大,还是需要做一些手动的性能优化的。
常用的几个Vue3性能优化技巧: 第一个:用shallowRef/shallowReactive做浅层响应式,比如不需要深层响应式的大对象、大数组; 第二个:用readonly做只读响应式,比如不需要修改的props、从服务器获取的数据; 第三个:用computed做计算属性的缓存,避免重复计算; 第四个:用v-once做只渲染一次的内容,比如静态的标题、图片; 第五个:用v-memo做记忆化渲染,比如列表里的固定项; 第六个:用defineAsyncComponent做异步组件,比如路由懒加载、大型组件的按需加载; 第七个:用keep-alive做组件缓存,比如Tab栏切换的页面; 第八个:用Tree Shaking移除没用的代码,比如只引入Vue3的Composition API,不引入Options API(不过官方脚手架默认是全部引入的,需要自己配置)。
这些性能优化技巧不用一开始就全用上,项目开发完之后可以用Vue DevTools的Performance面板测一下,找到性能瓶颈之后再针对性地优化——比如如果列表渲染慢,可以试试v-memo或者虚拟列表;如果大对象响应式更新慢,可以试试shallowReactive。
最后给一份不啰嗦的Vue2转Vue3学习路径
- 入门阶段(1-2天):看Vue3官方文档的“快速上手”和“基础”部分,了解入口文件的挂载方式、废弃API的小改动、v-for和v-if的优先级、ref组件的用法;
- 进阶阶段(3-5天):学Composition API的核心用法,找几个Vue2写的小项目用Composition API重构一遍,学会用toRefs/toRef避免响应式丢失;
- 提升阶段(5-7天):学Proxy的响应式原理、组合式函数的封装技巧、Vue3+TypeScript的基础用法,自己封装几个常用的组合式函数;
- 精通阶段(7-14天):学Vue3的性能优化技巧、SFC的新功能(比如
<script setup>、<style scoped>的深层选择器、Teleport、Suspense)、路由Vue Router 4.x和状态管理Pinia的用法(Pinia比Vuex 4.x简单很多,官方推荐用Pinia); - 实战阶段(不限时间):找一个中大型的项目练手,比如电商后台管理系统、社交平台、博客系统,用Vue3+TypeScript+Pinia+Vue Router 4.x+Vite(Vite比Webpack快很多,官方推荐用Vite)开发。
总结一下
学完Vue2能不能直接上手Vue3?能,但只是用Options API写小项目;如果想真正用好Vue3,必须补Composition API的核心思想、Proxy的响应式原理、组合式函数的封装技巧、TypeScript的深度集成、Vue3的性能优化技巧这5个核心技能,学习的最好方式是实战——别只看文档,要多写代码,多踩坑,多总结。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网

