
很多前端初学者在决定学习 Vue3 时第一反应是去 B 站搜教程。结果搜出来的内容“一半是 Vue2 老视频一半是只讲某个功能点的碎片化分享”真正能让人从零开始、系统走完整个学习路径的资料并不多。最近有一类标题特别吸引眼球“全 100 集”“一周从入门到精通”“学完即可就业”。很多人点进去的动机是“一周速成”但我想先给一个判断这套教程真正的价值不在于“一周精通”这个承诺而在于它用 100 集的体量把 Vue3 的学习路径完整地铺开了。零基础学 Vue3 最怕的不是资料少而是资料散今天看一个响应式原理明天看一个组件通信到真正写项目时才发现脑子里全是碎片。这篇文章会围绕 Vue3 的学习路径展开帮你拆解一套完整的零基础 Vue3 教程应该包含哪些模块每个模块学完之后你应该能做什么哪些知识点是面试高频点哪些坑是学习过程中一定会遇到的。如果你正准备学 Vue3或者已经在学习但总觉得“学完就忘”这篇文章值得收藏。1. 零基础学 Vue3 最常见的几个误区先聊聊误区因为很多人的学习节奏一开始就跑偏了。第一个误区是过度纠结版本。还在看 Vue2 的教程学了一半发现公司要的是 Vue3或者打开视频发现讲的是 Options API但 Vue3 生态里大家都在写 Composition API于是开始怀疑自己学错了方向。Vue2 到 Vue3 不是小修小补响应式原理、组合式逻辑复用、模板编译都发生了明显变化老教程里的很多写法在 Vue3 项目里并不推荐。第二个误区是只看不写。浏览器里打开别人的项目 demo觉得自己看懂了关上视频自己写一个页面就卡在ref和reactive怎么分配上。Vue3 的难点不在语法本身而在于把数据流、响应式依赖、生命周期这些概念串起来。看 10 遍不如自己写一遍。第三个误区是跳过工程化基础。有同学刚学会创建项目就直接跳到组件通信、动态路由结果连 Vite 的配置文件、npm脚本命令、node_modules安装失败这类基础问题都处理不了。前端开发到今天已经不是“写一个 HTML 文件”那么简单工程化基础是 Vue3 学习的前置条件。第四个误区是贪多嚼不烂。看到 100 集的标题有人觉得“太多了”有人觉得“太好了全都要”于是从第 1 集开始逐集看3 天之后停在第二十章然后放弃。这套教程真正合理的用法不是“全部看完”而是把它当作学习地图基础部分认真跟练项目实战部分重点突破已经懂的知识点直接跳过。回到那个核心问题这套教程适合谁我的判断是它适合三类人——完全没有接触过前端框架的纯新人、以前写过 Vue2 但想迁移到 Vue3 的开发者、以及即将参加前端面试但 Vue3 知识不成体系的求职者。三者对教程的使用方式完全不同后面会展开讲。2. Vue3 为什么值得学与 Vue2 的核心差异在开始学习之前先建立一个大背景Vue3 到底解决了 Vue2 的什么问题这个问题不仅是学习动机的来源也是面试必考点。2.1 响应式系统的重构Vue2 的响应式基于Object.defineProperty它的一个明显限制是新增属性、删除属性、通过下标修改数组元素都不能被自动侦测。开发者经常要调用Vue.set或this.$set手动处理。Vue3 改用 ES6 的Proxy可以拦截对象属性的读取、赋值、删除、遍历等操作新增属性和数组操作都能被响应式系统捕获。这次的改动是原理层面的所以“Vue3 为什么比 Vue2 响应式更强”会成为高频面试题。2.2 组合式 API 与逻辑复用Vue2 时代逻辑复用主要靠mixins但mixins有个让人头疼的问题多个mixins混入同一个组件后数据来源不清晰命名可能冲突逻辑被分散在不同部分。Vue3 的 Composition API 让同一个业务逻辑的相关代码可以组织在一起用setup函数或script setup语法把它们写在一块再封装成自定义 hook。这个变化不在表面的语法层面而在代码组织方式上。2.3 性能与包体积Vue3 的响应式代理、静态树提升、事件缓存等编译优化手段让它在组件更新时的性能表现比 Vue2 更好。同时Vue3 支持 tree-shaking核心运行时按需引入项目包体积更可控。2.4 工程生态的变化构建工具已经从 Webpack 主流切换到 Vite 主流。Vite 在开发环境下基于原生 ES Module冷启动速度和处理效率比传统打包工具高很多。学习 Vue3 时绕不开 Vite 的环境配置。一句话总结这部分的要点Vue3 的变化不是把 Vue2 换个皮肤而是从响应式内核到开发体验、到生态工具链的一次整体升级。学 Vue3 不等于学 Vue2 加一点新语法很多底层认知要重建。3. Vue3 基础概念与核心原理在动手之前先把几个最容易让新人困惑的概念讲清楚。这部分不需要背原理但需要建立正确的直觉。3.1 组合式 APIComposition APIVue3 仍然支持 Options API也就是 Vue2 里data、methods、computed、watch分块写的模式。但 Vue3 推荐的写法是 Composition API把所有与某个业务逻辑相关的响应式数据、计算属性、监听器放在一起。在 Vue3 项目中更常见的写法是script setup它让代码更简洁template div p{{ count }}/p button clickincrement加一/button /div /template script setup import { ref } from vue const count ref(0) function increment() { count.value } /scriptscript setup中定义的变量和函数可以直接在模板中使用不需要return。这个写法在大多数 Vue3 项目和 Vue3 面试题里都会出现。3.2 ref 与 reactive响应式数据的两种声明方式ref和reactive是 Vue3 里高频的响应式 API很多人一开始分不清它们的区别。ref主要用于包装基本类型值也可以接收对象但在 JavaScript 中访问时需要加.value模板中会自动解包所以模板里不用写.valueimport { ref } from vue const name ref(张三) const user ref({ age: 18 }) console.log(name.value) // 张三 console.log(user.value.age) // 18reactive只能接收对象包括数组和Map、Set等访问属性时直接使用不需要.valueimport { reactive } from vue const state reactive({ count: 0, list: [1, 2, 3] }) state.count state.list.push(4)实际项目中如何选择这不是死规则但一个比较容易理解的策略是场景推荐方式原因基本类型值如字符串、数字、布尔值ref响应式包装基本类型的天然方式对象嵌套层级深整体状态复杂reactive访问时不需要.value代码更简洁组合式函数中返回响应式数据ref不容易丢失响应式更加灵活需要替换整个对象内容ref使用value 新对象更方便很多 Vue3 面试提问“ref 和 reactive 的区别”回答的核心包括数据类型、访问方式、响应式原理、解构后是否丢失响应性。3.3 computed 与 watch派发与副作用computed用于根据已有数据派生出新数据它有缓存特性只有依赖变化时才会重新计算import { ref, computed } from vue const price ref(100) const quantity ref(2) const total computed(() price.value * quantity.value)watch用于侦测数据变化并执行副作用比如请求接口、写本地缓存、更新 DOM 以外的状态import { ref, watch } from vue const keyword ref() watch(keyword, (newValue, oldValue) { console.log(关键词从 ${oldValue} 变成了 ${newValue}) })这里有一个容易出错的地方computed内部不能有副作用比如修改别的响应式数据、发起异步请求都不应该出现在computed里。这是 Vue3 面试中经常出现的小陷阱。3.4 生命周期函数的变化Vue2 里的beforeCreate、created、beforeMount、mounted等生命周期在 Vue3 组合式 API 中有对应写法比如onMounted、onUpdated、onUnmountedimport { onMounted, onUnmounted } from vue onMounted(() { console.log(组件挂载完成) }) onUnmounted(() { console.log(组件卸载) })新手容易把onMounted写成mounted在script setup中这是无效的必须引入对应的生命周期函数。4. 环境准备从零创建第一个 Vue3 项目一套 100 集的零基础教程前面的内容一定是从环境搭建开始讲起。这部分的价值不是“能跑起来”而是解决工程化基础问题。4.1 安装 Node.jsVue3 项目依赖 Node.js 环境。安装完成后可以在命令行中验证node -v npm -v版本请以实际项目要求为准。如果安装后npm命令不可用需要检查系统环境变量中是否已经添加 Node.js 安装目录。这里有一个常见问题在 Windows 上安装 Node.js 后新版本通常会提示“自动添加到 PATH”但如果当时忽略了这一步就需要手动配置环境变量。4.2 使用 Vite 创建项目Vite 是 Vue3 官方推荐的构建工具。创建项目的命令在 Vue 官方文档中使用频率最高的是npm create vuelatest这个命令会创建一个基于 Vite 的 Vue3 项目过程中会询问是否安装 Vue Router、Pinia、ESLint 等插件。如果你是零基础建议先选择默认选项把基础项目跑通再逐步添加功能。输入命令后进入项目目录并安装依赖cd vue-project npm install如果npm install速度慢可以切换镜像源但这一步需要根据实际网络环境判断不能在文章中写死。4.3 项目目录结构创建完成的 Vue3 项目通常包含这些关键目录和文件路径作用src/main.js应用入口文件负责创建应用实例src/App.vue根组件src/components/子组件目录src/router/路由配置目录src/views/页面级组件目录src/stores/Pinia 状态管理目录vite.config.jsVite 配置文件package.json项目依赖与脚本管理4.4 运行项目在终端中执行npm run dev看到Local: http://localhost:5173/类似的输出后浏览器访问该地址即可看到 Vue 项目页面。端口号以实际输出为准有的项目会默认使用 5173如果被占用可能会跳到其他端口。这一步学完后你应该能回答的问题Vite 和 Webpack 有什么区别main.js里createApp(App).mount(#app)做了什么为什么npm run dev和npm run build执行的是不同的脚本如何在vite.config.js中配置开发服务器端口5. 100 集教程的核心知识地图从入门到项目实战这部分是对一套完整 Vue3 零基础教程的知识点拆解。你会看到一套合格的教程大概会把 100 集合里的内容分成哪几个阶段每个阶段结束后你应当具备什么能力。学习时可以把它当作检查单也可以用来规划自己的节奏。第一阶段Vue3 基础语法与模板指令这一阶段通常对应教程最前面的 20 集左右核心内容是对模板语法和数据绑定建立直觉插值表达式、v-bind、v-onv-if与v-show的区别v-for列表渲染以及为什么需要key事件处理、表单输入绑定v-model模板中的表达式和计算属性边界学完这个阶段你必须能够用 Vue3 写出一个纯前端的交互页面比如待办列表、购物车数量加减。可能遇到的问题v-model修改了对象里不存在的属性页面为什么不更新v-for里同时使用index作为key有什么隐患这两个问题都会在后续响应式原理部分得到解答。第二阶段组件化开发组件是 Vue 的核心抽象。这个阶段会围绕以下几点展开组件注册与引用props传入数据emit抛出事件插槽slot与具名插槽组件样式隔离scoped组件 v-model 的用法动态组件component :is...这是从“写页面”到“搭应用”的分水岭。学完这个阶段你需要能独立把一个页面拆成多个组件并梳理出它们之间的数据流关系。第三阶段Composition API 进阶与逻辑复用新人在这个阶段最容易出现“看不懂别人代码”的情况。核心内容包括setup函数与script setup语法ref、reactive、computed、watch、watchEffectprovide与inject跨层传值自定义 Hook组合式函数封装这个阶段要刻意养成“把同一业务逻辑代码放在一起”的思维方式。比如一个用户登录逻辑它的响应式变量和登录方法应该封装在同一个自定义 Hook 中而不是散落在多个methods里。第四阶段Vue Router 路由所有后台管理系统都离不开路由。这个阶段通常包含路由的基本配置与嵌套路由命名路由与编程式导航动态路由参数与路由传参路由守卫全局守卫、路由独享守卫、组件内守卫动态路由和权限控制动态路由在后台管理系统中尤其重要因为不同角色的用户可访问的页面不同。常见的做法是登录后获取用户权限再通过router.addRoute动态添加路由表。第五阶段Pinia 状态管理Vuex 仍然是面试中会提及的旧知识但新项目里更推荐 Pinia。核心内容Store 的定义与使用state、getters、actions在组件中使用 StoreStore 的模块化拆分持久化方案第六阶段前后端交互与综合项目实战学习框架的最终落脚点是能写出完整业务页面。这个阶段会涉及使用axios或fetch请求后端接口请求拦截器与响应拦截器登录流程与 Token 存储动态路由与权限菜单后台管理系统的用户、角色、菜单管理综合项目电商商城、后台管理系统、内容管理平台等如果你学完了基础和进阶部分却不能独立完成一个后台管理系统的登录 权限 列表 表单流程说明知识还没有被串成体系。6. 组件通信、路由与状态管理实战示例这一节提供一个最小但完整的实战示例把刚才提到的几个知识点串在一起组件通信、路由跳转、Pinia 状态管理。6.1 组件通信props 和 emit父子组件通信是最基础的场景。父组件通过props向下传数据子组件通过emit向上抛事件。父组件代码src/views/ParentView.vuetemplate div h3父组件/h3 p当前计数{{ count }}/p ChildComponent :countcount update:countcount $event / /div /template script setup import { ref } from vue import ChildComponent from /components/ChildComponent.vue const count ref(0) /script子组件代码src/components/ChildComponent.vuetemplate div p子组件接收到的计数{{ count }}/p button clickhandleIncrement通知父组件加一/button /div /template script setup import { defineProps, defineEmits } from vue const props defineProps({ count: { type: Number, default: 0 } }) const emit defineEmits([update:count]) function handleIncrement() { emit(update:count, props.count 1) } /script这个逻辑也可以用v-model:count语法简化但在学习阶段手动写props和emit更能理解数据流向。6.2 Vue Router 基本配置src/router/index.js中配置路由表import { createRouter, createWebHistory } from vue-router import HomeView from /views/HomeView.vue const router createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: [ { path: /, name: home, component: HomeView }, { path: /about, name: about, component: () import(/views/AboutView.vue) } ] }) export default router其中() import(...)是路由懒加载写法按需加载组件减少首屏请求体积。在后台管理系统中这条写法非常常见。6.3 Pinia 状态管理src/stores/counter.jsimport { defineStore } from pinia import { ref } from vue export const useCounterStore defineStore(counter, () { const count ref(0) function increment() { count.value } return { count, increment } })在组件中使用script setup import { useCounterStore } from /stores/counter const counter useCounterStore() /script template div p{{ counter.count }}/p button clickcounter.increment加一/button /div /templatePinia 的定义支持选项式和组合式两种写法。上面的组合式写法更贴近 Vue3 Composition API 风格也更清晰。7. 从学习到面试与就业高频 Vue3 面试知识点很多人的学习目标不只是“能写页面”还要能通过面试。一套合格的 Vue3 教程在讲完各个模块后通常会穿插面试环节的常见考点。这里根据前端面试热词和 Vue 生态常见问题梳理面试官经常追问的知识点。7.1 ref 与 reactive 的区别这个问题看似基础但面试官会继续追问对象被reactive包裹后解构出来的属性还有响应性吗ref接收对象时底层是使用reactive还是Object.defineProperty如果答到“ref内部处理对象时会调用reactive来转换”就已经超越了很多候选人。另一个更深的问题为什么reactive解构后响应式丢失因为解构后拿到的属性是原始值引用Proxy的拦截只对访问代理对象的属性生效解构出来的值已经脱离了代理对象。解决方案是使用toRefs或toRef。7.2 computed 与 watch 的区别高频考点包括computed有缓存watch没有缓存。computed是响应式依赖被修改后重新计算watch是侦测到数据变化后执行回调。computed里的函数不能有副作用。watch默认不执行设置immediate: true可以立即执行。watch监听深层对象时需要设置deep: true。7.3 Vue3 强制更新有热词问到“vue3 强制更新”。在 Vue3 中一般不需要强制更新因为响应式系统会自动追踪依赖。但如果因特殊原因需要强制重新渲染有几种常见思路使用reactive或ref的重新赋值。通过增加:key来让组件重新渲染。使用nextTick等待 DOM 更新后再操作。需要注意强制更新在项目中应该是罕见操作如果频繁遇到很可能说明状态设计有问题。7.4 路由跳转后页面不刷新有热词提到“vue3路由跳转不刷新页面”。这是个典型的 Vue Router 使用困惑同一组件复用时组件不会重新挂载。如果 A 页面跳到 B 页面B 页面又回到 A 页面而 A 组件已经实例化过数据可能还是旧的。解决方案包括在watch中监听route对象变化重新加载数据。使用onActivated配合keep-alive。如果业务要求每次进入页面都刷新可以用key强制重新渲染组件。7.5 Vue3 动态路由与权限后台管理系统面试题中“动态路由如何实现”几乎是必问用户登录后后端返回该用户的角色和权限标识。前端维护一张路由表例如一个asyncRoutes数组。根据权限过滤出用户可访问的路由调用router.addRoute动态加入。页面刷新后重新恢复路由否则刷新会跳到 404。这个流程涉及 Vue Router、Pinia、后端接口协同是一个很好考察综合能力的例子。7.6 组件库相关热词里有大量“组件库”相关搜索。Vue3 项目常用组件库包括 Element Plus、Ant Design Vue、Naive UI、Vuetify 等。在面试中常被问有没有用过 Element Plus 的表格、表单、弹窗如何自定义组件库的主题如何修改组件库内部样式例如 tabs 标签页样式修改第三方组件内部样式通常会用deep选择器。Vue3 中推荐写法是:deep()可以筛选到自己需要的层级。8. 学习过程中的常见问题与排查方案这一节把零基础学习者最常遇到的问题整理成表方便检索。问题现象可能原因排查方式解决方案npm run dev后浏览器访问页面空白路由模式、入口文件、模板语法错误打开浏览器控制台看报错根据报错定位组件或路由检查main.js是否正确挂载响应式数据更新但页面不刷新直接给reactive对象新增属性但没有通过赋值方式触发更新在控制台查看是否使用Proxy代理对象正确声明初始属性或使用Object.assign重新赋值模板中ref变量可用但 JS 中访问没有value写法不一致检查是否在模板外直接使用ref变量JS 中访问必须写.value模板中自动解包import组件后页面不渲染组件路径错误或组件名引用不一致查看控制台打印的警告检查import路径和文件名大小写修改组件库样式不生效组件样式被scoped隔离查看浏览器元素样式是否被覆盖使用:deep()穿透到组件内部样式路由跳转后页面数据是旧的组件被复用未重新加载数据在组件内打印生命周期钩子监听route变化或使用key强制重挂载npm install很慢或安装失败网络原因或镜像源问题检查 npm 日志更换镜像源但需以实际网络环境和团队规范为准动态权限路由刷新后 404路由表在刷新后丢失刷新后查看 Pinia 中是否还有权限数据在入口文件或路由守卫中重新拉取权限并动态添加路由这里想强调一个观念排查问题不是看运气而是需要一条固定的思路——先看控制台报错再定位组件或配置最后查文档或搜索。大部分 Vue3 初学者的报错都能在浏览器 DevTools 的 Console 面板中找到线索。9. 最佳实践与工程级建议当你能独立跑通一个小项目后需要从“能运行”向“工程规范”迈进。以下建议来自 Vue3 项目开发中的普遍经验。9.1 目录结构与命名规范推荐按业务模块组织组件和页面src/ api/ // 接口请求封装 assets/ // 静态资源 components/ // 公共组件 composables/ // 组合式函数 layouts/ // 布局组件 router/ // 路由配置 stores/ // Pinia store styles/ // 全局样式 utils/ // 工具函数 views/ // 页面组件组件文件名建议使用大驼峰UserCard.vue页面路由组件放在views目录下并保持路径清晰。9.2 请求层封装学习阶段可以直接在组件中调用axios但进入项目阶段后建议把请求逻辑统一封装到api模块中。将请求地址、请求方法、拦截器、错误处理集中管理避免多个组件各写各的请求逻辑。一个比较典型的做法是在请求封装中统一处理 Token 写入和 401 跳转逻辑业务组件中只关心成功后的数据。9.3 状态管理使用边界不是所有数据都应该放进 Pinia。组件内部自己使用的状态直接在组件中用ref管理多个组件共享的、页面刷新后需要保留的、涉及登录权限的数据才适合放进 Store。如果什么东西都往 Store 里塞项目状态会变得很难维护。9.4 性能优化Vue3 项目中的性能优化可以从几个层面考虑路由懒加载把页面级组件使用动态import。长列表使用v-memo但需要判断适用性。减少不必要的响应式数据对于不需要响应的常量不要用ref包裹。大型组件库按需引入避免全部引入导致包体积过大。组件库样式和全局样式的优先级冲突要提前约定。9.5 国际化与工程配置很多后台管理系统需要支持多语言。Vue3 项目通常使用 Vue I18n 实现国际化将文案抽离为语言包文件然后根据用户语言设置动态切换。国际化并不是简单替换文字还涉及日期格式、货币格式、目录命名等细节。9.6 动态路由的权限设计动态路由是后台管理系统绕不开的话题。建议流程是登录成功后保存 Token。在路由守卫中判断是否登录。根据用户权限标识过滤出可访问路由。使用router.addRoute动态注册。刷新页面时重新获取用户信息和权限。这个流程要配合后端接口设计不同项目的字段结构和权限模型不同需要根据实际需求调整。10. 关于学习节奏的最后建议回到标题所说的“一周从入门到精通”。作为学习规划这个时间线对零基础来说过于紧凑但我也不建议用“三个月才能学完”来吓退自己。更合理的思路是第 1 到 7 天完成基础语法、组件通信、ref/reactive/computed/watch的学习每天至少手写一个 demo。第 8 到 14 天学习 Vue Router、Pinia、登录流程和动态路由开始搭建后台管理系统。第 15 到 21 天完成一个综合项目把组件、路由、状态管理、接口请求全部串起来。第 22 到 30 天对照面试高频题查漏补缺整理自己的项目亮点。这套 100 集教程最大的价值是让初学者不用再自己拼凑学习地图。第 1 到 20 集打基础21 到 50 集进入组件和进阶用法50 到 80 集通常是路由、状态管理、前后端交互最后 20 集往往是完整的项目实战。具体集数与内容划分以视频实际目录为准但这个学习阶段的划分方式适用于几乎所有 Vue3 系统教程。学习中真正影响成败的不是看了多少集而是每一阶段结束时是否产出了自己的作品。遇到不懂的知识点优先看控制台报错和官方文档遇到项目中的复杂需求先拆解成组件和数据流再动手写代码。这套方法不仅适用于 Vue3也适用于整个前端学习过程。