若依学习 后端传过来的数据在控制台打印为空

导言:

  在做若依二次开发时遇到个没见过的bug,用了一些时间排,发现有自己没学过的东西。所以记录一下。后端用的是c#的asp.net core

问题描述:

   后端穿过来的有数据的参数(数组)roleIds在控制台打印为空

后端字段定义:

后端数据:

前端方法:

在...\src\views\system\user\index.vue的修改按钮

    /** 修改按钮操作 */
    handleUpdate(row) {
      console.log("row",row);
      
      this.reset();
      const userID = row.userID || this.ids;
      console.log("修改按钮操作userID",userID);
      
      // getUserProfile(userID).then(response => {
        GetUserUpdateInfo(userID).then(response => {
          console.log("用户修改responseresponse",response);
        
        this.form = response.data;
        this.postOptions = response.posts;
        this.roleOptions = response.roles;
        // this.$set(this.form, "postIds", response.postIds);
        this.$set(this.form, "roleIds", response.roleIds);
        this.open = true;
        this.title = "修改用户";
        this.form.password = "";
      });
    },
打印与问题:

控制台网络

拦截器打印:

在...\src\utils\request.js

// 响应拦截器
service.interceptors.response.use(res => {
  console.log("响应拦截器",res);
...

方法响应值打印:

...
// getUserProfile(userID).then(response => {
        GetUserUpdateInfo(userID).then(response => {
          console.log("用户修改responseresponse",response);
...

可以看到,在控制台的网络中后端传来的roleIds数组是有值的,但是在拦截器和方法响应数据中却变成了空数组。

解决过程:

    有仔细检查过整个流程,确认了不是后端问题。也有尝试跟踪过从后端到前端拦截器过程数据的变化,但很少有这方面的经验,也没找到问gpt给的三个情况的执行顺序:

1.浏览器控制台中网络模块检测到请求的返回值并展示。

2.前端定义的拦截器接收响应并打印到控制台。

3.请求方法接收到响应数据并打印完整响应对象。

之后想着把名字换换,我c,又有数据了,猜测是若依对roleIds字段做了些事。

后面排到了,发现这个

this.$set(this.form, "roleIds", response.roleIds);

在...\src\views\system\user\index.vue的修改方法里,把它注释掉之后即使名字还是roleIds,也能展示出数据

    /** 修改按钮操作 */
    handleUpdate(row) {
      console.log("row",row);
      
      this.reset();
      const userID = row.userID || this.ids;
      console.log("修改按钮操作userID",userID);
      
      // getUserProfile(userID).then(response => {
        GetUserUpdateInfo(userID).then(response => {
          console.log("完整响应对象:", response);

        this.form = response.data.data;
        // this.postOptions = response.posts;
        this.roleOptions = response.data.roles;
        // this.$set(this.form, "postIds", response.postIds);
        // this.$set(this.form, "roleIds", response.roleIds);
        ...

.....很神奇

this.$set()介绍:

this.$set() 是 Vue.js 提供的一个方法,用于向 Vue 实例的响应式对象中动态添加新属性。这在 Vue 的响应式系统中非常重要,因为 Vue 默认只会对已存在的属性进行观察,如果直接赋值新属性,Vue 无法自动检测到这个变化。

this.$set(target, propertyName, value);
  • target: 目标对象,通常是 Vue 组件的 data 中的对象。
  • propertyName: 要添加的属性名,可以是字符串或符号。
  • value: 要设置的值。

注意事项

  1. 响应式系统:

    • 使用 this.$set() 可以确保新添加的属性是响应式的。如果直接用 this.user.age = 25,Vue 不会检测到 age 的变化。
  2. 避免性能问题:

    • 过多地使用 this.$set() 会增加 Vue 实例的复杂性和性能开销,因此应尽量在需要时使用。
  3. 数组的响应式更新:

    • 对于数组,Vue 也提供了一些特定的方法来确保响应式更新,例如 this.$set(array, index, value) 可以用来替代 array[index] = value
  4. 兼容性:

    • this.$set() 是 Vue 2.x 的方法。在 Vue 3.x 中,由于其响应式系统的改进,使用 reactiveref 方式进行状态管理,不再需要使用 this.$set()
  5. 异步更新:

    • 在 Vue 中,数据的更新是异步的,因此在更新后立即访问新的属性时,可能需要使用 nextTick 来确保 DOM 已更新。

具体原因

还没搞清楚,应该和同步异步有关。具体的话等以后有时间了在看看吧。如果有大佬知道的也可以指点一下。

解决:

将this.$set();注释掉,直接赋值即可

    /** 修改按钮操作 */
    handleUpdate(row) {
      console.log("row",row);
      
      this.reset();
      const userID = row.userID || this.ids;
      console.log("修改按钮操作userID",userID);
      
      // getUserProfile(userID).then(response => {
        GetUserUpdateInfo(userID).then(response => {
          console.log("完整响应对象:", response);

        this.form = response.data.data;
        // this.postOptions = response.posts;
        this.roleOptions = response.data.roles;
        console.log("this.roleOptions",this.roleOptions);
        //这里直接赋值
        this.form.roleIds = response.data.roleIds
        // this.$set(this.form, "postIds", response.postIds);
        // this.$set(this.form, "roleIds", response.roleIds);


        this.open = true;
        this.title = "修改用户";
        this.form.password = "";
      });
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/902425.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【热门主题】000010 深入 Vue.js 组件开发

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…

初见Linux:权限篇

一.权限的定义: 什么是权限?所谓权限在现实中就是权力限制,是对于人,不同人所扮演的角色有着不同的权限。那么在Linux中也存在权限。权限角色事物属性。那么对于一件事情能否去执行以及完成都需要权限。 二.Linux中的用户 2.1:r…

【SpringMVC】web服务器,访问失败的问题,SpringMVC,建立连接,请求

【web服务器】 web服务器可以对http协议进行封装,程序员不需要直接对http协议进行操作(不需要去写复杂的网络编程代码),让web开发更加便捷,所以它也有「WWW服务器」的称呼 常见的web服务器:Tomcat,Jboss&…

华为配置 之 STP

目录 简介: STP: RSTP: 如何改变根网桥: (1)改变优先级: (2)改变root: 各端口的状态: 总结: 简介: STP(Spanning Tree Protoco…

深度学习:Matplotlib篇

一、简介 1.1 什么是 Matplotlib? Matplotlib 是一个广泛使用的 2D 绘图库,它可以用来在 Python 中创建各种静态、动态和交互式的图表。无论是科学计算、数据可视化,还是深度学习模型的训练与评估,Matplotlib 都能提供强大的图形…

虚拟现实新纪元:VR/AR技术将如何改变娱乐与教育

内容概要 在当今科技飞速发展的时代,虚拟现实(VR)和增强现实(AR)技术不仅让我们的娱乐体验如虎添翼,更为教育变革注入了新活力。这些技术的飞跃进展,将原本平淡无奇的场景转变为令人沉醉的沉浸…

深入浅出 C++ STL:解锁高效编程的秘密武器

引言 C 标准模板库(STL)是现代 C 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知…

面向对象编程中类与类之间的关系(一)

目录 1.引言 2."有一个"关系 3."是一个"关系(继承) 4.“有一个”与“是一个”的区别 5.not-a关系 6.层次结构 7.多重继承 8.混入类 1.引言 作为程序员,必然会遇到这样的情况:不同的类具有共同的特征,至少看起来彼…

JavaWeb——Web入门(1/9)-Spring Boot Web介绍(Spring家族,Spring Boot)

目录 Spring家族 Spring Boot 在我们了解完了 Maven 这款项目构建工具的基本使用之后,接下来我们正式的进入到 Web 后端开发的学习。 第一篇章要了解的是 Spring Boot Web 的入门。 在正式开始之前,我们先需要介绍一下什么是 Spring 以及什么是 Spri…

H3C Hybrid 实验

实验拓扑 图 1-1 注:如无特别说明,描述中的 R1 或 SW1 对应拓扑中设备名称末尾数字为 1 的设备,R2 或 SW2 对应拓扑中设备名称末尾数字为 2 的设备,以此类推;另外,同一网段中,IP 地址的主机位为…

【NOI】C++函数入门二(自定义函数)

文章目录 前言一、概念1.导入1.1 首先什么是函数呢? 2.函数分类3.为什么要定义函数呢?4.函数结构5.函数使用注意事项 二、例题讲解问题:1137 - 纯粹素数问题:1258 - 求一个三位数问题:1140 - 亲密数对问题:…

Flutter仿京东商城APP实战 用户中心基础布局

用户中心界面 pages/tabs/user/user.dart import package:flutter/material.dart; import package:jdshop/utils/zdp_screen.dart; import package:provider/provider.dart;import ../../../store/counter_store.dart;class UserPage extends StatefulWidget {const UserPage…

如何在Node.js中执行解压缩文件操作

一、解压文件 1.安装依赖: 安装adm-zip依赖包:npm install adm-zip --save 安装iconv-lite依赖包:npm install iconv-lite --save 解压前的file文件夹结构: update-1.0.2.zip压缩包内容: 2.在depresssFile.js文件&…

Vue学习笔记(六)

模板引用(获取DOM 操作) 虽然Vue的声明性渲染模型为你抽象了大部分对DOM的直接操作&#xff0c;但在某些情况下&#xff0c;我们仍然需要直接访问底层DOM元素。要实现这一点&#xff0c;我们可以使用特殊的refattribute。 挂载结束后引用都会被暴露在this.$refs之上。 <s…

华为原生鸿蒙操作系统:我国移动操作系统的新篇章

华为原生鸿蒙操作系统&#xff1a;我国移动操作系统的新篇章 引言 在移动操作系统领域&#xff0c;苹果iOS和安卓系统一直占据主导地位。然而&#xff0c;随着华为原生鸿蒙操作系统的正式发布&#xff0c;这一格局正在发生深刻变化。作为继苹果iOS和安卓系统后的全球第三大移动…

android studio编译错误提示无法下载仓库

一、调整方法之一 buildscript {repositories {google()jcenter()//maven { url https://maven.aliyun.com/repository/google }//maven { url https://maven.aliyun.com/repository/central }}dependencies {// classpath "com.android.tools.build:gradle:4.1.1"c…

Prompt Engineering (Prompt工程)

2 prompt工程2大原则 2.1 给出清晰&#xff0c;详细的指令 策略1&#xff1a;使用分割符清晰的指示输出的不同部分&#xff0c;比如"",<>,<\tag>等分隔符 策略2&#xff1a;指定一个结构化的输出&#xff0c;比如json,html等格式 策略3&#xff1a;要…

C++STL之stack

1.stack的使用 函数说明 接口说明 stack() 构造空的栈 empty() 检测 stack 是否为空 size() 返回 stack 中元素的个数 top() 返回栈顶元素的引用 push() 将元素 val 压入 stack 中 pop() 将 stack 中尾部的元素弹出 2.stack的模拟实现 #include<vector> namespace abc { …

监控-08-skywalking监控告警

文章目录 前言一、准备二、配置skywalking2.1 修改alarm-settings.yml2.2 重启skywalking 三、收到告警邮件总结 前言 skywalking根据监控规则&#xff0c;通过webhook调后端微服务接口&#xff0c;从而发送告警邮件。 一、准备 根据上几章内容&#xff0c;保证skywalking能监…

Spring IoC DI

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 目录 1. 应用分层 1.1 如何分层: 1.2 MVC与三层架构区别联系 2. Spring 3.IoC & DI⼊⻔ 3.1 什么是IoC&#xff1f; 3.2 DI 介绍 …