• 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

  • 相关阅读:
    线程池参数设置技巧
    线程池的七个参数
    bug篇——Windows启动redis报错Creating Server TCP listening socket 127.0.0.1:6379: bind: No error
    总结篇——git本地仓库上传更新到github
    实例篇——springboot自定义拦截器
    总结篇——从零搭建maven多模块springboot+mybatis项目
    bug篇——MySQL的时区问题
    工具类篇——时间处理Calendar类
    安装篇——nginx安装ssl模块转发https请求
    总结篇——nginx代理服务器
  • 原文地址:https://www.cnblogs.com/daidechong/p/11586448.html
Copyright © 2020-2023  润新知