此文章是翻译handling-events这篇React(版本v15.4.0)官方文档。
Handling Event
React elements 处理事件和DOM elements 事件处理非常类似。只有几个语法不同:
* React events 以camelCase 方式命名,而不是lowercase。
* 在JSX 中以function 作为事件句柄(event handler),而不是字符串
例子,这HTML
1 | <button onclick="activateLasers()"> |
同React 有不同
·```jsx
1 |
|
在React 中,可以通过以下方式来代替:
1 | function ActionLink(){ |
这里e
是一个合成事件(synthetic event)。React 根据W3C spce来定义合成事件(synthetic event),所以你不必担心跨浏览器适配(cross-browser compatibility)问题。参考SyntheticEvent
了解更多。
在使用React 时通常你不需要在一个DOM element创建之后,调用addEventListener
去添加一个侦听器。相反,只需要在element 被初次渲染时添加一个侦听器就可以了。
当你使用ES6 class 定义一个组件(component)时,通常的做法是在类(class)中添加一个方法作为事件句柄(event handler)。例如,这个Toggle
组件就是渲染一个按钮(button)让用户在“ON”和“OFF”状态之间切换。
1 | class Toggle extends Component { |
你必须注意在JSX 回调函数中this
的含义。在JavaScript 中,类方法并不是默认绑定的(bound)。如果你忘记绑定this.handleClick
并把它传递给onClick
,在实际被调用时,this
的值将会是undefined
。
这并不是React-specific(特性)行为;它只是how functions work in JavaScript。通常如你引用一个函数并没有带()
在其函数后面,例如onClick={this.handleClick}
,你需要绑定这方法。
如果调用bind
令你烦恼,这里有两种方法让你绕开它。如果你已经体验property initialize syntax,你可以使用属性初始化方法(property initializers)去正确的绑定回调函数。
1 | class LoggingButton extends Component { |
这个语法在Create React App 是默认的。
如果你不使用属性初始化语法(property initializer syntax),你可以在回调函数中使用箭头函数(arrow function)。
1 | class LoggingButton extends Component { |
这个问题是当LoggingButton
每一次被渲染时,都会创建一个不同的回调函数。在大多数情况下,这是可以承受的。然而,如果这个函数被作为prop 传递给子组件(lower components),这些组件可能还会做一次额外的渲染(an extra re-rendering)。我们通常建议在构造函数(contructor)中绑定回调函数来避免这类性能问题。