React中的this指向,如何为事件绑定函数的多种方式

React中的this指向,如何为事件绑定函数的多种方式

在react中,先看下面的一个demo(点击这段字体,切换’凉爽’和;炎热’),好的你可能会这么写

class Weather extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      isHot: false
    };
  }
  showInfo(){        //注意这里,以后主要更改的是这个函数,以及下面的onClick方法里面,其他不动
    this.setState({isHot: !this.state.isHot});
  }
  render(){
    const {isHot} = this.state;
    return(
      <div>
        <h2 onClick={this.showInfo}>今天天气很{isHot? '炎热':'凉爽'}</h2>
      </div>
    );
  }
}

好的,我们运行下看看:
在这里插入图片描述
很好,报错了,说是找不到setState方法。
直接说原因吧:
render中标签中事件指向函数,函数不是通过类实例调用的,是直接调用,类中的方法默认开启了局部的严格模式,所以事件绑定函数中this为undefined。

啥意思呢,是因为一开始渲染结束后,标签事件绑定了这个方法,可是你触发的时候并不是类实例去触发的,所以this是undefined(严格模式)。

补充:之所以写 onClick={this.showInfo} 而不是 onClick={this.showInfo()} 是因为加了括号之后,会在绑定时就执行,这是因为react使用的是jsx,在这里加了()相当于执行函数。如果你非要加(),那么你可以在函数showInfo中return一个新函数,懂了ba

好的,我们现在要解决这个报错问题,找不到this。那么我们就用bind()方法改变一下this呗,不知道bind作用的可以去查一下。
补充:bind与call,apply注意区别就是bind绑定后不执行,所以用bind。

//其他的代码别动,在构造函数中加上   this.showInfo = this.showInfo.bind(this)
constructor(props) {
    super(props);
    this.state = {
      isHot: false
    };
    this.showInfo = this.showInfo.bind(this); //改了这里
  }

注意:如果每个方法都绑定一下,也太麻烦了,所以我们用箭头函数来解决下
箭头函数的this指向是上下文,方法的上下文是类里面,因此this指向不会出错,所以我们这么写:

	//构造函数中的bind别忘了删除掉,其他代码不改
	showInfo = ()=>{
	  this.setState({isHot: !this.state.isHot});
	}
	
	onClick={this.showInfo}

好的,this指向这块解决了。

拓展:如果我想顺便带个参数咋办?加括号不是立即执行吗?
方法1:

onClick={this.showInfo(参数)}

showInfo = (参数)=>{
	return this.func(参数);        //这样的话实现了,在func函数中去处理逻辑。
}

方法2:(常用)

onClick={() => this.showInfo(参数)}  //相当于在这里return了

showInfo = (参数)=>{
	处理逻辑       
}

动手试一下,就会了,
如果你又想要参数,有想要事件本身的event
就这么写: onClick={(event) => this.showInfo(event,参数)}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值