在构建现代 Web 应用时,前端框架的选择至关重要。无论是开发轻量级的个人项目,还是配合 Spring Boot 构建复杂的企业级前后端分离系统,Vue.js 凭借其渐进式的设计和极低的上手门槛,始终占据着举足轻重的地位。
随着 Vue 3 的全面普及,带来了性能更强劲的 Proxy 响应式系统、更灵活的代码组织方式(Composition API),以及与 Vite 深度整合的极速开发体验。
这篇博客将带你从头开始,详细梳理 Vue 3 的核心概念、安装配置流程以及实战用法。 
一、 Vue.js 简介:什么是 Vue 3?
Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 渐进式 JavaScript 框架。
- 声明式渲染:Vue 基于标准 HTML 拓展了一套模板语法,允许你声明式地描述最终输出的 HTML 和 JavaScript 状态之间的关系。
- 响应性 (Reactivity) :Vue 会自动跟踪 JavaScript 状态的变化,并在状态改变时高效地更新 DOM。
- 渐进式 (Progressive) :你可以仅仅在一个简单的 HTML 页面中引入 Vue 作为增强脚本;也可以配合构建工具(如 Vite)和生态库(Vue Router, Pinia),将其作为全栈单页应用 (SPA) 的核心。
Vue 3 的主要升级亮点:
- Composition API(组合式 API) :打破了 Vue 2 Options API 的局限,允许按业务逻辑重组代码,极大提升了复杂组件的可维护性和逻辑复用能力。
- 基于 Proxy 的响应式系统:彻底解决了 Vue 2 中无法监听到对象属性添加/删除、数组索引修改的痛点,且性能大幅提升。
- 更小的体积与更好的 TypeScript 支持:源码全部由 TS 重写,类型推导更智能。
二、 安装与环境配置

现代前端开发早已告别了直接通过 <script> 标签引入的时代,我们通常会使用官方推荐的构建工具 Vite 来初始化 Vue 项目。
1. 前置准备
确保你的计算机上已安装了 Node.js(建议版本 18.0 或更高)。 打开终端,验证安装:
node -v
npm -v
2.创建Vue3项目
在终端中运行以下命令,使用 create-vue 脚手架初始化项目:
bash
npm create vue@latest
运行后,命令行会进入交互式的项目配置向导。你可以根据实际需求进行选择:
3.安装依赖并启动
进入项目目录,安装依赖并启动本地开发服务器:
bash
cd my-vue-app
npm install
npm run dev
此时,终端会输出一个本地访问地址(通常是 Vue 项目的默认启动页了!Vite 的冷启动速度极快,且支持模块热替换 (HMR),修改代码后浏览器会瞬间同步更新。
三、 核心用法:Composition API 基础
在 Vue 3 中,我们强烈推荐使用 <script setup> 语法糖。它极大简化了代码结构,无需手动 return 变量即可在模板中使用。
下面我们将通过一个完整的计数器/任务列表组件,串起所有的核心知识点。
1. 响应式状态:ref 与 reactive
在 Vue 中,普通变量改变时页面不会更新。我们需要使用 ref 或 reactive 将其包装成响应式数据。
ref:主要用于处理基本数据类型(如 String, Number, Boolean)。在<script>中需要通过.value访问,而在<template>中可以直接使用(模板会自动解包)。reactive:专门用于处理对象和数组。它本身就是一个 Proxy 对象,不需要写.value。
js
<script setup>
import { ref, reactive } from 'vue'
// 使用 ref 定义基本类型
const count = ref(0)
const increment = () => {
count.value++ // JS 中必须带 .value
}
// 使用 reactive 定义复杂对象
const user = reactive({
name: '开发者',
role: '前端工程师'
})
</script>
<template>
<div>
<!-- 模板中自动解包,无需写 count.value -->
<p>当前计数:{{ count }}</p>
<button @click="increment">点击加一</button>
<p>用户信息:{{ user.name }} - {{ user.role }}</p>
</div>
</template>
2. 模板指令:数据驱动视图
Vue 提供了一套以 v- 开头的指令,用于在 DOM 上应用特殊的响应式行为。
v-bind(简写为:) :动态绑定 HTML 属性。v-model:在表单元素上创建双向数据绑定。v-if/v-else:条件渲染,根据真假值决定元素是否渲染到 DOM 中。v-for:列表渲染,用于遍历数组或对象。
js
<script setup>
import { ref } from 'vue'
const newTodo = ref('')
const todos = ref([
{ id: 1, text: '学习 Vue 3 基础', done: true },
{ id: 2, text: '对接 Spring Boot 接口', done: false }
])
const addTodo = () => {
if (newTodo.value.trim() === '') return
todos.value.push({
id: Date.now(),
text: newTodo.value,
done: false
})
newTodo.value = '' // 清空输入框
}
</script>
<template>
<div class="todo-app">
<!-- v-model 双向绑定 -->
<input v-model="newTodo" placeholder="输入新任务" @keyup.enter="addTodo" />
<button @click="addTodo">添加</button>
<ul>
<!-- v-for 列表渲染,必须绑定唯一的 :key -->
<li v-for="todo in todos" :key="todo.id">
<!-- 动态绑定 class -->
<span :class="{ 'is-done': todo.done }">{{ todo.text }}</span>
<!-- 双向绑定复选框 -->
<input type="checkbox" v-model="todo.done" />
</li>
</ul>
<!-- v-if 条件渲染 -->
<p v-if="todos.length === 0">太棒了,所有任务都完成了!</p>
</div>
</template>
<style scoped>
.is-done {
text-decoration: line-through;
color: #888;
}
</style>
3.计算属性:computed
当你需要根据现有的响应式数据推导出一个新值,且希望这个推导过程具备缓存机制时,应该使用 computed。
js
<script setup>
import { ref, computed } from 'vue'
const todos = ref([/* ...上文的数据... */])
// 计算未完成任务的数量
const activeTodosCount = computed(() => {
return todos.value.filter(todo => !todo.done).length
})
</script>
<template>
<p>还有 {{ activeTodosCount }} 项任务未完成。</p>
</template>
4. 监听器:watch
有时我们需要在状态变化时执行"副作用"操作,比如将数据保存到 LocalStorage 或者向后端发送 API 请求。
js
<script setup>
import { ref, watch } from 'vue'
const searchQuery = ref('')
// 监听 searchQuery 的变化
watch(searchQuery, (newValue, oldValue) => {
console.log(`正在搜索: ${newValue}`)
// 这里可以触发网络请求:fetchData(newValue)
})
</script>
5. 通讯组件:Props 与 Emits
在实际开发中,页面往往由多个组件嵌套而成。父组件通过 Props 向下传递数据,子组件通过 Emits 向上触发事件。
子组件 (Child.vue)
js
<script setup>
// 定义接收的 props
defineProps({
title: String
})
// 定义要抛出的事件
const emit = defineEmits(['update'])
const handleClick = () => {
emit('update', '子组件传递的新数据')
}
</script>
<template>
<div class="child">
<h4>{{ title }}</h4>
<button @click="handleClick">通知父组件</button>
</div>
</template>
父组件 (Parent.vue)
js
<script setup>
import Child from './Child.vue'
import { ref } from 'vue'
const message = ref('等待子组件通知...')
// 处理子组件触发的事件
const handleUpdate = (payload) => {
message.value = payload
}
</script>
<template>
<div class="parent">
<h3>父组件状态:{{ message }}</h3>
<!-- 传递 title 属性,监听 update 事件 -->
<Child @update="handleUpdate" title="我是一个子组件"/>
</div>
</template>

五、 总结与展望
Vue 3 是一套极其优雅的前端框架。通过 Vite 提供的极速开发体验,加上 <script setup> 带来的清爽语法,我们能够以极低的心智负担构建出高性能的 Web 应用。
从定义响应式数据的 ref/reactive,到控制渲染流程的模板指令,再到组织状态逻辑的 computed 和 watch,这套 Composition API 工具箱赋予了开发者构建任何复杂架构的能力。
建议大家在阅读完这篇文章后,动手敲一遍上面的代码示例。编程是一门实践的科学,只有在真实的构建过程中,你才能真正领悟到 Vue 3 的设计之美。