this.setData is not a function;+小程序中this指向的解释(微信开发者工具报错解决)

 

附:代码

Page({
  data:{
    weather:"NAN",
    city:""
  },
  getCity:function(e){
    console.log("input")
    console.log(e.detail.value)
    this.setData({
     city:e.detail.value 
    })
  },
  Click: function () {
    let url = `https://free-api.heweather.com/s6/weather/now?location=${this.data.city}&key=cc79554fd87c447eab8e05a605940401`;
    console.log(this.data.city)
    //发送http请求到第三方服务器
    wx.request({
      url: url,
      success: function (res) {
        console.log(res)
        //获取天气情况
        let weather=res.data.HeWeather6[0].now.cond_txt;
        console.log(weather)
        this.setData({
          //修改data中的值
          weather:weather
        })
      }
    })
  }
})

原因是因为 

在调用wx.request之后this指代的已经不是page对象,而是wx.request对象了

解决办法:

将this提前赋值给一个变量

let page=this;

wx.request({

   ...............

})

Page({
  data:{
    weather:"NAN",
    city:""
  },
  getCity:function(e){
    console.log("input")
    console.log(e.detail.value)
    this.setData({
     city:e.detail.value 
    })
  },
  Click: function () {
    let url = `https://free-api.heweather.com/s6/weather/now?location=${this.data.city}&key=cc79554fd87c447eab8e05a605940401`;
    console.log(this.data.city)
    let page=this;
    //发送http请求到第三方服务器
    wx.request({
      url: url,
      success: function (res) {
        console.log(res)
        //获取天气情况
        let weather=res.data.HeWeather6[0].now.cond_txt;
        console.log(weather)
        page.setData({
          //修改data中的值
          weather:weather
        })
      }
    })
  }
})

第二种解决办法是使用es6的箭头函数

当我们使用箭头函数时,函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,它的this是继承外面的,因此内部的this就是外层代码块的this

有道思否论坛出的题大家看一下:

  <body>
    <div id="d1">1
    </div>
  </body>
<script>
    let obj ={
        name:"obj",
        test1:function(){
            document.getElementById("d1").addEventListener("click",()=>{
                console.log("test1",this);
            })
        },
        test2:()=>{
            document.getElementById("d1").addEventListener("click",()=>{
                console.log("test2",this);
            })
        },
        test3:()=>{
            console.log("test3",this);
        }
    }
    obj.test3();
    obj.test1();
    obj.test2();
</script>

1、test1中的箭头函数的this指向的是test1函数内部绑定的this,即也就是定义它的地方:obj
2、test2中的箭头函数的外层还是箭头函数,得再往外找一层,找到了obj的外层,即window
3、test3中的箭头函数的外层是obj的外层,即window

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值