菜单

小程序学习笔记,setData的分裂详细明白_javascript本领_脚本之家澳门太阳集团

2020年3月31日 - 首页
小程序学习笔记,setData的分裂详细明白_javascript本领_脚本之家澳门太阳集团

一、摘要

微信小程序 setData() 使用:Page.prototype.setData(Object data, Function callback)

setData 函数用于将数据从逻辑层发送到视图层,同时改变对应的 this.data
的值。

参数说明:

澳门太阳集团 1

Object 以 key: value 的形式表示,将 this.data 中的 key 对应的值改变成
value。

其中 key
可以以数据路径的形式给出,支持改变数组中的某一项或对象的某个属性,如
array[2].message,a.b.c.d,并且不需要在 this.data 中预先定义。

注意:

  1. 澳门太阳集团,直接修改this.data,而不调用this.setData(),是无法改变当前页面的状态的,会导致数据不一致
  2. 仅支持可以JSON化的数据
  3. 单次设置的数据不能超过1024KB,尽量避免一次设置过多的数据
  4. 不要把data中的任何一项的value设为undefined,否则这一项将不能被设置,可能会有潜在的问题

代码示例:

Page({ /** * 页面的初始数据 */ data: { value:"初始值" //定义一个变量value,赋值为:“初始化” }, /** * 生命周期函数--监听页面加载 */ onLoad: function  { } })

在页面中显示:

澳门太阳集团 220180810161655804.png

在onLoad()函数中调用setData()

 onReady: function () { this.setData({ value:"调用setData()修改后的值" }) },123456

再次运行:

澳门太阳集团 320180810162025438.png

代码:

wx:wx.request({ url: 'http://180.169.225.27:7011/ibeacon/mobile.asmx/getRequest', data:{userid:this.data.username}, header: { 'content-type': 'application/json' }, method: 'POST', dataType: 'json', success: function { console.log(JSON.parse(res.data.d)); var value = JSON.parse(res.data.d); this.setData({ postData:value }) }, fail: function {}, complete: function {}, });

澳门太阳集团 420180810162621624.png

因为这里的this是相对于wx:request()的当前对象,我们可以这样解决:因为这里的wx:rewuest()是在页面加载时调用,所以我们可以在onLoad()中定义一个变量that
,将this赋值给that,那么此时的that代表相对于onLoad()的当前对象,然后在success回调函数中直接使用that.setData()即可。

完整代码如下:

//js代码onLoad: function  { console.log; var that = this; var userid = options.userid; that.setData({ username: userid }) // this.data.username = JSON.stringify; console.log(this.data.username); wx:wx.request({ url: 'http://180.169.225.27:7011/ibeacon/mobile.asmx/getRequest', data:{userid:this.data.username}, header: { 'content-type': 'application/json' }, method: 'POST', dataType: 'json', success: function { console.log(JSON.parse(res.data.d)); var value = JSON.parse(res.data.d); that.setData({ postData:value }) }, fail: function {}, complete: function {}, }); }//wxml代码<view wx:for="{{postData}}">posno:{{item.posno}},TradeTime:{{item.TradeTime}}</view>

正常获取到服务器返回的数据:

澳门太阳集团 52018081016360455.png

小程序中我们会经常使用到this.data与this.setData。其中this.data是用来获取页面data对象的,而this.setData是用来更新界面的。那么他们之间的区别与联系你真的搞懂了吗?

如果在onReady()函数中调用setData()方法,那么通过这个方法设置的值只能刷新一次,若需要再次刷新,需要清除缓存。

Page.prototype.setData()

踩坑

今天踩了大坑,坑里还都是碎瓶渣子。。

  1. 比如说你在main.js里面有这些变量。想修改某些值。

    data: {main_view_bgcolor: "",border: "",}
    

    修改方式有两种,一是直接用“=”赋值,这种是可以修改,并且你把修改之后的值打印出来可以看到确实修改了,但是不推荐使用这样的方式。

    因为,一般我们想修改data里面的值,往往都是因为这些数据都在main.wxml中绑定了,可以实现动态修改并实时刷新显示。刚刚这种方式容易发生数据被修改但是页面没有变化。

    所以说一下下面这种方式:

    在你绑定的自定义函数(往往都是绑定的点击事件)里面,

    this.setData({border:"aa"//这个border跟上面data里面的border是对应的。})
    

    这种方式,点击之后触发事件,执行函数,更新数据,同时可以实时更新渲染界面。

     data: { main_view_bgcolor: "", border: "", isChecked: [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]}
    

    如上,如果我想动态修改isChecked里面指定某个下标的值怎么办?

    下面我来说怎么动态修改一个对象的某元素的值。上面这个是索引下标,等会还有个key-value的例子。

    代码:

    click: function  { var id = e.target.id//根据点击不同的view获取对应的id值 var str = "isChecked[" + id + "]"//重点在这里,组合出一个字符串 this.setData({ [str]: false//用中括号把str括起来即可 })}
    

    看注释。点击->触发对应事件->来到click函数这里,根据点击的view获取对应的id,修改指定下标的isChecked。

    上面这个isChecked的索引是从0到n的,即可以通过isChecked[0]、isChecked[1]来访问。可以在操作的过程中打印日志看一下数据类型。

    哦,对了,在wxml中如果要绑定isChecked中元素的值,可以这么:

    <view bindtap=’click’ bindlongpress=’cancelclick’ id=’2′
    bindtap=’click’></view>

    不要在意那个三目运算,反正类似于js中访问方式,也是isChecked[index]。同理,下面的key-value类型的就可以通过isChecked[index].key来绑定数据了。

    下面是key-value类型的:

    data: { main_view_bgcolor: "", border: "", isChecked: [ { key: true }, { key: true }, { key: true } ]}
    

    直接写操作方式了(因为就跟上面只有一点点的区别):

     var str = "isChecked[" + id + "].key" this.setData({ [str]: false })
    

setData 函数用于将数据从逻辑层发送到视图层,同时改变对应的 this.data
的值。

注意:

直接修改 this.data 无效,无法改变页面的状态,还会造成数据不一致。
单次设置的数据不能超过1024kB,请尽量避免一次设置过多的数据。

二、正文

this.data可以获取页面data对象,但是它返回的对象到底是新的对象还是仅仅只是一个引用呐。这个很关键,在日常开发中很可能因为不知道或者是自己的疏忽导致bug,而且很难排查原因。带着这个疑问我们来做一下试验。由于时间比较紧,博主就不单独写demo了,项目中可能有大量其它代码干扰我们分析,还请见谅。

 var data = this.data.swiperItems[currentSwiper];

这行代码使用this.data获取了我需要的对象,并且赋值给data变量,下面分别打印data和this.data的相应对象。

可以看到这两个对象的内容是一致的。下面我将在data变量中添加一个test字段,然后再看这两者的打印结果。注意我并不会对this.data操作。

可以看到他们都发生了变换,所以这是浅拷贝,也就是两个变量指向了同一片存储区域,无论通过哪个变量操作这片存储区域,相应的两个变量得出的值都会变换。为了继续证明我们的猜想是正确的,下面我只操作this.data而不操作data。

跟我们预想的一样,即使我先赋值后加字段,data得出的结果也是被修改了的。

可能有人会问,那为啥用使用this.setData后才能看到界面的变换呢?至于this.setData我们可以看成是更新界面,并且貌似this.setData里面又托管了一个this.data的副本。因为在我改变this.data后立马去执行

 this.setData;

界面并不会更新,这就说明我们需要更新this.setData管理的那个数据对象才能更新界面,而界面真正加载的数据也是来自那里。想要知道具体怎么实现的,那就要去看源代码了。

三、结论

总结一下就是:this.data与this.setData的关系就是this.setData里面存储的是this.data的副本,而界面是从this.setData里面托管的this.data的副本取数据的。所以我们更改this.data并不会直接更新界面,因为这个时候的this.setData里面的副本还是没有更新前的。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图