)
前言绝大多数 Java 后端只懂写接口看不懂 Vue 页面报错、分不清前后端数据流转、遇到跨域 / 传参 / 状态存储问题只会甩锅前端。 本文站后端视角讲解 Vue 核心语法不堆砌花哨前端特效全部围绕「接口联调、数据交互、报错排查、前后端分离架构」展开覆盖 Vue2 Options API、Vue3script setup主流写法、指令、组件传参、生命周期、Axios 请求、Pinia/Vuex 状态库、路由、跨域、部署 SPA 单页坑点。 看完能看懂前端代码、快速定位接口联调 bug、看懂前端日志、独立简单修改页面、面试回答前后端分离相关 Vue 问题。一、Vue 基础核心概念1. Vue 是什么渐进式 JavaScript 前端框架核心响应式数据绑定后端返回 JSON 数据前端变量修改页面自动刷新无需手动操作 DOM。2. Vue2 与 Vue3 核心差异表格维度Vue2Options APIVue3Composition API script setup后端关联影响响应式原理Object.defineProperty劫持属性无法监听对象新增属性、数组下标修改需Vue.setProxy代理整个对象数组 / 对象动态修改自动响应前端接收后端分页数组Vue2 下标赋值不刷新页面代码结构拆分data/methods/computed/watch逻辑分散按业务聚合逻辑setup统一导出变量方法查看接口请求代码 Vue3 更容易定位根节点template 只能一个根 div多根 Fragment无需外层容器页面结构更简洁双向绑定v-model 仅基础表单defineModel简化父子组件双向传参表单提交后端接收参数逻辑一致工具链Vue CLIWebpackVite启动 / 打包速度更快本地开发代理配置写法不同状态管理VuexPinia推荐无 mutations全局存储登录 token、用户信息3. 前后端数据流转完整链路前端页面触发点击 / 加载事件 → Axios 发起 HTTP 请求请求携带token、表单参数、分页参数传给后端 ControllerSpringBoot 接收 JSON / 表单参数业务处理返回统一 JSONVue 接收响应赋值给页面响应式变量页面自动渲染列表、弹窗操作完成刷新页面、清空表单、跳转路由。二、模板基础语法1. 插值表达式{{ }}用于渲染后端返回数据支持简单 JS 表达式不能写 if/for 语句vue!-- 渲染后端返回用户名称 -- div{{ user.username }}/div !-- 表达式运算后端数字分页常用 -- div第{{ pageNum }}页 / 共{{ total }}条/div !-- 三元判断状态渲染后端0/1/2转文字 -- div{{ status 0 ? 未启用 : 已启用 }}/div后端常见场景字典状态、分页数字、金额展示。2. 原生 HTML 渲染 v-html后端返回富文本、商品详情 HTML 时使用存在 XSS 安全风险后端需过滤恶意标签vuediv v-htmlgoods.content/div3. 单向绑定 v-bind / :将后端数据绑定标签属性地址、图片、class、禁用状态简写:vue!-- 绑定图片地址后端返回图片URL -- img :srcuser.avatar / !-- 按钮禁用后端status0则不可提交 -- button :disabledstatus 0提交/button !-- 动态class后端控制样式 -- div :class{ active: isVip }/div三、核心指令大全后端联调高频出现1. 条件渲染 v-if /v-showv-ifDOM 直接销毁 / 创建频繁切换不推荐v-showCSS 隐藏 display:noneDOM 保留适合弹窗、按钮切换vue!-- 后端无数据展示空提示 -- div v-iftableData.length 0暂无数据/div !-- 权限控制后端返回角色admin才显示删除按钮 -- button v-ifrole admin删除/button后端排错场景接口返回空数组页面空白找不到空提示检查 v-if 判断条件。2. 列表循环 v-for分页列表核心渲染后端分页返回数组必须绑定唯一 key优先使用数据库主键 id禁止只用 indexvue!-- tableData是后端分页接口返回List -- tr v-foritem in tableData :keyitem.id td{{ item.orderNo }}/td td{{ item.createTime }}/td /tr后端踩坑点key 用 index编辑删除列表顺序错乱后端返回数组为 null前端直接报错前端需做判空tableData?.length。3. 事件绑定 v-on / 监听点击、输入、提交事件简写所有接口请求、表单提交都写在 methods 函数内vue!-- 查询按钮触发分页接口 -- button clicksearchList查询/button !-- 传参把当前行id传给删除接口 -- button clickdelItem(item.id)删除/button !-- 表单回车提交 -- input keyup.entersearchList /事件修饰符.prevent阻止表单默认提交避免页面刷新.stop阻止事件冒泡.trim输入框自动去除首尾空格后端不用额外处理空格vue!-- 表单提交阻止默认刷新 -- form submit.preventsubmitForm/form4. 双向绑定 v-model表单交互核心语法糖 :valueinput表单输入和前端变量双向同步后端接收表单参数全部依赖它 修饰符.trim去除空格.number自动转数字.lazy失焦再更新vue!-- 搜索框绑定查询参数 -- input v-model.trimquery.username placeholder用户名 !-- 数字输入框后端接收Integer -- input v-model.numberquery.age后端坑点前端数字输入框不传.number传给后端是字符串类型转换报错。四、计算属性 computed 监听器 watch数据处理1. computed 计算属性优先使用基于后端原始数据衍生新值自带缓存依赖不变不会重复执行 适用后端数字格式化、状态文字转换、列表过滤vueconst statusText computed(() { const map {0:禁用,1:正常,2:锁定} return map[user.status] || 未知 })2. watch 侦听器监听变量变化执行异步操作接口请求无缓存 适用搜索框输入实时查询、路由切换重新加载列表vue// 监听分页参数变化自动刷新列表 watch(() query.pageNum, () { getTableList() })五、组件通信前后端参数传递高频场景大型后台管理系统全靠组件拆分后端要看懂父子组件传参理清接口参数来源。1. 父传子 Props页面给弹窗传 ID、数据父组件传递后端查询到的数据子组件接收使用 子组件接收定义vue// Vue3 script setup const props defineProps({ userId: Number, orderInfo: Object })父组件调用子组件vueOrderDetail :userIdcurrentId :orderInfoorderData /后端坑后端返回 Long 类型 id前端传数字精度丢失统一转字符串传递。2. 子传父 emit弹窗点击提交通知父刷新列表子组件操作完成新增 / 编辑通知父组件重新调用分页接口刷新数据vue// 子组件 const emit defineEmits([refresh]) // 提交成功触发 emit(refresh)父组件监听事件vueEditDialog refreshgetTableList /3. 全局状态 PiniaVue3 主流替代 Vuex存储全局公共数据登录 token、用户信息、菜单权限、全局字典所有接口请求自动携带 token 根源基础示例js运行// stores/user.js import { defineStore } from pinia export const useUserStore defineStore(user,{ state: () ({ token: , userInfo: {} }), actions: { setToken(t) { this.token t } } })后端对接重点Axios 请求拦截器从 pinia 读取 token 放入请求头Authorization后端 JWT 校验 token过期前端跳转登录页登录接口成功后端返回 token前端存入 pinia 持久化 localStorage。六、生命周期钩子看懂页面接口请求时机生命周期是组件从创建到销毁全过程所有页面初始化加载接口都写在对应钩子后端排错必看。Vue3 script setup 常用钩子onMounted组件 DOM 渲染完成最常用页面加载自动请求分页列表、字典接口vueimport { onMounted } from vue onMounted(() { // 页面打开立刻调用后端分页接口 getTableList() // 加载下拉字典 getDictList() })onCreated组件创建完成DOM 未生成仅初始化变量onUnmounted组件销毁关闭弹窗、取消请求onUpdated数据更新 DOM 刷新极少使用。后端排错场景页面打开空白无数据 → 检查onMounted是否调用接口、接口 401/500 报错 弹窗关闭后数据残留 → 未在 onUnmounted 清空表单。七、Axios 网络请求后端对接核心重中之重Vue 通过 Axios 发起 HTTP 请求前后端交互唯一通道所有跨域、传参、token、统一返回体问题全部在这里。1. 基础封装模板项目通用j运行import axios from axios import { useUserStore } from /stores/user const service axios.create({ baseURL: import.meta.env.VITE_API_URL, timeout: 10000 }) // 请求拦截器自动携带token service.interceptors.request.use(config { const userStore useUserStore() if(userStore.token) { config.headers.Authorization Bearer ${userStore.token} } return config }) // 响应拦截器统一处理后端返回码 service.interceptors.response.use(res { const data res.data // 后端统一返回体 code 200成功401未登录 if(data.code 401) { // 清除token跳转登录 userStore.logout() } return data }, err { // 500/404统一弹窗提示 ElMessage.error(接口请求失败) }) export default service2. 三种传参方式后端接收参数对应GET 请求拼接 URL 参数分页、查询条件js运行// 后端RequestParam接收 api.get(/order/list, { params: { pageNum:1, pageSize:10, username: 张三 } })POST 表单 JSON新增 / 编辑后端 RequestBodyjs运行api.post(/order/save, { orderNo: OD20260701, userId: 10001, status: 1 })路径参数 /order/{id}后端 PathVariablejs运行api.delete(/order/${id})3. 开发环境跨域代理Vite 配置前端本地开发避免 CORS 跨域后端无需临时配置 CrossOriginjs运行// vite.config.js export default defineConfig({ server: { proxy: { /api: { target: http://127.0.0.1:8080, // 后端地址 changeOrigin: true, rewrite: path path.replace(/^\/api/, ) } } } })4. 生产跨域两种方案后端全局 CORS 配置SpringBootNginx 反向代理部署标准方案80 端口统一转发前端静态 后端接口。八、Vue Router 路由SPA 单页核心后端部署 404 根源1. 两种路由模式hashURL 带 #无需后端配置刷新不会 404history无 #美观刷新页面 Nginx 必须配置 rewrite否则 404你之前部署前端 Nginx 核心配置。 history 模式 Nginx 关键配置nginxlocation / { root /usr/share/nginx/html/admin; index index.html; try_files $uri $uri/ /index.html; }2. 路由传参两种方式query 传参/order?userId1001后端接口可读取 URL 参数params 动态路由/order/1001路径参数。3. 路由守卫全局权限拦截路由跳转前校验 token无 token 强制跳登录对应后端登录认证逻辑。js运行router.beforeEach((to, from, next) { const token useUserStore().token if(!token to.path ! /login) { next(/login) } else { next() } })九、表单与校验后端接收参数校验配合Element Plus / Ant Design Vue 表单基于 v-model 绑定前端预校验后端二次校验保证安全。vueel-form :modelform :rulesrules el-form-item label用户名 propusername el-input v-modelform.username/el-input /el-form-item /el-form script setup const form ref({ username: }) // 前端基础校验后端必须重复校验 const rules { username: [{ required: true, message: 用户名不能为空 }] } /script后端规范前端校验仅提升体验不能替代后端参数校验、长度、格式、合法性校验。十、Vue 前后端分离高频问题 后端解决方案1. 跨域 CORS 报错原因浏览器同源策略前端域名 / 端口与后端不一致 解决开发环境 Vite 代理生产 Nginx 反向代理后端全局 CORS 配置。2. 刷新页面 404原因history 路由模式Nginx 找不到对应静态资源 解决Nginx 增加try_files $uri $uri/ /index.html。3. 前端传数字后端接收字符串原因v-model 输入框默认字符串数字加.number修饰符。4. 分页列表删除 / 编辑后页面不刷新原因子组件 emit 事件未触发父接口重新请求或未清空查询条件。5. Token 过期 401 未跳转登录原因Axios 响应拦截未捕获 401 状态码未清空全局 pinia token。6. 后端返回 Long 雪花 ID 前端精度丢失解决方案后端序列化转字符串返回前端不处理大数字。7. v-for 列表删除后顺序错乱原因 key 使用 index改为数据库唯一主键 id。十一、Vue2 Options API 快速对照很多老后台系统还是 Vue2后端需要看懂基础写法vuescript export default { data() { return { tableData: [], query: { pageNum:1, pageSize:10 } } }, mounted() { this.getList() }, methods: { async getList() { const res await this.$api.get(/user/list, {params: this.query}) this.tableData res.data.records } } } /script核心区别所有变量方法通过this.调用无 setup 语法糖。十二、后端学习 Vue 核心总结基础模板语法插值、v-bind、v-if、v-for、v-model看懂页面数据渲染事件与 Axios 请求理清前端如何调用后端接口、传参三种格式Pinia 全局状态理解 token、用户信息存储与请求头携带逻辑组件传参看懂弹窗、子页面数据来源生命周期 onMounted页面初始化加载接口时机Vue Router history 模式掌握 Nginx 部署修复 404 配置跨域、精度丢失、token 过期等联调问题解决方案。结语后端不需要精通 Vue 页面开发但必须掌握数据流转、接口请求、路由部署、常见报错根源四大块知识。 日常开发中 80% 前后端扯皮问题本质是后端不理解 Vue 数据绑定、请求逻辑、路由机制导致。掌握本文语法后联调排错效率大幅提升同时面试前后端分离架构、Nginx 部署、跨域问题都能完整作答。