Vue中Get与Post 后台接收不到参数问题

本文详细解析了前后端开发中GET与POST请求的使用场景与数据传递方式。GET请求适用于传递简单参数,如分页和搜索条件;而POST请求则用于发送对象数据,如登录信息。文章通过具体代码示例展示了如何在前端Vue项目中发起请求,并在后端Java Spring Boot项目中接收这些数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.如果使用post,传递的则是对象

前台

function(){
      this.$http({
        url: this.$http.adornUrl("/sys/loginById"),
        method: "post",
        data: this.$http.adornData({
          id: 'MTIz'
        })
      }).then(({ data }) => {

后台 使用@RequestBody SysLoginForm form接收,或者@RequestBody HashMap<String, String> map

@PostMapping("/sys/loginById")
	public Map<String, Object> loginById(@RequestBody HashMap<String, String> map)throws IOException {

2.如果使用get,传递的是相对单个参数

前台

getDataList() {
      this.dataListLoading = true;
      this.$http({
        url: this.$http.adornUrl("/flowline/doscript/list"),
        method: "get",
        params: this.$http.adornParams({
          page: this.pageIndex,
          limit: this.pageSize,
          key: this.dataForm.key
        })
      }).then(({ data }) => {

后台接收使用@RequestParam Map<String, Object> params

@GetMapping("/sys/loginById")
	public Map<String, Object> loginById(@RequestParam String id)throws IOException {
<think>我们参考用户提供的四个引用,针对问题vue接收后台数据但页面不显示”进行分析。根据引用[2]:当数据为对象,我们增加或删除对象属性时,视图并不触发更新。这是因为Vue的响应式系统在初始化实例时对属性执行getter/setter转化,之后添加的属性不是响应式的。引用[4]提到,axiospost默认发送的是JSON数据,而后端可能无法正确解析,导致后台接收不到数据,进而返回的数据可能不是前端期望的,也会导致前端显示问题。结合用户问题,可能的原因及解决方案如下:原因1:Vue的响应式限制如果我们在已有的响应式对象上直接添加新的属性,这个属性不是响应式的,因此数据变化不会触发视图更新。例如:data中有一个对象obj:{a:1},然后我们动态添加属性b:this.obj.b=2,这样添加的b不是响应式的。解决方案1:使用Vue.set(object,key,value)或者this.$set(object,key,value)例如:this.$set(this.obj,&#39;b&#39;,2)或者使用Object.assign创建一个新对象,然后替换原对象:this.obj=Object.assign({},this.obj,{b:2})原因2:后端数据接收问题(导致返回数据异常)根据引用[1]和[4],axiospost默认发送的数据是JSON格式(Content-Type:application/json),而后端如果是JSP或者SpringMVC且没有使用@RequestBody,可能无法正确解析请求体中的数据,导致后台没有收到数据,返回的数据可能为空或者错误。解决方案2:调整axios的请求配置,使用合适的Content-Type,并序列化数据。例如,如果后端需要表单形式(application/x-www-form-urlencoded),可以使用Qs库序列化数据,并设置Content-Type。示例代码(参考引用[3]):```javascriptaxios({method:"post",url:"/api",data:{name:&#39;test&#39;},transformRequest:[function(data){returnQs.stringify(data);//将数据转换为表单格式}],headers:{&#39;Content-Type&#39;:&#39;application/x-www-form-urlencoded&#39;}}).then(response=>{//处理响应});```或者使用axios的另一种写法:```javascriptaxios.post(&#39;/api&#39;,Qs.stringify({name:&#39;test&#39;}),{headers:{&#39;Content-Type&#39;:&#39;application/x-www-form-urlencoded&#39;}}).then(response=>{//处理响应});```原因3:异步数据更新后,Vue检测不到变化(例如,数组更新问题)除了对象属性的添加,数组的某些变化Vue也不能检测到,例如直接通过索引设置数组项(this.items[index]=newValue),或修改数组长度(this.items.length=0)。解决方案3:对于数组,使用Vue的变异方法(push,pop,shift,unshift,splice,sort,reverse)或者使用Vue.set。例如:this.$set(this.items,index,newValue)原因4:数据层级过深,或者更新过程在Vue无法追踪的时机(例如在异步回调中未进行正确处理)虽然Vue在数据变化时自动更新视图,但在异步操作(如定时器、网络请求)中更新数据,Vue可以检测到,但注意如果更新的是非响应式属性则不会更新视图。解决方案4:确保在异步回调中修改的数据是响应式的,或者使用Vue.set。原因5:其他常见原因-数据确实未正确返回(网络错误,后台返回数据格式错误等)-前端渲染逻辑问题(比如用v-if判断,条件不满足等)-使用了计算属性或过滤器,但未正确处理数据解决方案5:-检查网络请求是否成功,以及返回数据是否符合预期(可以在axios的then回调中打印结果)-检查模板中的绑定是否正确,检查是否有条件渲染阻止了显示综上,针对该问题,我们首先需要确定问题出现在请求阶段还是响应阶段,还是在数据渲染阶段。步骤:1.在axios的回调中,打印返回的数据,看是否成功获取数据。2.如果数据返回正确,检查在赋Vue实例的数据属性时,是否遵循了响应式要求(比如是否是动态添加的属性)。3.检查模板绑定是否正确。如果发现是响应式问题,则使用上述的set方法;如果是请求问题,则调整请求配置。示例:假设我们有一个列表数据list,从后台获取数据后赋。```javascriptdata(){return{list:[]//初始化一个空数组,Vue会将其设置为响应式};},mounted(){axios.get(&#39;/api/list&#39;).then(response=>{//正确返回,假设返回的数据是一个数组this.list=response.data;//直接替换数组,是响应式的}).catch(error=>{console.error(error);});}```但是,如果我们在获取数据后,需要往一个已经存在的对象上添加属性,就要用set:```javascriptdata(){return{user:{id:1,name:&#39;Tom&#39;}};},mounted(){axios.get(&#39;/api/userinfo&#39;).then(response=>{//假设返回的数据中包含age属性//这样添加属性是响应式的this.$set(this.user,&#39;age&#39;,response.data.age);});}```如果问题仍然存在,需要检查后端接口是否正常,以及前端网络请求是否正常发送。以上是常见原因和解决方案。</think> 根据引用内容,Vue 接收后台数据但页面不显示的核心原因是 **响应式数据更新机制失效** 或 **前后端数据格式不匹配**。以下是详细原因和解决方案: --- ### 常见原因及解决方案 #### 1. **Vue 响应式系统限制**(核心问题) 当给对象动态添加新属性时,Vue 无法自动触发视图更新(引用[2])。 **代码示例**: ```javascript data() { return { obj: { name: "Tom" } }; }, methods: { fetchData() { // 错误:直接添加新属性,页面不更新 this.obj.age = 25; } } ``` **✅ 解决方案**: - 使用 `Vue.set` 或 `this.$set`: ```javascript this.$set(this.obj, &#39;age&#39;, 25); // 动态添加响应式属性 ``` - 替换整个对象: ```javascript this.obj = { ...this.obj, age: 25 }; // 创建新对象触发更新 ``` #### 2. **axios 数据格式错误** Vue 默认用 JSON 格式发送 POST 请求,但后端可能无法解析(引用[3][4])。 **代码症状**: ```javascript axios.post("/api", { name: "Tom" }); // 默认Content-Type: application/json ``` **✅ 解决方案**: 将数据转换为表单格式(`application/x-www-form-urlencoded`): ```javascript import Qs from &#39;qs&#39;; axios.post("/api", Qs.stringify({ name: "Tom" }), { headers: { &#39;Content-Type&#39;: &#39;application/x-www-form-urlencoded&#39; } }); ``` #### 3. **后端未正确解析数据** 若后端使用 Spring Boot,需添加 `@RequestBody` 注解(引用[1]): **Java 代码修正**: ```java @PostMapping("/api") public ResponseEntity<?> getData(@RequestBody Map<String, String> data) { // 正确接收JSON数据 } ``` #### 4. **异步数据未及时渲染** 未处理 axios 的异步特性,导致模板在数据返回前渲染。 **✅ 解决方案**: - 使用 `v-if` 控制显示时机: ```html <div v-if="dataLoaded">{{ obj.age }}</div> ``` - 在 `axios.then()` 中更新状态: ```javascript axios.get("/api").then(res => { this.obj = res.data; this.dataLoaded = true; // 触发视图更新 }); ``` --- ### 排查流程图 ```mermaid graph TD A[页面不显示数据] --> B{检查控制台网络请求} B --> |请求失败| C[检查axios URL/参数错误] B --> |请求成功| D{检查响应数据结构} D --> |数据返回正常| E[检查Vue数据是否响应式] E --> |动态添加属性| F[使用this.$set] E --> |初始化未定义| G[提前声明data属性] D --> |数据为空| H[检查后端参数接收] H --> |Spring Boot| I[添加@RequestBody注解] ``` --- ### 补充建议 1. **深拷贝更新数组**: ```javascript this.list = [...res.data]; // 替代 this.list = res.data ``` 2. **强制更新(慎用)**: ```javascript this.$forceUpdate(); // 强制重新渲染组件 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值