2

事件机制

事件绑定语法

React Element的事件绑定与DOM事件绑定非常相似,有两个不同点需要注意:1) 事件名称采用驼峰式命名。2) 在JSX中事件处理函数为变量,需要使用大括号括起来解析。 3)不能通过return false阻止事件的默认行为,必须通过调用preventDefault()

  class MyDiv extends React.Component{
    constructor(props){
      super(props);
      this.state = {status : true}
      // 如果要在回调函数中调用this,这行代码不能省略
      this.toggle = this.toggle.bind(this);
    }
    // 事件处理函数
    toggle(){
      this.setState(state=>({
        status:!state.status
      }));
    }
    // 渲染
    render(){
      return (
        <div onClick={this.toggle}>
          {this.state.status.toString()} , {this.state.status?'NO':'OFF'}
        </div>
      )
    }
  }

  ReactDOM.render(<MyDiv/>,document.getElementById('app'));

this取值

函数中的THIS一直是比较纠结的问题。如上示例代码中,如果在构造函数中省略下面这行代码。那么在事件处理函数中将无法使用this。下面这行代码表示将构造函数中的this也就是组件示例本身绑定到事件处理函数上。

this.toggle = this.toggle.bind(this);

当然除了使用这种方式之外,我们还可以使用ES6中的箭头函数,因为箭头函数中没有自身的this,它的this指向它定义的内容也就是组件示例本身。所以第一个案例可以修改为如下

  class MyDiv extends React.Component{
    constructor(props){
      super(props);
      this.state = {status : true}
    }

    // 事件处理函数为箭头函数
    toggle = ()=>{
      this.setState(state=>({
        status:!state.status
      }));
    }
    // 渲染
    render(){
      return (
        <div onClick={this.toggle}>
          {this.state.status.toString()} , {this.state.status?'NO':'OFF'}
        </div>
      )
    }
  }

  ReactDOM.render(<MyDiv/>,document.getElementById('app'));

参数传递

有两种参数传递方式,一种是通过箭头函数直接传递,箭头函数中直接调用事件处理函数,实参为要传递的参数与事件对象

class MyDiv extends React.Component{
    constructor(props){
      super(props);
      this.state = {status : true}
    }
    // 事件处理函数
    toggle = (id,e)=>{
      this.setState(state=>({
        status:!state.status
      }));
    }
    // 渲染
    render(){
      return (
        <div onClick={(e)=>this.toggle(1,e)}>
          {this.state.status.toString()} , {this.state.status?'NO':'OFF'}
        </div>
      )
    }
  }

另外一种是通过调用bind函数,将this与要传递给函数值作为实参进行传递

class MyDiv extends React.Component{
    constructor(props){
      super(props);
      this.state = {status : true}
    }
    // 事件处理函数
    toggle = (id)=>{
      this.setState(state=>({
        status:!state.status
      }));
    }
    // 渲染
    render(){
      return (
        <div onClick={this.toggle.bind(this,1)}>
          {this.state.status.toString()} , {this.state.status?'NO':'OFF'}
        </div>
      )
    }
  }

李春雨
325 声望188 粉丝