首页/ 填坑/ 文章详情

微信小程序 setData 共用一个地址,引发赋值被覆盖的现象

微信小程序 setData 赋值 地址 覆盖 发布于 2020-11-05

微信小程序有个 setData 的函数,其数据赋值功能,对此熟悉得再不能熟悉了。你以为了解了它的全部,不,你根本对它一知半解。

在制作选择时间范围功能时,startTime 与 endTime 初始化默认数据,其数据是一样的。本着能重复的代码只写一篇的原则,只声明一个 object 对象,赋值给两者,由此揭开 setData 不为人知的一面。

JSdata:{
     filter: {
         startTime: {show: 0, year: '',month: '',day: '',value: ''},
         endTime: {show: 0, year: '',month: '',day: '',value: ''},
     },
 },
 init: function () { //初始化数据
    let date = new Date();
    let object = {
        show: 0,
        year: date.getFullYear(),
        month: date.getMonth() + 1,
        day: date.getDate(),
        value: ''
    }
   
    this.setData({
        'filter.startTime': object,
        'filter.endTime': object ,
    });
}

在选好时间段后,分别对filter.startTime.yearfilter.endTime.year 数据进行赋值。最终先赋值的filter.startTime.year 被后来的filter.endTime.year覆盖了。

JS...
this.setData({
    'filter.startTime.year': 2019,
    'filter.endTime.year': 2020
});
console.log('year',this.data.filter.startTime.year,this.data.filter.endTime.year);
//输出结果:year,2020,2020
...

出现这种情况,开始还怀疑赋值时触发了别的事件,结果注释所有代码,问题依旧。

问题的产生只因为只声明一个 object 对象对两者同时赋值,在赋值 filter.startTime filter.endTime下一级的值时,它们父节点是共用一个地址IP,引发前者被后者覆盖的现象。

解决的方法同样很简单,即然是共用一个地址IP,那声明多一个object1对象,让内存开辟新的地址来存储数据。

JS...
this.setData({
    'filter.startTime': object,
    'filter.endTime': object1 ,
});
...

文章评论0 records

最新 最早

0

最新评论Latest comments

凡心的仙人凡心的仙人 03-18 14:35
谢谢你了!
rantrismrantrism 2023-04-03 11:27
您好~我是腾讯云开发者社区运营,关注了您分享的技术文章,觉得内容很棒,我们诚挚邀请您加入腾讯云自媒体分享计划。完整福利和申请地址请见:https://cloud.tencent.com/developer/support-plan 作者申
唐牛才是食神唐牛才是食神 2022-06-15 10:51
(*°▽°*)八(*°▽°*)♪,解决了
唐牛才是食神唐牛才是食神 2022-06-15 10:49
发现不得了的东西,今晚回去好好研究下...
胖螺胖螺 2022-02-04 00:58
( ゜- ゜)つロ 在写了在写了。看到也有些感慨。因为站长前年在我原博客的留言,让我毅然选择去深造,选择读研,曾经我想过挺多东西的,还是自己本专业的适合我自己。在这先表达感谢。新年快乐!