作为一名 Java 开发工程师,当你掌握了 HTML、CSS 和 JavaScript 的基础后,是时候接触现代前端框架了。Vue.js 以其简洁的 API、渐进式的设计和优秀的中文文档,成为众多 Java 开发者入门前端框架的首选。

Vue.js 让你能快速构建响应式、组件化的单页应用(SPA),与你的 Java 后端(Spring Boot)完美配合,打造现代化的全栈应用。

本文将从 Java 开发者的角度,系统讲解 Vue.js 的核心概念、语法,并通过一个完整的 Vue + Spring Boot 用户管理项目,带你实现前后端分离的全栈开发。


🧱 一、为什么 Java 开发者要学 Vue.js?

  1. 前后端分离是主流:现代 Web 开发普遍采用前后端分离架构,Java 负责提供 RESTful API,Vue 负责前端展示与交互。
  2. 提升开发效率:Vue 的组件化、数据绑定、虚拟 DOM 等特性,极大提升了前端开发效率和代码可维护性。
  3. 更好的用户体验:单页应用(SPA)提供接近原生应用的流畅体验。
  4. 全栈能力:掌握 Vue 让你具备独立开发小型全栈项目的能力,拓宽职业发展路径。
  5. 生态成熟:Vue 拥有庞大的生态系统(Vue Router, Vuex/Pinia, Vite, Element Plus 等)。

🔍 核心思想:Vue 的核心是 “数据驱动视图”。你只需关注数据(data),视图(DOM)会自动更新。


🧠 二、Vue.js 核心概念速览

✅ 1. 创建 Vue 应用

// 使用 Vue 3 (推荐)
import { createApp } from 'vue'const app = createApp({data() {return {message: 'Hello Vue!'}}
})app.mount('#app')
<div id="app">{{ message }} <!-- 插值表达式,自动响应数据变化 -->
</div>

✅ 2. 响应式数据绑定

data() {return {count: 0,user: {name: '张三',email: 'zhangsan@example.com'}}
}
<p>计数: {{ count }}</p>
<button @click="count++">+1</button> <!-- @click 是 v-on:click 的简写 --><p>姓名: <input v-model="user.name"></p> <!-- v-model 双向绑定 -->
<p>邮箱: {{ user.email }}</p>

✅ 3. 条件渲染与列表渲染

<!-- v-if / v-else -->
<div v-if="isLoggedIn"><p>欢迎回来!</p>
</div>
<div v-else><p>请登录</p>
</div><!-- v-for 列表渲染 -->
<ul><li v-for="user in users" :key="user.id">{{ user.name }} - {{ user.email }}</li>
</ul>

✅ 4. 事件处理

<button @click="handleClick">点击我</button>
<button @click="increase(5)">增加5</button>
methods: {handleClick() {this.count++},increase(num) {this.count += num}
}

✅ 5. 组件化(Component)

Vue 的核心是将 UI 拆分为独立、可复用的组件。

<!-- UserCard.vue (子组件) -->
<template><div class="user-card"><h3>{{ user.name }}</h3><p>{{ user.email }}</p></div>
</template><script>
export default {props: ['user'] // 接收父组件传递的数据
}
</script>
<!-- App.vue (父组件) -->
<template><div><UserCard v-for="user in users" :key="user.id" :user="user" /></div>
</template><script>
import UserCard from './components/UserCard.vue'export default {components: {UserCard},data() {return {users: [{ id: 1, name: '张三', email: 'zhangsan@example.com' },{ id: 2, name: '李四', email: 'lisi@example.com' }]}}
}
</script>

🚀 三、Vue 3 + Spring Boot 全栈项目实战:用户管理系统

我们将构建一个简单的用户管理系统,前端使用 Vue 3 + Vite + Element Plus,后端使用 Spring Boot。

✅ 1. 项目结构

frontend/ (Vue 项目)
├── src/
│   ├── components/
│   │   └── UserList.vue
│   ├── views/
│   │   └── UserManagement.vue
│   ├── App.vue
│   ├── main.js
│   └── api/ (API 调用封装)
│       └── userApi.js
└── ...backend/ (Spring Boot 项目)
├── src/main/java/com/example/demo/
│   ├── controller/UserController.java
│   ├── service/UserService.java
│   ├── repository/UserRepository.java
│   ├── entity/User.java
│   └── DemoApplication.java
└── ...

✅ 2. Spring Boot 后端 API

实体类 User.java

@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String email;// Constructors, Getters, Setters
}

Controller UserController.java

@RestController
@RequestMapping("/api/users")
@CrossOrigin(origins = "http://localhost:5173") // 允许前端域名访问(开发环境)
public class UserController {@Autowiredprivate UserService userService;// GET: 获取所有用户@GetMappingpublic ResponseEntity<List<User>> getAllUsers() {List<User> users = userService.findAll();return ResponseEntity.ok(users);}// POST: 创建用户@PostMappingpublic ResponseEntity<User> createUser(@RequestBody User user) {User savedUser = userService.save(user);return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);}// PUT: 更新用户@PutMapping("/{id}")public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User userDetails) {User updatedUser = userService.update(id, userDetails);if (updatedUser != null) {return ResponseEntity.ok(updatedUser);} else {return ResponseEntity.notFound().build();}}// DELETE: 删除用户@DeleteMapping("/{id}")public ResponseEntity<Void> deleteUser(@PathVariable Long id) {boolean deleted = userService.deleteById(id);if (deleted) {return ResponseEntity.noContent().build();} else {return ResponseEntity.notFound().build();}}
}

✅ 3. Vue 前端调用 API

封装 API 调用 api/userApi.js

import axios from 'axios'// 创建 axios 实例
const apiClient = axios.create({baseURL: 'http://localhost:8080/api', // Spring Boot 后端地址headers: {'Content-Type': 'application/json'}
})export default {// 获取所有用户getUsers() {return apiClient.get('/users')},// 创建用户createUser(userData) {return apiClient.post('/users', userData)},// 更新用户updateUser(id, userData) {return apiClient.put(`/users/${id}`, userData)},// 删除用户deleteUser(id) {return apiClient.delete(`/users/${id}`)}
}

组件 UserManagement.vue

<template><div class="user-management"><h2>用户管理</h2><!-- 添加用户表单 --><el-form :model="newUser" label-width="80px" @submit.prevent="addUser"><el-form-item label="姓名"><el-input v-model="newUser.name" /></el-form-item><el-form-item label="邮箱"><el-input v-model="newUser.email" /></el-form-item><el-form-item><el-button type="primary" @click="addUser">添加用户</el-button></el-form-item></el-form><!-- 用户列表 --><el-table :data="users" style="width: 100%"><el-table-column prop="id" label="ID" width="80" /><el-table-column prop="name" label="姓名" /><el-table-column prop="email" label="邮箱" /><el-table-column label="操作"><template #default="scope"><el-button size="small" @click="editUser(scope.row)">编辑</el-button><el-button size="small" type="danger" @click="deleteUser(scope.row.id)">删除</el-button></template></el-table-column></el-table></div>
</template><script>
import userApi from '@/api/userApi' // 引入 APIexport default {data() {return {users: [], // 存储用户列表newUser: { name: '', email: '' } // 新用户表单数据}},mounted() {this.fetchUsers() // 页面加载后获取用户列表},methods: {// 获取用户列表async fetchUsers() {try {const response = await userApi.getUsers()this.users = response.data} catch (error) {console.error('获取用户失败:', error)// 处理错误(如显示提示)}},// 添加用户async addUser() {if (!this.newUser.name || !this.newUser.email) {// 简单验证return}try {const response = await userApi.createUser(this.newUser)this.users.push(response.data) // 将新用户添加到列表this.newUser = { name: '', email: '' } // 重置表单} catch (error) {console.error('添加用户失败:', error)}},// 删除用户async deleteUser(id) {try {await userApi.deleteUser(id)this.users = this.users.filter(user => user.id !== id) // 从列表中移除} catch (error) {console.error('删除用户失败:', error)}},// 编辑用户 (简化版,实际项目可能用对话框)editUser(user) {// 实现编辑逻辑...console.log('编辑用户:', user)}}
}
</script><style scoped>
.user-management {padding: 20px;
}
</style>

✅ 4. 项目运行

  1. 启动后端:运行 DemoApplication.java,Spring Boot 应用启动在 http://localhost:8080
  2. 启动前端
    cd frontend
    npm install
    npm run dev
    Vite 开发服务器启动在 http://localhost:5173
  3. 访问应用:浏览器打开 http://localhost:5173,即可看到用户管理界面,与后端进行数据交互。

⚠️ 四、关键配置与注意事项(Java 开发者视角)

✅ 1. 跨域问题(CORS)

前后端分离开发时,前端(http://localhost:5173)和后端(http://localhost:8080)端口不同,会遇到跨域问题。

解决方案

  • 后端配置(如上文 @CrossOrigin 注解或全局配置类)。
  • 前端代理(在 vite.config.js 中配置代理,将 /api 请求代理到后端):
    // vite.config.js
    export default defineConfig({server: {proxy: {'/api': {target: 'http://localhost:8080',changeOrigin: true,}}}
    })
    这样前端请求 /api/users 会被代理到 http://localhost:8080/api/users,避免跨域。

✅ 2. 项目部署

  • 后端:将 Spring Boot 项目打包成 jar 或 war,部署到服务器(如 Tomcat)。
  • 前端:使用 npm run build 生成静态文件(dist 目录),将 dist 目录下的文件部署到 Nginx、Apache 等 Web 服务器,或直接放在 Spring Boot 的 static 目录下(简单场景)。

✅ 3. 状态管理(Pinia)

对于复杂应用,组件间共享状态(如用户登录信息、购物车)变得困难。可以使用 Pinia(Vue 3 官方推荐的状态管理库)。

✅ 4. 路由(Vue Router)

实现单页应用(SPA)的页面跳转,需要使用 Vue Router


📊 五、总结:Vue.js 核心要点

概念关键技术说明
核心{{ }}v-modelv-ifv-for@click基础指令
组件<template><script><style>propsemitUI 拆分与复用
响应式ref()reactive()computedwatch数据驱动视图
生态Vue Router (路由), Pinia (状态管理), Vite (构建工具)完整解决方案
UI 框架Element PlusAnt Design VueVuetify快速构建美观界面
通信Axios / Fetch API调用后端 RESTful API

💡 结语

Vue.js 是 Java 开发者迈向全栈之路的绝佳选择。它学习曲线平缓,文档优秀,与 Spring Boot 配合得天衣无缝。

通过本文的实战,你已经掌握了:

  • Vue.js 的核心语法和组件化思想
  • 如何使用 Axios 与 Spring Boot 后端进行 RESTful 交互
  • 前后端分离项目的开发与调试流程

不要停留在“会用”,要动手实践! 尝试将你现有的 JavaWeb 项目前端部分用 Vue 重构,或者开发一个个人博客、后台管理系统。

掌握 Vue,你将解锁更广阔的 Web 开发世界!


📌 关注我,获取更多 Vue 3 + Spring Boot 全栈项目源码、部署教程与面试题解析!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91101.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91101.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/91101.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能体产品化的关键突破:企业智能化转型的“最后一公里”如何迈过?

智能体产品化的关键突破&#xff1a;企业智能化转型的“最后一公里”如何迈过&#xff1f; 在人工智能迅猛发展的当下&#xff0c;智能体&#xff08;Agent&#xff09;成为企业数字化转型的新引擎。无论是市场分析、客户服务&#xff0c;还是自动化办公&#xff0c;智能体都被…

Rust × Elasticsearch官方 `elasticsearch` crate 上手指南

1 为什么选择官方 Rust 客户端&#xff1f; 语义化兼容&#xff1a;客户端 主版本 与 ES 主版本 严格对应&#xff0c;8.x 客户端可对接任何 8.x 服务器&#xff1b;不存在跨主版本兼容承诺 (docs.rs)100% API 覆盖&#xff1a;稳定 API 全量映射&#xff0c;Beta/实验特性可按…

怎样画流程图?符号与流程解构教程

在数字化办公和项目管理日益复杂的当下&#xff0c;流程图早已不是工程师、项目经理的专属工具&#xff0c;它正快速成为每一位职场人提升表达效率、理清工作逻辑的利器。无论是软件开发中的流程规范、产品设计阶段的用户路径&#xff0c;还是企业内部的审批流程、团队协作机制…

vue3 + vite || Vue3 + Webpack创建项目

1.vue3 vite搭建项目方法 &#xff08;需要提前装node,js&#xff09; 1. 使用官方 create-vite 工具&#xff08;推荐&#xff09; 1.使用npm----------------------------- npm create vuelatest2.使用pnpm----------------------------- pnpm create vuelatest3.使用yarn--…

Vue2-封装一个含所有表单控件且支持动态增减行列的表格组件

效果1. 无编辑权限&#xff1a;显示普通表格2. 有编辑权限&#xff1a;根据配置显示编辑控件3. 可以动态新增行&#xff0c;也可以动态新增列 核心代码无权限情况的核心代码<!-- 无编辑权限时显示普通表格 --><el-tablev-if"!hasEditPermission"ref"ta…

网络原理 - TCP/IP(一)

目录 1. 应用层&#xff1a;用户与网络的 “交互窗口” 1.1 应用层协议&#xff1a;规范交互的 “通用语言” 1.2 自定义协议&#xff1a;适配特殊需求的 “专属规则” 1.3 应用层数据格式&#xff1a;让数据 “说得明白” 1.3.1 XML&#xff1a;结构化但繁琐的 “老…

Orange的运维学习日记--16.Linux时间管理

Orange的运维学习日记–16. Linux时间管理 文章目录Orange的运维学习日记--16. Linux时间管理系统与硬件时钟时钟类型对比查看内核支持的时钟源本地时间调整使用 date 查看与设置一次性同步&#xff1a;ntpdate同步到硬件时钟&#xff1a;hwclock基于 systemd 的 timedatectl交…

Git 与 GitHub 的对比与使用指南

Git 与 GitHub 的对比与使用指南 在软件开发中&#xff0c;Git 和 GitHub 是两个密切相关但本质不同的工具。下面我将逐步解释它们的定义、区别、核心概念以及如何协同使用&#xff0c;确保内容真实可靠&#xff0c;基于广泛的技术实践。 1. 什么是 Git&#xff1f; Git 是一个…

20250726-4-Kubernetes 网络-Service DNS名称解析_笔记

一、Service DNS名称 1. 例题:通信需求 通信场景:项目A中的Pod需要与项目B中的Pod进行通信,直接使用Pod IP不可行,因为Pod IP会随着Pod生命周期变化。 解决方案:通过Service提供的稳定IP地址进行通信,不受Pod重建、扩容/缩容等操作影响。 2. CoreDNS介绍  基本功能…

vscode 登录ssh记住密码直接登录设置

第一种情况在系统已经生成密钥对的情况下&#xff1a;点击这里的设置第二步&#xff1a;第三步&#xff1a;没有填写的给填写一下第四步骤&#xff1a;保存后进入选择这个点开第五步&#xff1a;去Linux终端下输入这个命令就OK了echo "ssh-rsa内容" >> ~/.ssh/…

Nginx 动静分离配置(详细版)

本文介绍了Nginx 动静分离相关配置&#xff0c;主要包括了配置文件创建、配置示例、配置原理解析以及重新启用配置文件等等 本文目录1. 创建 Nginx 配置文件2. 配置示例3. 配置原理解析4. 启用配置文件并重新加载 Nginx1. 创建 Nginx 配置文件 在 /etc/nginx/sites-available …

C# CAN通信上位机系统设计与实现

C# CAN通信上位机系统设计与实现 C# CAN通信上位机程序&#xff0c;支持多种CAN适配器&#xff0c;提供数据收发、协议解析、数据可视化等功能。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; usi…

Ubuntu20.04子系统

常用 # 导出分发版到 E盘 wsl --export Ubuntu-20.04 E:\wsl-ubuntu20.04.tar # 注销原有分发版 wsl --unregister Ubuntu-20.04 # 导入到 E盘的新路径&#xff08;例如 E:\WSL\Ubuntu-20.04&#xff09; wsl --import Ubuntu-20.04 E:\WSL\Ubuntu-20.04 E:\wsl-ubuntu20.04.t…

【设计模式】状态模式 (状态对象(Objects for States))

状态模式&#xff08;State Pattern&#xff09;详解一、状态模式简介 状态模式&#xff08;State Pattern&#xff09; 是一种 行为型设计模式(对象行为型模式)&#xff0c;它允许一个对象在其内部状态改变时改变其行为。换句话说&#xff0c;对象看起来好像修改了它的类。 你…

工业前端组件库重构心法:如何让开发效率提升60%的交互模块设计逻辑

工业前端组件库重构心法&#xff1a;如何让开发效率提升60%的交互模块设计逻辑内容摘要在工业项目开发中&#xff0c;前端组件库是提升开发效率的关键。然而&#xff0c;许多团队的组件库存在设计不合理、维护困难等问题&#xff0c;导致开发效率低下。如果能够重构组件库&…

leetcode 74. 搜索二维矩阵

二分查找经典题目&#xff1b;根据矩阵的特点&#xff0c;不需要把矩阵拉成一维&#xff0c;二维转成一维映射关系为a[i]matrix[⌊i//n⌋][i%n]&#xff1b;然后开始二分查找&#xff0c;一直二分的收缩区间&#xff1b;class Solution:def searchMatrix(self, matrix: List[Li…

26考研英语词汇的逻辑笔记(Unit31-43)

行为UNIT 31词汇数量&#xff1a;274 词群数量&#xff1a;16 词群逻辑&#xff1a;行为举止 | 行为标准与原则 给予、收回 | 接受、允许、让步、拒绝 促进、鼓励 | 支持、帮助、资助 破坏相关 | 错误、改正 阻碍、打扰相关 | 禁止、阻止、限制 值得、有利、不利相关 | 有意、故…

Lua(数据库访问)

Lua 数据库访问方法Lua 本身不提供内置的数据库访问功能&#xff0c;但可以通过第三方库实现与多种数据库的交互。以下是常见的 Lua 数据库访问方法&#xff1a;使用 LuaSQL 库LuaSQL 是一个轻量级数据库访问库&#xff0c;支持多种数据库后端&#xff08;MySQL、PostgreSQL、S…

在 Dell PowerEdge T440 上通过 iDRAC9 安装 Proxmox VE

在 Dell PowerEdge T440 上通过 iDRAC9 安装 Proxmox VE 文章目录 在 Dell PowerEdge T440 上通过 iDRAC9 安装 Proxmox VE 1. 前置要求 1.1. 硬件信息(例) 1.2. 准备工作 2. 安装步骤 2.1. 登录 iDRAC9 2.2. 启动虚拟控制台 2.3. 挂载 Proxmox VE ISO 2.4. 设置服务器从虚拟…

window下MySQL安装(三)卸载mysql

window下MySQL安装&#xff08;三&#xff09;卸载mysql 卸载mysql数据库&#xff0c;停止服务&#xff0c;备份文件&#xff0c;删除mysql文件。结束。 停止mysql服务 以管理员身份打开命令提示符或 PowerShell&#xff1a; net stop <服务名称> 示例&#xff1a;net st…