我们在使用React组件时,调用方法常常用到this和event对象,默认情况是不会绑定到组件上的,需要特殊处理。

节点上使用bind绑定

特点:该方法会在每次渲染组件时都会重新绑定一次,消耗一定的性能。不符合表象与行为分离准则

它属于ES5函数扩展的方法Function.prototype.bind(thisArg [, arg1 [, arg2, …]]),bind()返回一个新的函数对象,该函数的this被绑定到thisArg上,并向事件处理器中传入参数。

 class App extends Component {
render() {
return (
<div className="App">
<header className="App-header">
hello world
<h3 onClick={this.handleClick.bind(this, 'Jake')}>事件点击</h3>
</header>
</div>
);
}
handleClick(name, event) {
console.log(this)
console.log('事件', event)
console.log('参数', name)
}
}

这里需要注意的是,this必须放在其他实参最前面, 形参event必须放在其他参数后面,并且调用函数时无需传入event对象

构造函数中使用bind绑定

特点:该方式是将bind从节点移到构造函数上, 组件渲染时不会重新绑定。不会造成额外性能损耗

 class App extends Component {
constructor() {
super()
this.handleClick = this.handleClick.bind(this, 'Jake')
}
render() {
return (
<div className="App">
<header className="App-header">
hello world
<h3 onClick={this.handleClick}>事件点击</h3>
</header>
</div>
);
}
handleClick(name, event) {
console.log(this)
console.log('事件', event)
console.log('参数', name)
}
}

箭头函数上绑定

特点:该方法分为两种ES6和ES7语法, 利用了箭头函数自动绑定this作用域的特性

 class App extends Component {
render() {
return (
<div className="App">
<header className="App-header">
hello world
<h3 onClick={(e) => {this.handleClick('ketty', e) }} >事件点击</h3>
</header>
</div>
);
}
handleClick(name, event) {
console.log(this)
console.log('事件', event)
console.log('参数', name)
}
}

注意,该方法调用时必须传实参event才能获取event对象,并且它要在其他实参后面传入

(e) => {this.handleClick('ketty', e) }

不过该方法有个问题,就是匿名函数,无法移除监听事件,则需要改用ES7语法糖方式

 class App extends Component {
render() {
return (
<div className="App">
<header className="App-header">
hello world
<h3 onClick={this.handleClick} >事件点击</h3>
</header>
</div>
);
}
handleClick = (event) => {
console.log(this)
console.log('事件', event)
}
}

但此时,没法在调用函数时传入实参

而且该语法糖,在create-react-app上默认支持,如自定义脚手架,则需要安装babel-plugin-transform-class-properties插件解析ES7语法糖

以上三种方法各有特点,需根据实际情况而使用。

React组件绑定this的三种方法的更多相关文章

  1. 在React中跨组件分发状态的三种方法

    在React中跨组件分发状态的三种方法 当我问自己第一百次时,我正在研究一个典型的CRUD屏幕:"我应该将状态保留在这个组件中还是将其移动到父组件?". 如果需要对子组件的状态进行 ...

  2. React组件绑定this的四种方式

    题图 By HymChu From lnstagram 用react进行开发组件时,我们需要关注一下组件内部方法this的指向,react定义组件的方式有两种,一种为函数组件,一种为类组件,类组件内部 ...

  3. WPF的DataGrid的某个列绑定数据的三种方法(Binding、Converter、DataTrigger)

    最近在使用WPF的时候,遇到某个列的值需要根据内容不同进行转换显示的需求.尝试了一下,大概有三种方式可以实现: 1.传统的Binding方法,后台构造好数据,绑定就行. 2.转换器方法(Convert ...

  4. React Router页面传值的三种方法

    文章地址:https://blog.csdn.net/qq_23158083/article/details/68488831

  5. Jquery动态添加的元素绑定事件的3种方法

    假设我们点击li标签,弹出他的文本,如果是动态添加的li,点击是没有效果的,压根弹不出来文本. 下面博主分享一下为动态添加的元素绑定事件的三种方法,网上一般都是两种,我在这里多增加了一种. 事件案例: ...

  6. React绑定this的三种方式

    React可以使用React.createClass.ES6 classes.纯函数3种方式构建组件.使用React.createClass会自动绑定每个方法的this到当前组件,但使用ES6 cla ...

  7. React Router v4 页面传值的三种方法

    传值方法 1.props.params 使用React router定义路由时,我们可以给指定一个path,然后指定通配符可以携带参数到指定的path: <Route path='/user/: ...

  8. 数据绑定(三)为Binding指定绑定源的几种方法

    原文:数据绑定(三)为Binding指定绑定源的几种方法 Binding的源是数据的来源,所以,只要一个对象包含数据并能通过属性把数据暴露出来,它就能当作Binding的源来使用,常用的办法有: 一. ...

  9. OC和JS交互的三种方法

    看简书上说一共有六种OC和JS交互的方法,但是前三种原理都一致,都是通过检测.拦截Url地址实现互相调用的.剩下的react native等第三方框架原理不一样,也没有去研究,下边记录我使用的三种方法 ...

随机推荐

  1. Linux系统挂载Windows系统下的共享文件

    声明:本文是小编借鉴大神们的经验,仅供学习使用. 第一步:在Windows系统上选择要共享的文件夹,右击“属性”-“共享”-“高级共享”-勾选“共享此文件”-设置共享名-“权限”-“添加”-“高级”- ...

  2. CodeForces 958F3 Lightsabers (hard) 启发式合并/分治 多项式 FFT

    原文链接http://www.cnblogs.com/zhouzhendong/p/8835443.html 题目传送门 - CodeForces 958F3 题意 有$n$个球,球有$m$种颜色,分 ...

  3. UOJ#395. 【NOI2018】你的名字 字符串,SAM,线段树合并

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ395.html 题解 记得同步赛的时候这题我爆0了,最暴力的暴力都没调出来. 首先我们看看 68 分怎么做 ...

  4. Skeleton Screen -- 骨架屏--应用

    案例:使用 现已经在支付的项目使用 用户体验一直是前端开发需要考虑的重要部分,在数据请求时常见到锁屏的loading动画,而现在越来越多的产品倾向于使用Skeleton Screen Loading( ...

  5. window编程_消息分类

    Window应用程序利用Windows消息(Message)与应用程序及系统进行信息交换.消息分为:消息号:有事先定义好的消息名标识字节参数(wParam):用于提供消息的附加信息长字节参数(lPar ...

  6. XV Open Cup named after E.V. Pankratiev. GP of America

    A. Area of Effect 首先最优解中必有一个点在圆的边界上. 若半径就是$R$,则枚举一个点,然后把剩下的事件极角扫描即可,时间复杂度$O(m(n+m)\log(n+m))$. 否则圆必然 ...

  7. 【Tomcat】Tomcat配置JVM参数步骤

    这里向大家描述一下如何使用Tomcat配置JVM参数,Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机.您可以选择自己的需要选择不同的操作系统和对应的JDK ...

  8. [LeetCode] Design Circular Queue 设计环形队列

    Design your implementation of the circular queue. The circular queue is a linear data structure in w ...

  9. c语言的二进制表示的是什么码

    int -1 的二进制是 1111 1111 1111 1111 1111 1111 1111 1111 int -2 的二进制是 1111 1111 1111 1111 1111 1111 1111 ...

  10. python中剔除字典重复项,可以使用集合(set)。

    使用集合(set)剔除字典中的重复项(value). 1)具体例子: #甲乙丙丁使用的编程语言programming_languages = { '甲':'java', '乙':'python', ' ...