Vue概述
- 一、Vue 是什么?
- 二、核心设计思想:MVVM
- 三、核心特性详解
- 1. 响应式系统(Reactivity)
- 2. 组件化(Component)
- 3. 虚拟 DOM(Virtual DOM)
- 4. 模板语法与指令系统
- 5. 两种 API 风格
- 6. 生命周期
- 四、Vue 项目结构
- 五、Vue 生态体系
- 六、Vue 2 vs Vue 3 主要区别
- 七、优缺点分析
- 八、适用场景
- 九、快速上手示例
一、Vue 是什么?
Vue.js(读音 /vjuː/,类似于 “view”)是一套用于构建用户界面的渐进式 JavaScript 框架,由尤雨溪(Evan You)于 2014 年首次发布。
渐进式意味着:你可以把 Vue 当作一个轻量的增强库引入现有页面,也可以配合路由(Vue Router)、状态管理(Pinia)、构建工具(Vite)等,搭建出复杂的大型单页应用(SPA)。
Vue 的核心库只关注视图层,易于上手,也便于与第三方库或既有项目整合。
二、核心设计思想:MVVM
Vue 是一个典型的 MVVM(Model-View-ViewModel) 框架:
| 层级 | 说明 |
|---|---|
| Model | 数据模型层(普通 JavaScript 对象,{ }) |
| View | 视图层(DOM / HTML 模板) |
| ViewModel | Vue 实例,负责连接 Model 与 View,实现双向数据绑定 |
当 Model 数据变化时,View 自动更新;用户在 View 中操作时,Model 也同步变化——无需手动操作 DOM。
三、核心特性详解
1. 响应式系统(Reactivity)
Vue 3 基于 Proxy 重构了响应式系统(Vue 2 使用 Object.defineProperty),能自动追踪数据变化并更新视图:
constapp=Vue.createApp({data(){return{message:'Hello Vue!'}}}).mount('app')每个绑定data属性的组件都有一个 Watcher 检测数据变化,一旦检测到改变就重新渲染该组件。
2. 组件化(Component)
将一个大型应用拆分成多个小的、独立的、可复用的组件,每个.vue单文件组件包含:
<template> <div class="container"> <h1>{{ title }}</h1> <button @click="add">+1</button> </div> </template> <script> export default { data() { return { title: 'Welcome to Vue.js' } }, methods: { add() { this.title = 'Updated!' } } } </script> <style> .container { text-align: center; color: blue; } </style>组件化的优势:
- 提高开发效率
- 方便重复使用
- 简化调试步骤
- 提升项目可维护性
- 便于协同开发
3. 虚拟 DOM(Virtual DOM)
传统操作 DOM 会频繁触发浏览器渲染,导致页面卡顿。Vue 的做法:
- 用 JavaScript 计算出 DOM 操作(虚拟 DOM)
- 与真实 DOM 进行 diff 比较
- 只更新变化的部分,批量提交到真实 DOM
这大大提升了渲染性能。
4. 模板语法与指令系统
Vue 使用类似 HTML 的模板语法,通过v-前缀的指令实现各种功能:
| 指令 | 作用 | 示例 |
|---|---|---|
v-bind/: | 绑定属性 | <a :href="url"> |
v-model | 双向绑定(表单) | <input v-model="msg"> |
v-if/v-else | 条件渲染 | <p v-if="ok">YES</p> |
v-show | 条件显示(CSS 切换) | <p v-show="ok"> |
v-for | 列表渲染 | <li v-for="item in list"> |
v-on/@ | 事件监听 | <button @click="add"> |
v-text | 文本插值 | <span v-text="msg"> |
插值语法{{ }}也叫"胡子语法"(Moustache),用于渲染 data 中的值或简单表达式。
5. 两种 API 风格
| 选项式 API(Options API) | 组合式 API(Composition API) | |
|---|---|---|
| 特点 | 按data、methods、computed、watch等选项组织 | 用setup()、ref、reactive等函数组合逻辑 |
| 适用场景 | Vue 2 / 小型项目 | Vue 3 推荐 / 大型项目 |
| 优势 | 简单直观,易于上手 | 逻辑复用更好,代码组织更灵活 |
6. 生命周期
每个 Vue 组件都经历:创建 → 挂载 → 更新 → 销毁
主要钩子函数:
| 钩子 | 时机 |
|---|---|
beforeCreate | 实例初始化之后,数据观测之前 |
created | 数据已观测,可访问 data |
beforeMount | 挂载开始之前 |
mounted | 挂载完成,可访问 DOM |
beforeUpdate | 数据更新时 |
updated | 视图更新后 |
beforeUnmount | 卸载之前 |
unmounted | 卸载完成 |
四、Vue 项目结构
以 Vite + Vue 3 项目为例:
project/ ├── public/ 静态资源(不打包,直接复制) ├── src/ │ ├── assets/ 需要打包处理的静态资源 │ ├── components/ 可复用组件 │ ├── views/ 页面级组件(路由对应) │ ├── router/ 路由配置 │ ├── api/ 接口请求封装 │ ├── store/ 状态管理(Pinia) │ ├── App.vue 根组件 │ ├── main.js 入口文件 │ └── style.css 全局样式 ├── index.html 入口 HTML ├── package.json 项目配置 ├── vite.config.js Vite 构建配置 └── .gitignore项目运行核心流程:
npm run dev → Vite 读取 vite.config.js 配置 → 找到入口 index.html → index.html 引入 src/main.js → main.js 创建 Vue 实例,挂载到 app 节点 → 渲染根组件 App.vue → 递归渲染 App.vue 内的所有子组件五、Vue 生态体系
| 工具/库 | 用途 |
|---|---|
| Vite | 新一代构建工具(替代 Vue CLI/webpack),启动极快 |
| Vue Router | 单页应用路由管理 |
| Pinia | 状态管理(替代 Vuex,Vue 3 官方推荐) |
| Vue Devtools | 浏览器调试插件,查看组件树、状态、事件 |
| Element Plus / Vuetify / Ant Design Vue | UI 组件库 |
| Axios | HTTP 请求库 |
六、Vue 2 vs Vue 3 主要区别
| 特性 | Vue 2 | Vue 3 |
|---|---|---|
| 响应式 | Object.defineProperty | Proxy(性能更好,可检测属性增删) |
| API | 选项式为主 | 组合式 API(setup)+ 选项式兼容 |
| 组件 | 选项式 | 支持<script setup>语法糖 |
| 状态管理 | Vuex | Pinia(更简洁、TypeScript 友好) |
| 构建工具 | Vue CLI (webpack) | Vite(推荐) |
| TypeScript | 需要额外配置 | 原生支持,非常友好 |
| 新特性 | — | Fragment、Teleport、Suspense 等 |
七、优缺点分析
✅ 优点
- 轻量级:核心库几十 KB,不依赖第三方库
- 易学易用:基于 HTML/CSS/JS,学习曲线平缓
- 组件化 + 响应式:开发效率高,代码可维护
- 虚拟 DOM:性能优异
- 生态丰富:大量插件、UI 库、工具链
- 渐进式:可从小到大灵活采用
⚠️ 缺点
- 版本更新频繁:Vue 2 → 3 有较大 breaking changes,老项目迁移成本高
- 不够标准化:无强制编码规范,团队风格可能不一致
- 不支持 IE8 及以下:需要额外 polyfill
- 社区规模:相比 React 全球社区略小(但在国内非常流行)
八、适用场景
| 适合 ✅ | 不太适合 ❌ |
|---|---|
| 需要快速开发迭代的项目 | 需要严格编码规范的大型团队项目 |
| 高度交互、动态更新的 SPA | 需要支持 IE8 等老旧浏览器的项目 |
| 与现有项目逐步集成 | 需要极度成熟稳定的企业级方案(可考虑 Angular) |
| 管理后台、电商、小程序等 | 超大型应用且团队无 Vue 经验 |
九、快速上手示例
<!DOCTYPEhtml><html><head><scriptsrc="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.js"></script></head><body><divid="app"><h1>{{ message }}</h1><inputv-model="message"/><ul><liv-for="(item, index) in items":key="index">{{ item }}</li></ul></div><script>constapp=Vue.createApp({data(){return{message:'Hello Vue 3!',items:['学习','实践','掌握']}}}).mount('app')</script></body></html>