V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vue.js
sunorg
V2EX  ›  Vue.js

在 vue2 或 js 中,有一个 json 对象,赋值后数据却变了

  •  
  •   sunorg · 23 天前 · 1458 次点击

    请教个问题

    在 vue2 中,有一个 json 对象,赋值后数据却变了,哪位高人熟手给指点下啥原因,拜谢!

    问题代码
    test() {
            const data ='{
        "code":200,
        "message":"获取成功",
        "data":{
            "list":[
                {
                    "id":4,
                    "parent_id":0,
                    "title":"WHWHWHWHWHWHWHWH",
                    "xxx_pri":"0.95",
                    "xxx_pri":"0.98",
                    "state":1
                },
            ],
            "count":"1"
        }
    }'
            const d = JSON.parse(data)
            console.log(d.data.list)    //此时 list[0].state=1
           
            this.type_list = d.data.list
            console.log(this.type_list) //此时 list[0].state=0,
          },
    

    如在赋值之前,加入语句,强制 int 转 string 则可以。

    
     //加入转换
     d.data.list.forEach((element) => {
              element.state = element.state.toString()
     })
     
    

    百思不得其解,哪位给指点一二

    第 1 条附言  ·  23 天前
    补充下:

    该现象换了另外一台电脑无法重现。
    该现象代码,换到其他页面上去,也没问题,特定那个页面。。。

    有朋友指出是 object.assign 的问题,但还没理透。哪位朋友给指点指点

    这种不确定性让人怀疑。。。
    14 条回复    2021-09-27 10:07:37 +08:00
    xiongotom
        1
    xiongotom   23 天前
    应该是 this.type_list 绑定了什么东东
    sunorg
        2
    sunorg   23 天前
    @xiongotom 默认定义

    type_list=[]
    xiongotom
        3
    xiongotom   23 天前
    @sunorg 比如跟模板绑定啥的,仔细检查下,可能就是某个小细节没注意。
    pupboss
        4
    pupboss   23 天前
    了解一下深拷贝浅拷贝
    clf
        5
    clf   23 天前
    调试。
    dfkjgklfdjg
        7
    dfkjgklfdjg   23 天前
    一眼感觉是你的其他业务代码修改了,监听一下每次修改。或者给这个对象加一个 setter 在内部打印,我想应该就可以看到问题了。
    3wdddd
        9
    3wdddd   23 天前
    你发的这段代码并不是问题代码,检查一下你的 mixins,组件的 props,watch 函数,v-model, sync 语法糖,绝壁被别的地方改动了
    aikilan
        10
    aikilan   23 天前
    建议贴一下当前组件全部上下文代码
    sjhhjx0122
        11
    sjhhjx0122   23 天前
    试试赋给 type_list 时深拷贝一下
    Chingim
        12
    Chingim   23 天前
    试着 console.log 的时候不要打印对象, 因为这个对象有可能是 log 之后才被改的, 但是却给你一种"console.log 的时候就是这个值"的感觉


    const d = JSON.parse(data)
    console.log(JSON.stringify(d.data.list))

    this.type_list = d.data.list
    console.log(JSON.stringify(this.type_list))

    以上全是同步的代码, 没理由值会变
    cheese
        13
    cheese   23 天前
    不会是深浅拷贝的问题,你看看监视数据的函数,肯定是改动了
    2i2Re2PLMaDnghL
        14
    2i2Re2PLMaDnghL   22 天前
    你的 this 是哪来的?
    先把打印部分这样改下

    const d = JSON.parse(data)
    console.log(d.data.list)

    this.type_list = d.data.list
    console.log(d.data.list)
    console.log(this.type_list)
    console.log(d.data.list===this.type_list)
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1375 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 17:37 · PVG 01:37 · LAX 10:37 · JFK 13:37
    ♥ Do have faith in what you're doing.