Blogger Information
Blog 25
fans 0
comment 0
visits 42142
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
小程序中的this和that详解
程先生的博客
Original
5221 people have browsed it

    微信小程序开发过程中发现一个很奇怪的问题,有些情况下用 this.setData 可以改变初始化数据data,有些情况下使用this.setData无效,比如:在wx.request({});方法调用成功或者失败之后,有时候需要使用this.setData修改初始化数据data,更新视图数据。需要使用 let that = this; that.setData({ xx }); 使用 that 来保存当前的this状态,更新视图数据。


原因分析:微信小程序中,在wx.request({});方法调用成功或者失败之后,当使用this.setData修改初始化数据data时,如果使用this.data来获取,会出现获取不到的情况,调试页面也会报undefiend。在javascript中,this代表着当前对象,会随着程序的执行过程中的上下文改变,在wx.request({});方法的回调函数中,对象已经发生改变,this已经不是wx.request({});方法对象了,data属性也不存在了,从而无法实现对data数据的修改。


一、我们来解释一下,微信小程序中的this指向问题。

首先我们来看一段错误代码:


handleReadBook(e) {

    BMYAPI.api_updateReadsBooks({}, function(err, res) {

      if (err) return;

      this.setData({ data: res.data.data });

    });

},

运行上面代码,发现this.setData无效,视图并没有按照我想要的样子将data重新赋值渲染。这是因为在上述代码中,function(err, res){}是一个闭包,不能直接用this来setData。


解决方案1:


handleReadBook(e) {

    const that = this;

 

    BMYAPI.api_updateReadsBooks({}, function(err, res) {

      if (err) return;

      that.setData({ data: res.data.data });

    });

},

上述代码中,将this赋值给that,用that来setData。其实还有另一种解决方案,ES6中的箭头函数也可以避免这个问题。 


解决方案2:


handleReadBook(e) {

    BMYAPI.api_updateReadsBooks({}, (err, res) => {

      if (err) return;

      this.setData({ data: res.data.data });

    });

},

这样也是可以成功的。


ES6中的根本没有自己的this,它的this是继承外面的,因此内部的this就是外层代码块的this。


二、再来一个栗子,在微信小程序中我们可以用this改变页面中的值

setPlain: function(e) {

    this.setData({

      plain: !this.data.plain

    })

}

这样可以打印出ID的值 


data: {

    ID: 10

},

//在函数中更改data中的值

test: function() {

    console.log(this.data.ID)

    function testFun() {

    }

    testFun()

}

但是如果在testFun中再次打印就会报错:


test: function() {

    console.log(this.data.ID)

    function testFun() {

      console.log(this.data.ID)

    }

    testFun()

}

 //Error:

Cannot read property 'data' of undefined;at pages/test/test page test function

TypeError: Cannot read property 'data' of undefined

原因分析: 这是因为this是指向当前的对象,随着上下文作用域的切换this的执行this的指向会发生改变,我们可以先保存一份this的值然后再使用。


test: function() { 

  var that = this

  console.log(that.data.ID)

  function testFun() {

      console.log(that.data.ID)

  }

  testFun()

}

 

 ———————————————— 

版权声明:本文为CSDN博主「才华无限公司」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/baidu_25183741/article/details/88313641


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post