(转)React事件处理函数必须使用bind(this)的原因

1.JavaScript自身特性说明
如果传递一个函数名给一个变量,之后通过函数名()的方式进行调用,在方法内部如果使用this则this的指向会丢失。
示例代码:
首先我们创建test对象并直接调用方法 :

const test = {
name:‘jack‘,
getName:function(){
console.log(this.name)
}
}
test.getName()
1
2
3
4
5
6
7
使用node test.js执行上述代码可以正常输出jack。
之后,我们对代码进行调整:

const test = {
name:‘jack‘,
getJack:function(){
console.log(this.name)
}
}
const func = test.getJack;
func();
1
2
3
4
5
6
7
8
我们没有直接调用对象的方法,而是将方法声明给一个中间变量,之后利用中间变量()调用方法,此时this则失去指向,输出undefined,如果使用node环境执行js文件则输出node相关信息,如嵌入到html中则this指向window对象。

2.React事件绑定
React中的bind同上方原理一致,在JSX中传递的事件不是一个字符串,而是一个函数(如:onClick={this.handleClick}),此时onClick即是中间变量,所以处理函数中的this指向会丢失。解决这个问题就是给调用函数时bind(this),从而使得无论事件处理函数如何传递,this指向都是当前实例化对象。
当然,如果不想使用bind(this),我们可以在声明函数时使用箭头函数将函数内容返回给一个变量,并在调用时直接使用this.变量名即可。示例代码如下:

import React from ‘react‘;
export default class Life extends React.Component{
constructor(props){
super(props);
this.state = {
count:4
};
}
render(){
var style = {
padding:‘10px‘,
color:‘red‘,
fontSize:‘30px‘
}
return (
<div style={style}>{/*注意js语法使用一个括号{}去表示,style使用两个括号,原因里面其实是一个对象*/}
<p>React生命周期介绍</p>
<button onClick={this.handleAdd}>无bind点击一下</button>
<button onClick={this.handleClick.bind(this)}>有bind点击一下</button>
<p>{this.state.count}</p>
</div>
)
}
//此时this指向是当前实例对象
handleAdd = ()=> {
console.log(this)
this.setState({
count:5
})
}
handleClick(){
this.setState({
count:6
})
}
}
---------------------
版权声明:本文为CSDN博主「汪喆_Jack」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34829447/article/details/81705977

原文地址:https://www.cnblogs.com/zlintokyo/p/11315705.html

时间: 2024-11-11 15:23:24

(转)React事件处理函数必须使用bind(this)的原因的相关文章

为什么React事件处理函数必须使用Function.bind()绑定this?

最近在React官网学习Handling Events这一章时,有一处不是很明白.代码如下: class Toggle extends React.Component { constructor(props) { super(props); this.state = {isToggleOn: true}; // This binding is necessary to make `this` work in the callback this.handleClick = this.handleC

React为啥很多类里的标签上事件处理函数要用bind(this)

render() { return ( <div> <p onClick={this.clickHandler.bind(this)}>vz</p> </div> ) } clickHandler() { console.log(this.clickHandler); } 上面标签里若不使用bind的话,点击p标签会报错,因为clickHandler运行时this不指向p标签,若要指向p标签,就需要bind绑上. 其实有时候不用bind改变函数作用域也没问题

React 事件处理函数

触摸事件:onTouchCancel\onTouchEnd\onTouchMove\onTouchStart (只会在移动设备上接受) 键盘事件:onKeyDown\onKeyPress\onKeyUp 剪切事件:onCopy\onCut\onPaste 表单事件:onChange\onInput\onSubmit 焦点事件:onFocus\onBlur UI元素:onScroll(移动设备是手指滚动和PC的鼠标滑动) 滚动事件:onWheel(鼠标滚轮) 鼠标类型:onClick\onCont

Jquery动态绑定事件处理函数 bind / on / delegate

1.bind方法绑定的事件处理函数不会应用到后来添加到DOM中的新元素.比如你在用bind给页面元素绑定事件之后,又新添加了一些与之前绑定过事件的元素一样的DOM元素,但是这些事件并不能在新的DOM元素上有体现. 如: $(document).ready(function(){ $("img").bind({ mouseenter:function(){ $(this).css("border","thick solid red"); }, mo

jquery事件之事件处理函数

一.事件处理 方法名 说明 语法 (events 事件类型,data数据,handler 事件处理函数,selector 选择器) Bind( 为每一个匹配元素的特定事件(像click)绑定一个事件处理器函数.没用on关键字 jQueryObject.bind( events [, data ], handler ) One 为每一个匹配元素的特定事件(像click)绑定一个一次性的事件处理函数.只绑定一次 jQueryObject.one( events [, data ], handler 

JQuery事件绑定函数one:绑定的事件处理函数只会被执行一次

JQuery绑定事件处理函数,有两种方式(方式1和方式2)是最常用的,方式3使用的较少. 方式1: $("#button").click(function(){ }); 这种方式很简单,也是平时编码最常用的做法.HTML中原始的事件,如onclick.onmouseover.onkeypress等,JQuery对名称进行了简单的封装,如onclick与JQuery的click对应,onmouseover与JQuery的mouseover对应.查看JQuery的API可以发现:JQuer

给wxPython事件处理函数传递参数

给wxPython事件处理函数传递参数 2014-04-30 07:47:08segmentfault-博客--点击数:39 最近捣鼓Python,也就自然捣鼓上了wxPython.我曾经用过Qt和Gtk+写GUI,但几乎所有的Python书都告诉我说最好用的是wxPython,我没有尝试PyQt和PyGtk就开始研究wxPython了.在Qt和Gtk+之间我更喜欢Qt,因为它跨平台做得很好,而且商业化也不错.但wxWidget给人的感觉就完全不同了. 如果说wxWidgets相对于Qt有什么优

off() 方法 与 unbind() 方法移除绑定事件的处理程序。one()函数用于为每个匹配元素的一个或多个事件绑定一次性事件处理函数

off() 方法移除用.on()绑定的事件处理程序. unbind() 方法移除用.bind()绑定的事件处理程序. 从 jQuery 1.7开始, .on() 和 .off()方法是最好的元素上附加和移除事件处理程序的方法. 常用原型区别: .unbind( eventType [, handler ] ) .off( events [, selector ] [, handler ] ) off: http://www.365mini.com/page/jquery-off.htm unbi

jQuery动态添加的元素绑定事件处理函数代码

jQuery动态添加的元素绑定事件处理函数代码 作者: 字体:[增加 减小] 类型:转载 有一段时间没用jquery了,今天又碰到这个问题.当时是知道有livejquery可以解决.但是我并不喜欢为了这个而另外加载一个. 我当时的处理方法是在添加的时候手工绑定事件处理函数.不过新版的jquery已经添加了这个功能.我们已经不需要为此烦恼了. 参考:http://api.jquery.com/live/ 以前我们定义事件,比如为元素定义单击事件是这样写的: 复制代码 代码如下: $('input'