定位:从基础到进阶的 Vue 3 学习笔记,覆盖核心概念、组合式 API、生态工具及实战技巧。
适合人群:有 JavaScript 基础的前端初学者 / 想系统学习 Vue 3 的开发者。
基础篇(Ch 1-5):Vue 概述 · 模板语法 · 响应式基础 · 计算属性与侦听器 · 条件与列表渲染 组件篇(Ch 6-9):组件基础 · Props 与 Emits · 插槽 · 依赖注入 进阶篇(Ch 10-14):组合式 API · 生命周期 · 模板引用 · Teleport 与 Suspense · 自定义指令 生态篇(Ch 15-18):Vue Router · Pinia 状态管理 · VueUse 工具库 · Vite 构建工具 实战篇(Ch 19-20):项目架构 · 性能优化
Vue 是一个用于构建用户界面的渐进式框架。与其它大型框架不同,Vue 被设计为可以自底向上逐层应用。
| 特性 | Vue 2 | Vue 3 |
|---|---|---|
| 响应式实现 | Object.defineProperty |
Proxy |
| API 风格 | 选项式 API(Options API) | 选项式 + 组合式 API(Composition API) |
| 生命周期 | created / mounted |
onMounted / onUnmounted(组合式) |
| 多根节点 | 不支持 | 支持(Fragment) |
| TypeScript | 支持较弱 | 原生支持 |
| 性能 | 良好 | 显著提升(打包体积更小、渲染更快) |
📌 Vue 3 是当前推荐版本。新项目应直接使用 Vue 3 + Vite + Pinia + Vue Router 的技术栈。Vue 2 已于 2023 年 12 月 31 日停止维护。
项目结构:
📌 <script setup> 是 Vue 3 的语法糖,它是组合式 API 的编译时语法糖,让你更简洁地使用组合式 API。无需 return 暴露变量,所有顶层绑定自动暴露给模板。
:)@)📌 v-model 本质是 :value + @input 的语法糖:
等价于 <input v-model="message" />。
| 指令 | 简写 | 作用 |
|---|---|---|
v-bind |
: |
绑定属性 |
v-on |
@ |
绑定事件 |
v-model |
— | 双向绑定 |
v-if / v-else / v-else-if |
— | 条件渲染(DOM 创建/销毁) |
v-show |
— | 条件显示(CSS display 切换) |
v-for |
— | 列表渲染 |
v-html |
— | 渲染 HTML(注意 XSS 风险) |
v-text |
— | 渲染纯文本 |
v-once |
— | 只渲染一次 |
v-pre |
— | 跳过编译 |
| 特性 | ref |
reactive |
|---|---|---|
| 适用类型 | 基本类型 + 对象 | 仅对象类型 |
| 访问方式 | 需要 .value |
直接访问 |
| 解构 | 不会失去响应性(用 toRefs) |
解构会失去响应性 |
| 模板中 | 自动解包 | 直接使用 |
| 推荐场景 | 简单值、需要"整体替换" | 表单、复杂对象状态 |
📌 最佳实践:
refreactiveref,它对对象也有效(内部会自动用 reactive 包装)
:::| 特性 | computed |
methods |
|---|---|---|
| 缓存 | 有缓存(依赖不变不重算) | 每次调用都执行 |
| 调用 | 像属性一样访问(不加括号) | 像函数一样调用 |
| 适用 | 基于响应式数据的派生值 | 需要参数或不需要缓存的逻辑 |
:::tip 📌 watch vs watchEffect:
watch:明确指定监听目标,可获取新旧值,默认不立即执行watchEffect:自动追踪回调中的响应式依赖,立即执行一次,无法获取旧值选择:需要旧值 → watch;只需副作用 → watchEffect
| 特性 | v-if |
v-show |
|---|---|---|
| 实现方式 | DOM 创建/销毁 | CSS display 切换 |
| 初始渲染 | 条件为 false 时不渲染 | 始终渲染 |
| 切换开销 | 高(DOM 操作) | 低(CSS 切换) |
| 适用 | 不频繁切换 | 频繁切换 |
v-for 必须加 :key!
key 应该是唯一且稳定的(如 item.id),不要用 indexindex 做 key 会导致数据错乱和性能问题(尤其在列表增删时)key 帮助 Vue 高效复用 DOM 节点
:::MyComponent.vue,模板中 <MyComponent />my-component.vue,模板中 <my-component />:::tip
📌 最佳实践:provide 响应式数据时,提供 readonly 版本 + 修改方法,避免后代组件直接修改状态,保持数据流向清晰。
📌 Composable 命名规范:以 use 开头,如 useCounter、useFetch、useMousePosition。这是社区约定俗成的规则。
| 选项式 API | 组合式 API(<script setup>) |
说明 |
|---|---|---|
beforeCreate |
—(setup 替代) | 组件实例创建前 |
created |
—(setup 替代) | 组件实例创建后 |
beforeMount |
onBeforeMount |
挂载前 |
mounted |
onMounted |
挂载后(可访问 DOM) |
beforeUpdate |
onBeforeUpdate |
更新前 |
updated |
onUpdated |
更新后 |
beforeUnmount |
onBeforeUnmount |
卸载前 |
unmounted |
onUnmounted |
卸载后 |
errorCaptured |
onErrorCaptured |
捕获后代组件错误 |
📌 常见用途:
onMounted:发起 API 请求、初始化第三方库、访问 DOMonUnmounted:清理定时器、移除事件监听、销毁实例onUpdated:数据更新后操作 DOM(避免在此修改数据,可能死循环)
::::::tip
<script setup> 组件默认是封闭的,父组件通过 ref 无法直接访问子组件的变量和方法。必须使用 defineExpose 显式暴露。
| 钩子 | 说明 |
|---|---|
created |
元素属性和事件监听器设置前 |
beforeMount |
挂载前 |
mounted |
挂载后 |
beforeUpdate |
更新前 |
updated |
更新后 |
beforeUnmount |
卸载前 |
unmounted |
卸载后 |
:::tip 📌 Pinia vs Vuex:Pinia 是 Vue 官方推荐的新一代状态管理库,取代了 Vuex。
VueUse 是一个 Vue 组合式 API 工具集合,提供 200+ 个实用的 Composable 函数。
| 优化项 | 方法 | 收益 |
|---|---|---|
| 路由懒加载 | () => import() |
减小首屏体积 |
| 代码分割 | manualChunks |
利用浏览器缓存 |
| 图片懒加载 | v-lazy / IntersectionObserver |
减少初始请求 |
| 虚拟滚动 | useVirtualList |
大列表性能 |
v-memo |
缓存子树 | 减少不必要的 diff |
shallowRef / shallowReactive |
浅层响应式 | 减少代理开销 |
markRaw |
跳过响应式 | 第三方实例无需代理 |
| Tree-shaking | 按需引入 | 减小打包体积 |