Vue3零基础到实战:组合式API、路由与Pinia全解析

发布时间:2026/8/30 2:07:34
Vue3零基础到实战:组合式API、路由与Pinia全解析 最近总有人问Vue3 学了到底能不能上手项目网上教程那么多有的讲组合式 API有的讲响应式原理但真正能让零基础从“看不懂代码”到“能写后台管理页面”的完整链路很少。这次直接用一套完整路线来讲 Vue3从环境搭建、核心语法、组件通信、路由、状态管理到最后的工程化实战每个环节都按“听得懂、写得出、能跑通”的标准来拆解。这篇文章解决的不只是“Vue3 有哪些新特性”而是你要做前端开发、找工作、写毕设、接手老项目时哪些知识是必须想清楚的哪些坑是必须提前避开的。整篇内容会按照一条落地的学习主线展开先装好 Node 和 Vite 环境再逐个攻破 setup 语法、ref/reactive、computed、watch、defineProps/defineEmits、Vue Router、Pinia最后把组合式 API 和 Vue2 选项式 API 的差异理清楚。文末还会给出一套可以对照练手的实战建议和常见报错排查清单。1. Vue3 核心能力速览能力项说明适用人群零基础、转行前端、后端想补前端、Vue2 老手迁移核心语法组合式 API、script setup、ref、reactive、computed、watch项目构建Vite、Vue CLI、npm/pnpm/yarn核心生态Vue Router 4、Pinia、Element Plus、Axios上手成本需要掌握 HTML、CSS、JavaScript 基础运行环境Node.js 16推荐 18 或 20 LTS浏览器支持主流现代浏览器Vite 开发默认不兼容 IE调试工具Vue Devtools、浏览器 Console、Vite 日志适合项目后台管理、中后台系统、PC/移动端 H5、PC 端网站不适合场景对 SEO 要求极高的纯内容站建议用 SSR 框架如 Nuxt从材料来看Vue3 的学习重点已经非常明确不是去背各种新 API 名称而是理解“状态、模板、事件、生命周期、组件通信”这条主线然后用组合式 API 把逻辑组织起来。下面的内容会完全围绕这条主线展开。2. 适用场景与使用边界Vue3 是当前国内 Web 前端使用率极高的框架之一。从招聘 JD 到开源后台管理项目Vue3 Vite Element Plus Pinia 已经成了低门槛建站和高效率开发的常见组合。很多大学课程、培训机构和自学者也把 Vue3 作为前端三大框架中优先学习的方向。但这类框架类教程也要先说清楚边界第一Vue3 不是 HTML 的替代品。你必须先能写清楚一个静态页面理解 DOM、事件、表单、CSS 布局再学框架否则会被响应式数据、组件传参等概念绕晕。第二教程学完不代表能直接开发高并发、强实时的应用。Vue3 本身是一个前端视图层框架负责页面渲染和前端业务状态编排。实时通信要配合 WebSocket海量数据展示要考虑虚拟滚动团队协作要考虑代码规范和工程化配置。第三学 Vue3 更要重视 JavaScript 基础。尤其是对象、数组、函数闭包、Promise、解构赋值、ES Module这些内容在 Vue3 的组合式 API 中大量出现。理解不了这些reactive的解构丢失响应式、async setup的返回差异这类问题就会很难排查。第四条属于合规和安全边界。如果你在项目里用到 AI 组件、第三方 API、地图 SDK、视频直播、上传功能都涉及用户数据和第三方服务授权。开发阶段要使用测试账号和模拟数据不要拿真实用户信息和未授权资源做实验。涉及 ChatGPT 类 AI 组件要确认服务商是否允许本地接入不要私自封装非法代理服务。概念边界确认后下面直接进入实操部分。3. Vue3 本地开发环境准备无论你是零基础还是从 Vue2 迁移装环境是最先要过的一关。Vue3 现在主流使用 Vite 构建不再建议新项目用 Vue CLI。3.1 安装 Node.jsVue3 Vite 依赖 Node.js。建议安装 Node.js 18 LTS 或 20 LTS。访问 Node.js 官网下载.msi或.pkg安装包一路下一步。安装完成后在终端验证node -v npm -v看到版本号说明安装成功。如果你之前安装过旧版本建议直接升级到 Node 18否则 Vite 启动时可能报错。3.2 安装编辑器推荐 VSCode装上以下插件插件作用Vue - OfficialVolarVue3 语法提示和类型检查ESLint代码规范检查Prettier代码格式化注意Vue2 时代常用的 Vetur 插件在 Vue3 项目里建议禁用否则会和 Volar 冲突导致defineProps、defineEmits这类宏语法提示异常。3.3 创建第一个 Vue3 项目用 Vite 创建一个 Vue3 项目npm create vitelatest my-vue3-app -- --template vue或者使用交互式命令npm create vitelatest然后按提示选择项目名称、选择 Vue、选择 JavaScript。进入项目目录并安装依赖cd my-vue3-app npm install启动开发服务npm run dev启动后终端会显示一个本地地址通常是http://localhost:5173。浏览器打开这个地址能看到 Vite Vue 的默认页面。到这里你的第一个 Vue3 项目就跑起来了。从材料来看这是当前最稳妥的入门方式不要再用vue create创建新项目。4. Vue3 项目结构与入口文件解析Vite 创建的项目结构和 Vue CLI 不同文件更少逻辑更直接。my-vue3-app ├── index.html ├── package.json ├── vite.config.js └── src ├── main.js ├── App.vue ├── components └── assets入口文件有两个index.html是浏览器真正加载的页面。src/main.js是 JavaScript 入口。src/main.js的核心内容import { createApp } from vue import App from ./App.vue createApp(App).mount(#app)这里和 Vue2 最大的差异是Vue2 使用new Vue()Vue3 使用createApp()。一个页面只应该有一个应用实例通过mount(#app)挂载到index.html中的div idapp。App.vue是一个单文件组件包含了模板、脚本、样式三部分template div h1{{ msg }}/h1 /div /template script setup const msg Hello Vue3 /script style scoped h1 { color: red; } /stylescript setup是 Vue3 组合式 API 的语法糖是入门阶段每天都要打交道的地方。5. 组合式 API 入门ref、reactive、computed、watchVue3 学习最核心的内容就是把 Vue2 的data、methods、computed、watch、生命周期改成基于函数的写法。不要一开始就去深挖 Proxy 的原理先把用法跑通。5.1 ref定义基础类型响应式数据script setup import { ref } from vue const count ref(0) function add() { count.value } /script template div p{{ count }}/p button clickadd1/button /div /template关键点ref包装后的数据在script中要用.value读写在template中不需要.value。5.2 reactive定义对象类型响应式数据script setup import { reactive } from vue const user reactive({ name: 张三, age: 20 }) function updateAge() { user.age } /script template div p{{ user.name }}{{ user.age }}岁/p button clickupdateAge长大一岁/button /div /template注意reactive只能用于对象、数组等引用类型。它有一个常见坑直接解构会丢失响应式const { name } user推荐使用toRefs或直接使用ref定义对象属性。5.3 computed派生状态computed用于根据已有响应式数据计算新值并且有缓存。script setup import { ref, computed } from vue const price ref(10) const count ref(3) const total computed(() price.value * count.value) /script template div p单价{{ price }}/p p数量{{ count }}/p p总价{{ total }}/p /div /templatetotal不需要手动更新依赖的price和count变化时它自动重新计算。5.4 watch监听数据变化watch和 Vue2 的watch类似用来执行异步操作或者处理复杂逻辑。script setup import { ref, watch } from vue const keyword ref() watch(keyword, (newValue, oldValue) { console.log(搜索关键词变化, newValue) }) /script template div input v-modelkeyword placeholder输入关键词 / /div /template如果要监听reactive对象中的某个属性需要使用 getter 写法watch(() user.age, (newVal, oldVal) { console.log(newVal, oldVal) })6. 模板语法与指令Vue3 的模板语法和 Vue2 大部分相同需要重点掌握插值、事件绑定、双向绑定、条件渲染、列表渲染。6.1 插值与事件绑定template div p{{ message }}/p button clickhandleClick点击/button /div /template script setup const message Hello function handleClick() { alert(clicked) } /script6.2 v-model 双向绑定script setup import { ref } from vue const username ref() /script template div input v-modelusername placeholder输入用户名 / p当前输入{{ username }}/p /div /template6.3 v-if 与 v-forscript setup import { ref } from vue const show ref(true) const list ref([ { id: 1, name: Vue }, { id: 2, name: React }, { id: 3, name: Angular } ]) /script template div p v-ifshow显示/p p v-else隐藏/p ul li v-foritem in list :keyitem.id{{ item.name }}/li /ul /div /template:key一定不能省略否则列表更新时可能出现渲染异常。7. 组件通信defineProps、defineEmitsVue3 的组件通信是面试和项目开发的高频考点。父组件向子组件传数据用defineProps子组件向父组件发消息用defineEmits。7.1 父组件向子组件传值父组件script setup import Child from ./Child.vue const title 父组件的数据 /script template div Child :titletitle / /div /template子组件script setup const props defineProps({ title: { type: String, default: } }) console.log(props.title) /script template div p{{ title }}/p /div /template7.2 子组件向父组件传事件子组件script setup const emit defineEmits([update]) function handleClick() { emit(update, 这是子组件传出去的数据) } /script template div button clickhandleClick发送给父组件/button /div /template父组件script setup import Child from ./Child.vue function handleUpdate(data) { console.log(父组件收到, data) } /script template div Child updatehandleUpdate / /div /template7.3 v-model 实现父子组件双向同步这是经常用到的高级用法。子组件通过defineModel宏可以简化双向绑定不过目前项目中使用更广泛的仍然是props emits组合写法!-- 子组件 -- script setup const props defineProps({ modelValue: { type: String, default: } }) const emit defineEmits([update:modelValue]) function updateValue(event) { emit(update:modelValue, event.target.value) } /script template input :valuemodelValue inputupdateValue / /template父组件使用MyInput v-modelkeyword /这种写法在面试中也会被问到建议零基础阶段先把defineProps和defineEmits练熟。8. Vue Router 4 路由配置与页面跳转多页面应用不会只有一个页面Vue Router 4 是 Vue3 官方的路由方案。8.1 安装路由npm install vue-router48.2 创建路由配置文件在src下创建router/index.jsimport { createRouter, createWebHistory } from vue-router import Home from ../views/Home.vue import About from ../views/About.vue const routes [ { path: /, name: Home, component: Home }, { path: /about, name: About, component: About } ] const router createRouter({ history: createWebHistory(), routes }) export default router8.3 在 main.js 中注册路由import { createApp } from vue import App from ./App.vue import router from ./router createApp(App).use(router).mount(#app)8.4 页面中使用路由template div nav RouterLink to/首页/RouterLink RouterLink to/about关于/RouterLink /nav RouterView / /div /templateRouterLink负责跳转RouterView负责显示当前路由对应的组件。8.5 路由传参跳转时传参import { useRouter } from vue-router const router useRouter() function goDetail(id) { router.push({ path: /detail, query: { id: id } }) }接收参数import { useRoute } from vue-router const route useRoute() console.log(route.query.id)这里的重点是Vue3 中通过useRouter和useRoute获取路由实例而不是 Vue2 中的this.$router。9. Pinia 状态管理与全局数据共享组件通信只能解决父子组件之间的数据传递多页面共享登录状态、购物车数据、全局配置需要引入状态管理。Vue3 推荐使用 Pinia而不是 Vuex。9.1 安装 Pinianpm install pinia9.2 注册 Piniaimport { createApp } from vue import App from ./App.vue import { createPinia } from pinia const app createApp(App) app.use(createPinia()) app.mount(#app)9.3 创建一个 Store在src/store/user.js中创建import { defineStore } from pinia import { ref } from vue export const useUserStore defineStore(user, () { const name ref() const isLogin ref(false) function login(username) { name.value username isLogin.value true } function logout() { name.value isLogin.value false } return { name, isLogin, login, logout } })9.4 组件中使用 Piniascript setup import { useUserStore } from ../store/user const userStore useUserStore() /script template div p当前用户{{ userStore.name }}/p p登录状态{{ userStore.isLogin }}/p button clickuserStore.login(张三)登录/button button clickuserStore.logout退出/button /div /templatePinia 比 Vuex 简单的地方在于它不需要写mutations和actions的固定格式直接写函数就可以修改状态。这在中小型项目里非常方便。10. Vue2 和 Vue3 的核心区别这部分不光是面试高频点也是老项目迁移时必须掌握的知识。对比项Vue2Vue3API 风格选项式 API选项式 API 组合式 API创建实例new Vue()createApp()全局配置Vue.use()、Vue.component()app.use()、app.component()数据定义data()返回对象ref/reactive生命周期beforeDestroy、destroyedbeforeUnmount、unmounted路由Vue Router 3Vue Router 4状态管理VuexPinia响应式原理Object.definePropertyProxy插槽语法slot、slot-scopev-slot过滤器支持移除推荐用 computed 或方法根节点可多个根节点多个根节点正常零基础学习 Vue3 时不建议再花大量时间练习 Vue2 的选项式 API。你需要熟悉它的代码风格因为很多存量项目还在用但新项目的首选一定是组合式 API。11. 从入门到实战的必经路线11.1 第一阶段基础语法学习并实践ref、reactive、computed、watch、v-if、v-for、v-model做一个计数器做一个 TodoList 增删改查11.2 第二阶段组件化开发学习defineProps、defineEmits、插槽、动态组件把一个 TodoList 拆成列表组件、输入组件、按钮组件理解父组件数据如何驱动子组件渲染11.3 第三阶段路由与状态管理学习 Vue Router 4 的路由配置、嵌套路由、路由守卫学习 Pinia 的全局状态管理做一个带登录判断的后台管理框架雏形11.4 第四阶段工程化与接口联调使用 Axios 封装request.js配置开发环境代理引入 Element Plus 组件库完成一个真实的 CRUD 表格页面11.5 第五阶段进阶与性能优化掌握shallowRef、markRaw、nextTick、keep-alive掌握路由懒加载了解组合式 Hook 封装12. 快速上手实战后台管理模块后台管理是 Vue3 最典型的应用场景。下面用一个简化例子打通“组件 路由 Pinia 接口请求”的完整流程。12.1 模块需求登录后显示用户名进入首页展示一个用户列表点击新增弹窗录入列表刷新12.2 目录结构建议src ├── api │ └── user.js ├── router │ └── index.js ├── store │ └── user.js ├── views │ ├── Login.vue │ └── Home.vue └── components └── UserForm.vue12.3 Axios 请求封装示例import axios from axios const request axios.create({ baseURL: /api, timeout: 10000 }) request.interceptors.request.use((config) { const token localStorage.getItem(token) if (token) { config.headers.Authorization Bearer ${token} } return config }) export default request模块接口import request from ../utils/request export function getUserList(params) { return request.get(/user/list, { params }) } export function createUser(data) { return request.post(/user/create, data) }12.4 页面调用接口script setup import { ref, onMounted } from vue import { getUserList } from ../api/user const loading ref(false) const list ref([]) async function fetchList() { loading.value true try { const res await getUserList({ page: 1, pageSize: 10 }) list.value res.data.list } finally { loading.value false } } onMounted(() { fetchList() }) /script template div el-button clickfetchList刷新/el-button el-table :datalist el-table-column propid labelID / el-table-column propname label姓名 / el-table-column propemail label邮箱 / /el-table /div /template这里有一个实践点在开发环境需要配置 Vite 的代理把/api转发到后端地址。在vite.config.js中import { defineConfig } from vite import vue from vitejs/plugin-vue export default defineConfig({ plugins: [vue()], server: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } })13. 问题排查与常见错误下面整理的是入门阶段最容易遇到的问题。问题现象可能原因排查方式解决方案npm run dev报错Node 版本过低node -v查看版本升级到 Node 18页面无法打开端口被占用查看终端日志启动命令加--port 5174ref数据在 JS 中修改不生效忘了写.value检查代码count.valuereactive解构后数据不更新直接解构丢失响应式检查解构位置用toRefs或refdefineProps报错使用了 Vetur 插件禁用 Vetur启用 Vue - Official路由跳转后没有渲染忘记写RouterView检查 App.vue添加RouterView /控制台出现循环更新警告在 watch 中直接修改监听源检查 watch 写法使用计算属性或异步更新axios 请求 404开发环境代理未生效看 Network 面板配置 vite server.proxy批量请求卡死没有处理错误或并发过高查看后端日志加入失败重试、并发限制刷新页面后状态丢失Pinia 没有持久化查看 Store 状态使用 pinia-plugin-persistedstate还有一个小坑在 Vue3 面试里经常被问到v-for使用index作为key可能导致列表中被删除项的样式状态错乱。比如表格有选中状态index变化时组件复用逻辑会出问题。建议尽可能使用后端返回的唯一id作为 key。14. 最佳实践与学习建议从实际项目和自学经验来看下面的建议能明显降低学习难度。14.1 先写后学不要等把文档全部看完才动手。安装完环境后先写一个 “Hello Vue3”再改成一个 TodoList之后再回来学原理理解速度会快很多。14.2 建立一套最小可运行模板建议本地保留一个vue3-template项目包含Vite 配置路由基础配置Pinia 基础配置Axios 封装Element Plus 按需引入后续写新功能、做测试、参加面试准备都在这个模板基础上改能节省大量时间。14.3 每学一个 API配套一个场景例如学到watch不要只看语法而是做一个输入防抖搜索学到computed就做一个购物车总价计算学到defineEmits就做子组件修改父组件数据。场景比语法重要。14.4 熟练使用 Vue DevtoolsVue3 的 Devtools 可以直观查看组件树、响应式数据、路由、Pinia 状态。遇到数据不更新、属性没传进来、事件没触发的问题第一件事不是猜而是打开 Devtools 看当前组件实例里到底有什么。14.5 接口联调要加日志和错误提示在项目中使用 axios 拦截器统一处理错误不要在每次请求里单独写console.log。否则团队协作时接口报错很难定位。request.interceptors.response.use( (response) response, (error) { console.error(接口请求错误, error.response || error) return Promise.reject(error) } )14.6 保证合规和安全在本地练习阶段尽量使用测试接口或者 Mock 数据。涉及上传用户文件、获取地理位置、调用摄像头等能力时要确认授权流程完整。不要在没有权限的情况下抓取他人网站数据、爬取用户信息也不要把真实业务数据随意暴露在公开仓库里。15. 常见面试点速查如果你学完准备面试下面这些点建议自己先用代码跑一遍再整理成口语化答案ref和reactive的区别computed和watch的区别Vue3 响应式原理是什么v-if和v-show的区别v-for中key的作用Vue2 的data和 Vue3 的ref在使用上的差异Vue3 生命周期与 Vue2 的区别路由懒加载如何实现如何封装一个 axios 请求模块Pinia 与 Vuex 的核心区别组件之间通信有哪几种方式defineProps和defineEmits的底层作用Vue3 组合式 Hook 如何把一个业务逻辑抽离复用这 13 个问题覆盖了初级前端面试中绝大部分 Vue3 考察点。16. 总结与下一步Vue3 的学习路径并不复杂核心就是把setup语法下的数据、计算属性、监听器、组件通信、路由、状态管理这六条线串起来。把这六条线练熟你就有能力写一个后台管理系统的基础框架也能看懂大多数开源 Vue3 项目。最先要做的事很简单按照第三部分内容创建一个 Vite 项目然后从 ref 开始写一个计数器再扩展成 TodoList最后加上路由和接口请求。整个过程可以在一周内完成但前提是每个案例都要手敲代码而不是只看不练。最容易踩的坑也无非这几个Node 版本太低、Vetur 和 Volar 冲突、ref忘写.value、reactive解构丢失响应式、路由忘了加RouterView、代理配置没生效。这些坑在下面的排查表里都能找到解决办法遇到了直接对照处理就行。接下来可以继续扩展的方向按优先级排序Element Plus 组件库、TypeScript 版 Vue3、Vite 高级配置、Nuxt 3 服务端渲染、Vue3 组件库封装与发布。建议把每一块内容都做成一个独立的小项目积累自己的项目库这是前端学习和求职最直接的作品积累方式。