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

1.JavaScript自身特性说明

如果传递一个函数名给一个变量,之后通过函数名()的方式进行调用,在方法内部如果使用this则this的指向会丢失。

首先我们创建test对象并直接调用方法 :

1 const test = {
2     name:'jack',
3     getName:function(){
4         console.log(this.name)
5     }
6 }
7 test.getName()

输出jack。

之后,我们对代码进行调整:

1 const test = {
2     name:'jack',
3     getJack:function(){
4         console.log(this.name)
5     }
6 }
7 const func = test.getJack;
8 func();

我们没有直接调用对象的方法,而是将方法声明给一个中间变量,之后利用中间变量()调用方法,此时this则失去指向,输出undefined,如果使用node环境执行js文件则输出node相关信息,如嵌入到html中则this指向window对象

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

 1 import React from 'react';
 2 export default class Life extends React.Component{
 3     constructor(props){
 4         super(props);
 5         this.state = {
 6             count:4
 7         };
 8     }
 9     render(){
10         var style = {
11             padding:'10px',
12             color:'red',
13             fontSize:'30px'
14         }
15         return (
16             <div style={style}>{/*注意js语法使用一个括号{}去表示,style使用两个括号,原因里面其实是一个对象*/}
17                 <p>React生命周期介绍</p>
18                 <button onClick={this.handleAdd}>无bind点击一下</button>
19                 <button onClick={this.handleClick.bind(this)}>有bind点击一下</button>
20                 <p>{this.state.count}</p>
21             </div>
22         )
23     }
24     //此时this指向是当前实例对象
25     handleAdd = ()=> {
26         console.log(this)
27         this.setState({
28             count:5
29         })
30     }
31     handleClick(){
32         this.setState({
33             count:6
34         })
35     }
36 }

————————————————
版权声明:本文为CSDN博主「汪喆_Jack」的原创文章,
原文链接:https://blog.csdn.net/qq_34829447/article/details/81705977

posted @ 2019-09-25 18:01  James_23  阅读(765)  评论(0编辑  收藏  举报