五岁小孩
五岁小孩
  • 发布:2024-03-24 12:14
  • 更新:2024-03-26 15:57
  • 阅读:394

关于 getApp().globalData 的使用疑问

分类:uni-app

问题:将 globalData 里的对象类型赋值给局部变量,局部变量发生改变之后,会影响 globalData 的数据,这算 bug 吗,还是我写的代码有问题,求解?

App.vue

<script>  
    export default {  
        globalData: {  
            "text": "text",  
            "arr": [{  
                "name": "test",  
            }]  
        }  
    }  
</script>  

<style>  
    /*每个页面公共css */  
</style>

index.vue


<script>  
    export default {  
        data() {  
            return {  
                title: 'Hello'  
            }  
        },  
        onLoad() {  
            // // 1. 修改普通类型  
            // let text =getApp().globalData.text  
            // console.log("getApp.globalData.text:", getApp().globalData.text)  
            // console.log("text:", text)  
            // // 修改 text 再输出,符合预期  
            // text="update text"  
            // console.log("getApp.globalData.text:", getApp().globalData.text)  
            // console.log("text:", text)  

            // 2. 修改数组类型  
            let arr =getApp().globalData.arr  
            // TODO 问题1 :getApp.globalData.arr 的 name 是 text,为什么输出的结果三 update text(代码在后面才作的修改)  
            console.log("getApp.globalData.arr:", getApp().globalData.arr)  
            console.log(" arr:", arr)  
            // 修改 arr 再输出,输出的结果就很奇怪了  
            arr[0].name="update text"  
            // 问题2:我修改是变量 arr ,为什么会影响  getApp.globalData.arr  
            console.log("after update getApp.globalData.arr:", getApp().globalData.arr)  
            console.log("after arr:", arr)  

        }  

    }  
</script>  

执行结果:

2024-03-24 12:14 负责人:无 分享
已邀请:
yuhespace

yuhespace - Yule

这与getApp().globalData无关,这属于浏览器控制台 console.log ,异步打印相关问题,当浏览器打印一个对象时

你可以这样理解,当console.log时,打印的是对象的引用,这时候原本是arr,如果这时候你点开控制台,把这个对象展开(或者如hbuilder的控制台),相当于重新获取这个对象

在update text之前除了控制台打印,你怎么用arr都是没问题的,如果非要打印用JSON.stringify(arr)

HRK_01

HRK_01

第一种是值拷贝,两份不同的实例,你改了互不影响
第二种数组拷贝过来是全局对象的引用地址,也就是说局部对象跟全局变量共享同一份实例,你对局部变量的修改实际上是对全局变量的修改。
关于这个前端基础知识,可以百度搜一下 “深拷贝/浅拷贝区别”

要回复问题请先登录注册