处理事件

作者: 莫铭 | 来源:发表于2017-04-27 01:01 被阅读17次

使用React元素处理事件和在DOM元素上处理事件非常相似。
有一些语法差异:

  • React事件使用驼峰式命名,而非小写。
  • 在JSX中,你传入一个函数作为时间处理器,而非一个字符串。
    举个例子,下面这个HTML:
<button onclick="activateLasers()">
  Activate Lasers
</button>

在React中有些许不同:

<button onClick={activateLasers}>
  Activate Lasers
</button>

另外一处不同就是在React中你不能返回false来阻止默认行为。你必须显式地调用preventDefault。举例来说,在简单的HTML中,如果你想阻止链接打开一个新页面的这个默认行为,可以这么写:

<a href="#" onclick="console.log('The link was clicked.'); return false">
  Click me
</a>

在React中,是这样的:

function ActionLink() {
    function handleClick(e) {
    e.preventDefault();
    console.log('The link was clicked.');
  }

  return (
    <a href="#" onClick={handleClick}>
      Click me
    </a>
  );
}

这里,e是一个合成的事件。React依照W3C规则定义的这些合成事件,因此你无需担心浏览器之间的兼容性。查看SyntheticEvent参考指南来了解更多。
在使用React时,一般来说你不需要在一个DOM元素创建后调用addEventListener来为其添加监听器。而应该在元素初始化渲染的时候提供一个监听器。
当你使用ES6类去定义一个组件时,一个事件处理器一般作为类的方法而存在。举例来说,下面这个Toggle组件渲染一个可以让用户在"ON"和"OFF"状态间切换的按钮:

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

      // This binding is necessary to make `this` work in the callback
      this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState(prevState => ({
      isToggleOn: !prevState.isToggleOn
    }));
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}
ReactDOM.render(
    <Toggle />,
    document.getElementById('root')
);

在CodePen上试一试
在JSX的回调函数中你必须格外小心this的含义。在JavaScript中,类方法默认不会被绑定。如果你忘记绑定this.handleClick,然后将他传递给onClick,当这个函数被调用时,this将会是undefined
这不只是React才有的行为;这是由于JavaScript中函数工作的方式导致的。通常情况下,如果你引用一个方法,但是后面没有加上(),比如onClick={this.handleClick},那你就应该绑定那个方法。
如果调用bind让你很烦恼,这有两个方法可以让你解决这个问题。如果你正在使用还在试验阶段的属性初始化语法,那你就可以使用属性初始化来正确的绑定回调:

class LoggingButton extends React.Component {
  // This syntax ensures `this` is bound within handleClick.
  // Warning: this is *experimental* syntax.
  handleClick = () => {
    console.log('this is:', this);
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        Click me
      </button>
    );
  }
}

创建React应用中,这个语法是默认开启的。
如果你没有在使用属性初始值语法,也可以在回调函数中使用箭头函数

class LoggingButton extends React.Component {
  handleClick() {
    console.log('this is:', this);
  }

  render() {
    // This syntax ensures `this` is bound within handleClick
    return (
      <button onClick={(e) => this.handleClick(e)}>
        Click me
      </button>
    );
  }
}

这种语法的问题就是每次LogginButton渲染的时候,都会创建一个不同的回调函数。多数情况下这都是可以接受的。但如果这个回调作为prop传递给下面的组件,下面的这些组件可能会进行额外的重新渲染。我们通常建议在构造函数中绑定或使用属性初始器语法来避免这种性能问题。

相关文章

  • JS 事件

    目录 事件流 事件处理程序HTML事件处理程序DOM0级事件处理程序DOM2级事件处理程序IE事件处理程序跨浏览器...

  • react事件处理

    一,事件处理 写法:on+事件名称= {事件处理函数} 类组件触发写法on+事件名称 = 事件处理函数 ---...

  • 跨浏览器的事件处理程序

    事件处理程序有DOM0级事件处理程序、DOM2级事件处理程序,IE事件处理程序,DOM0级事件处理程序具有简单,跨...

  • App事件中心

    App事件中心,事件的的生产端和处理端分离,事件处理结果广播通知,事件状态(初始化、处理中和处理完成)管理,事件类...

  • Chapter 07. Broadcast

    阅读原文 7.1 . 理论概述 广播事件处理属于系统级的事件处理(一般事件处理是属于View级的事件处理) 一个应...

  • iOS和Flutter里的事件处理

    目录先说一下事件处理里的被处理者:事件一、iOS里的事件二、Flutter里的事件然后说一下事件处理里的处理者:响...

  • react文档——事件处理

    事件处理 React 元素的事件处理和 DOM 元素的事件处理非常相似。但也有一些语法差异: React 事件使用...

  • DOM事件的问题!

    1.事件冒泡 2.事件捕获 事件处理程序 1.HTML事件处理程序 2.DOM 0级事件处理程序 3.DOM 2级...

  • 2021-09-22 GUI(事件监听机制)

    事件监听机制组成事件源(组件)事件(Event)监听器(Listener)事件处理(引发事件后处理方式) 事件监听...

  • attachEvent和addEventListener区别

    attachEvent是IE的事件处理方法,是DOM0事件处理程序,只能在事件冒泡阶段触发。接收两个参数,事件处理...

网友评论

    本文标题:处理事件

    本文链接:https://www.haomeiwen.com/subject/mqtgzttx.html