React事件处理方法中this指向为undefined的四种解决方案

本文介绍了在React中,由于JavaScript的作用域问题,导致事件处理函数中的this可能为undefined,并列举了四种解决方法:1) 使用bind(this);2) 在构造函数中绑定;3) 使用箭头函数;4) 将事件处理函数声明为箭头函数。作者推荐第四种方案,因为它避免了额外的函数创建。
摘要由CSDN通过智能技术生成

React事件处理方法中this指向为undefined的四种解决方案:

话不多说,先上代码
在这里插入图片描述
如图所示:点击’-‘按钮数字减一,并打印出当前数字,点击’+'按钮数字加一,并打印出当前数字

<div id="root"></div>
<script src="js/react.development.js"></script>
<script src="js/react-dom.development.js"></script>
<script src="js/babel.min.js"></script>
//此处的js我是从react官网直接下载的
<script type="text/babel">
	class XzCart extends React.Component{
		constructor(p) {
			super(p) 
			this.state={buyCount:p.num}
			// this._f2=this._f2.bind(this)
			// this._f1=this._f1.bind(this)
		}
		_f1(){
			let buyCount=this.state.buyCount*1-1
			this.setState({buyCount},()=>{
				// setState是异步执行的,此处是在"数据/界面修改完成"后调用
				console.log(this.state.buyCount)
			})
		}
		_f2(){
			let buyCount=this.state.buyCount*1+1
			this.setState({buyCount},()=>{
				console.log(this.state.buyCount)
			})
		}
		render(){
			//return的是JSX片段
			return(
				<div>
					<button onClick={this._f1}>-</button>
					<span className="cart">{this.state.buyCount}</span>
					<button onClick={this._f2}>+</button>
				</div>
			)
		}
	}
	let e=<XzCart num="5"/>
	ReactDOM.render(e,root)
</script>

此处点击按钮的时候会出现this指向undefined错误

解决方案

方案1:
行间定义事件后面使用bind绑定this
onClick={this._f1bind(this)}
此方案有一个缺点,每次点击都会创建一个函数的副本
代码如下,将return部分的jsx代码对应的button点击事件进行修改

return(
	<div>
		<button onClick={this._f1.bind(this)}>-</button>
		<span className="cart">{this.state.buyCount}</span>
		<button onClick={this._f2.bind(this)}>+</button>
	</div>
)

方案2:
在构造函数内部声明this指向
此方案为官方推荐方法,代码如下,只需修改constructor部分

constructor(p){
	super(p)
	this.f1=this._f1.bind(this)
	this.f2=this._f2.bind(this)
}							

方案3:
行间定义事件使用箭头函数
onClick={()=>{this._f1()}},代码如下,修改return部分

return(
	<div>
		<button onClick={()=>{this._f1()}}>-</button>
		<span className="cart">{this.state.buyCount}</span>
		<button onClick={()=>{this._f2()}}>+</button>
	</div>
)

方案4:
声明事件时将事件等于一个箭头函数
_f1=()=>{
//把事件处理函数声明为箭头函数
}
代码如下:将事件处理函数声明为箭头函数

_f1(){
	let buyCount=this.state.buyCount*1-1
	this.setState({buyCount},()=>{
		// setState是异步执行的,此处是在"数据/界面修改完成"后调用
		console.log(this.state.buyCount)
	})
}
_f2(){
	let buyCount=this.state.buyCount*1+1
	this.setState({buyCount},()=>{
		console.log(this.state.buyCount)
	})
}

我最喜欢这个方案四了,当然你们喜欢哪个看个人想法了

对了 这个我给大家提醒一下,npm的国内镜像有新通知了 镜像的地址换了,之前的镜像地址将要作废 大家记得换一下哈
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你真的快乐吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值