入坑React系列三

事件处理

  • react事件绑定属性的命名采用驼峰式写法
  • jsx语法传入一个函数作为事件处理函数
  • 不能使用返回 false 的方式阻止默认行为,因该这样写:
function ActionLink(){
    function handleClick(e){
        e.preventDefault();
        console.log('jghj');
    }
    
    return(
        <a href="#" onClick={handleClick}>click</a>    
    )
}

一个实际的例子:

class Toggle extends React.Component{
  constructor(props){
    super(props);
    this.state = {isToggle:true};
  
  }
  handleClick(){
    this.setState(prevState =>({
      isToggle: !prevState.isToggle
    }));
  } 
  
  
  render(){
    return(
      <button onClick={this.handleClick}>{this.state.isToggle?'ON':'OFF'}</button>
    )
  }
}

ReactDOM.render(
  <Toggle />,
  document.getElementById('root')
);

不出意外上述写法会报错,为什么呢?因为this的指向问题!!类的默认方法是不会绑定this的,所以这个时候this的值会是undefined。如何更改呢? 往下看:

  1. 第一种方法:bind方法原地绑定,改变this的指向:

<button onClick={this.handleClick.bind(this)}>{this.state.isToggle?‘ON’:‘OFF’}

这种方法写起来简单,但是很明显每次执行bind函数都会生成一个新函数,势必会有很大的开销。

  1. 第二种方法:在constructor中提前对事件进行绑定,即:
constructor(props){
    super(props);
    this.state = {isToggle:true};
    
    this.handleClick.bind(this);       //这里这里
    
  }
  1. 第三种方法:通过箭头函数,即:

<button onClick={e=>this.handleClick(e)}>{this.state.isToggle?‘ON’:‘OFF’}

在大多数情况下,这没有问题。然而如果这个回调函数作为一个属性值传入低阶组件,这些组件可能会进行额外的重新渲染。我们通常建议在构造函数中绑定或使用属性初始化器语法来避免这类性能问题。

  1. 第四种方法:将事件改写为箭头函数,即:
handleClick=(e)=>{
    e.preventDefault();
    this.setState(prevState =>({
        isToggle: !prevState.isToggle
    }));
}
    

向事件处理程序传递参数

<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>  //作为参数显示传递
<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button> //绑定bind隐患式传递

注意:通过bind方式向监听函数传参,在类组件中定义的监听函数,事件对象e要排在所传递参数的后面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值