小程序学习笔记 Setdata()使用和注意事项

Posted by fsoooo Blog on April 10, 2018

微信小程序学习笔记-setData()使用和注意事项

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

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

参数说明:

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 (options) {

  }
  })

在页面中显示:

20180810161655804.png

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

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

  },123456

再次运行: 20180810162025438.png


在wx:request()中使用

代码:

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(res) {

        console.log(JSON.parse(res.data.d));  
        var value = JSON.parse(res.data.d);
        this.setData({
          postData:value
        })

      },
      fail: function(res) {},
      complete: function(res) {},
    });

这里会出现一个问题:直接在wx:request()的success回调函数中使用this.setData()会报这样一个错误:

20180810162621624.png

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

完整代码如下:

//js代码
onLoad: function (options) {
    console.log(options);
    var that = this;
    var userid = options.userid;
    that.setData({
      username: userid
    })
    // this.data.username = JSON.stringify(options);
    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(res) {

        console.log(JSON.parse(res.data.d));  
        var value = JSON.parse(res.data.d);
        that.setData({
          postData:value
        })

      },
      fail: function(res) {},
      complete: function(res) {},
    });


  }
//wxml代码
<view wx:for="">posno:,TradeTime:</view>

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


还有一个需要注意到地方就是:

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

踩坑

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

  1. 先说一下基本使用。官网也有。

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

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

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

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

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

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

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

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

    2、高能高能,这个就是那个都是瓶渣子的坑(哭状)

      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 (e) {    
        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中元素的值,可以这么:

    不要在意那个三目运算,反正类似于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
        })