Vue概述
- [一、Vue 是什么?](#一、Vue 是什么?)
- 二、核心设计思想:MVVM
- 三、核心特性详解
-
- [1. 响应式系统(Reactivity)](#1. 响应式系统(Reactivity))
- [2. 组件化(Component)](#2. 组件化(Component))
- [3. 虚拟 DOM(Virtual DOM)](#3. 虚拟 DOM(Virtual DOM))
- [4. 模板语法与指令系统](#4. 模板语法与指令系统)
- [5. 两种 API 风格](#5. 两种 API 风格)
- [6. 生命周期](#6. 生命周期)
- [四、Vue 项目结构](#四、Vue 项目结构)
- [五、Vue 生态体系](#五、Vue 生态体系)
- [六、Vue 2 vs Vue 3 主要区别](#六、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),能自动追踪数据变化并更新视图:
js
const app = Vue.createApp({
data() {
return { message: 'Hello Vue!' }
}
}).mount('app')
每个绑定 data 属性的组件都有一个 Watcher 检测数据变化,一旦检测到改变就重新渲染该组件。
2. 组件化(Component)
将一个大型应用拆分成多个小的、独立的、可复用的组件,每个 .vue 单文件组件包含:
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 经验 |
九、快速上手示例
html
<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app">
<h1>{{ message }}</h1>
<input v-model="message" />
<ul>
<li v-for="(item, index) in items" :key="index">
{{ item }}
</li>
</ul>
</div>
<script>
const app = Vue.createApp({
data() {
return {
message: 'Hello Vue 3!',
items: ['学习', '实践', '掌握']
}
}
}).mount('app')
</script>
</body>
</html>