小程序中咱们会常常使用到this.data与this.setData。其中this.data是用来获取页面data对象的,而this.setData是用来更新界面的。那么他们之间的区别与联系你真的搞懂了吗?小程序
this.data能够获取页面data对象,可是它返回的对象究竟是新的对象仍是仅仅只是一个引用呐。这个很关键,在平常开发中极可能由于不知道或者是本身的疏忽致使bug,并且很难排查缘由。带着这个疑问咱们来作一下试验。因为时间比较紧,博主就不单独写demo了,项目中可能有大量其它代码干扰咱们分析,还请见谅。this
var data = this.data.swiperItems[currentSwiper];
这行代码使用this.data获取了我须要的对象,而且赋值给data变量,下面分别打印data和this.data的相应对象。spa
能够看到这两个对象的内容是一致的。下面我将在data变量中添加一个test字段,而后再看这二者的打印结果。注意我并不会对this.data操做。3d
能够看到他们都发生了变换,因此这是浅拷贝,也就是两个变量指向了同一片存储区域,不管经过哪一个变量操做这片存储区域,相应的两个变量得出的值都会变换。为了继续证实咱们的猜测是正确的,下面我只操做this.data而不操做data。code
跟咱们预想的同样,即便我先赋值后加字段,data得出的结果也是被修改了的。
对象
可能有人会问,那为啥用使用this.setData后才能看到界面的变换呢?至于this.setData咱们能够当作是更新界面,而且貌似this.setData里面又托管了一个this.data的副本。由于在我改变this.data后立马去执行blog
this.setData({});
界面并不会更新,这就说明咱们须要更新this.setData管理的那个数据对象才能更新界面,而界面真正加载的数据也是来自那里。想要知道具体怎么实现的,那就要去看源代码了。ip
总结一下就是:this.data与this.setData的关系就是this.setData里面存储的是this.data的副本,而界面是从this.setData里面托管的this.data的副本取数据的。因此咱们更改this.data并不会直接更新界面,由于这个时候的this.setData里面的副本仍是没有更新前的。开发
推荐一个小程序UI组件库swiper
扫描小程序码,可查看效果。