• React中如何在事件处理的时候传参(详解)


    摘要

    首先我们知道,在React中,是通过小驼峰式给元素绑定事件:

      fn = ()=>{
        //执行代码
      }
    
      button onClick={this.fn}>111</button>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    但是如果有Vue的基础,可以很清楚的看到二者的区别。在Vue中,我们可以直接给fn传递参数。
    但是如果在React中我们这么做:

      fn = (value)=>{
        //执行代码
        console.log(value)
      }
    
      button onClick={this.fn('2222')}>111</button>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    你会发现,在页面加载的时候,2222已经被打印出来了。但是点击按钮的时候并没有效果。

    这说明,该方法并没有被绑定在按钮上,而是在按钮加载的时候直接调用了。
    而这一点也很好理解,React并没有做向Vue这方面的处理,它是直接调用完,将返回值绑定给了onClick。所以这里我们要记住,事件绑定的时候,一定要绑定的是一个函数

    OK,现在了解了问题所在,如果我想在调用方法的时候传递参数,应该怎么做呢?

    1.箭头函数

    第一个方法,如果我们在给按钮绑定事件的时候,外层绑定的是一个箭头函数,里面才是我们写的方法,似乎就能完美的解决问题了:

    
      speak = (value) =>{
        alert(value)
      }
      
      <button onClick={() => {this.speak('qnmlgbd')}}>说话</button>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    通过箭头函数的方式,直接给onClick绑定的就是我们定义的speak方法,并且传递好了参数。

    2.函数柯里化

    那如果箭头函数可以,似乎我们直接在方法里面返回一个方法,也没有什么问题。

    	  say = (value)=>{
    	    return ()=>{
    	      alert(value)
    	    }
    	  }
    	  
    	 <button onClick={this.say('qnmlgbd')}>说话</button>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    通过这种方式,我们在onClick绑定的时候,可以不用写箭头函数了,比较好看一点。但是原理和刚刚那种方式是一个样子的。

    3.bind方法

    我们知道,bind方法是改变方法的this指向,并且返回的是一个方法。不会直接调用。

    OK,如果bind有这个特性,我们就可以利用它解决这个问题。

     loud(value){
       alert(value)
     }
     
    <button onClick={this.loud.bind(this,'qnmlgbd')}>说话</button>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这里可以注意一下,loud方法在定义的时候没有采用箭头函数的方式。而之前的两个方法在定义的时候都使用了箭头函数的方式。

    这是因为,在React中,如果定义函数不使用箭头函数,函数里面的this会是绑定事件的元素,而不是React组件。但是如果用bind方法进行事件绑定,就不需要考虑这个问题了。

    最后我们总的看一下这三种方式的差别:

    export default class Child extends Component {
    
      say = (value)=>{
        return ()=>{
          alert(value)
        }
      }
    
      speak = (value) =>{
        alert(value)
      }
    
      loud(value){
        alert(value)
      }
    
      render() {
        return (
          <div>
            <button onClick={this.say('qnmlgbd')}>说话</button>
            <button onClick={() => {this.speak('qnmlgbd')}}>说话</button>
            <button onClick={this.loud.bind(this,'qnmlgbd')}>说话</button>
          </div>
        )
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    一个简单的HTML网页 、个人主页网页设计(HTML+CSS)
    郑渝高铁有多牛?拿下多个“中国第一”
    64. 最小路径和 java解决
    Leetcode 454:四数相加II
    35【Aseprite 作图】苹果——拆解
    java毕业设计校园代购服务订单管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
    PDF中的某个图或表想几乎无损的插入ppt或者word里的方法
    【工程光学】典型光学系统
    北大肖臻老师《区块链技术与应用》系列课程学习笔记[19]以太坊-难度调整
    tessafe.sys是病毒吗?tessafe.sys不兼容驱动程序如何解决?
  • 原文地址:https://blog.csdn.net/weixin_46726346/article/details/126785941