React基于虚拟DOM实现了一个合成事件层,我们所定义的事件处理器会接收到一个合成事件对象的实例事件处理。

并且所有事件都自动绑定在最外层上。如果需要访问原生事件对象,可以使用nativeEvent属性。

React 元素的事件处理和 DOM 元素的很相似,但是有一点语法上的不同:

  • React 事件的命名采用小驼峰式(camelCase),而不是纯小写。
  • 使用 JSX 语法时你需要传入一个函数作为事件处理函数,而不是一个字符串。

在 React 中另一个不同点是你不能通过返回 false 的方式阻止默认行为。你必须显式的使用 preventDefault

当你使用 ES6 class 语法定义一个组件的时候,通常的做法是将事件处理函数声明为 class 中的方法。

你必须谨慎对待 JSX 回调函数中的 this,在 JavaScript 中,class 的方法默认不会绑定 this。如果你忘记绑定 this.handleClick 并把它传入了 onClick,当你调用这个函数的时候 this 的值为 undefined

这并不是 React 特有的行为;这其实与 JavaScript 函数工作原理有关。通常情况下,如果你没有在方法后面添加 (),例如 onClick={this.handleClick},你应该为这个方法绑定 this

class Toggle extends React.Component {
constructor(props) {
super(props);
this.state = {isToggleOn: true}; // 为了在回调中使用 `this`,这个绑定是必不可少的
this.handleClick = this.handleClick.bind(this);
} handleClick() {
this.setState(state => ({
isToggleOn: !state.isToggleOn
}));
} render() {
return (
<button onClick={this.handleClick}>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
);
}
} ReactDOM.render(
<Toggle />,
document.getElementById('root')
);

向事件处理程序传递参数

<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>

 

合成事件

Synthetic(人造的,合成的)

SyntheticEvent 实例将被传递给你的事件处理函数,它是浏览器的原生事件的跨浏览器包装器。除兼容所有浏览器外,它还拥有和浏览器原生事件相同的接口,包括 stopPropagation() 和 preventDefault()

如果因为某些原因,当你需要使用浏览器的底层事件时,只需要使用 nativeEvent 属性来获取即可。

事件池

SyntheticEvent 是合并而来。这意味着 SyntheticEvent 对象可能会被重用,而且在事件回调函数被调用后,所有的属性都会无效。出于性能考虑,你不能通过异步访问事件。

如果你想异步访问事件属性,你需在事件上调用 event.persist(),此方法会从池中移除合成事件,允许用户代码保留对事件的引用。

最新文章

  1. sql 单个字段去重查询 distinc 和 group by的效率问题
  2. [WPF] 我的WPF自学日记2,自定义入口
  3. s2sh框架搭建(辅助工具:MyEclipse)及解决一些遇到的问题
  4. Android 手机卫士--home界面布局
  5. HDU4348 To the moon
  6. Android studio 自定义打包APK名称
  7. 【linux】awk的使用
  8. c语言 字符版 简易2048
  9. Apache XAMPP Fails to start under Windows XP
  10. 怪兽z主机 驱动集
  11. USACO sprime
  12. Redis 笔记
  13. USACO刷题之路
  14. 图片像素对比OpenCV实现,实现人工分割跟算法分割图像结果的对比
  15. Linux检查和收集硬件信息的常用命令总结
  16. js中时间大小的比较
  17. SQL语句利用日志写shell
  18. JS碰撞检测
  19. css3种引入方式,样式与长度颜色,常用样式,css选择器
  20. Java生成XML文件与XML文件的写入

热门文章

  1. ISO/IEC 9899:2011 条款6.4.3——通用字符名
  2. 002-创建型-03-单例模式(Singleton)【7种】、spring单例及原理
  3. 好用的开源SVN仓库
  4. Qt编写Onvif搜索及云台控制工具
  5. 详解VMware 虚拟机中添加新硬盘的方法
  6. PAT 甲级 1035 Password (20 分)(简单题)
  7. Python3之多重继承
  8. Tools - Tcpdump
  9. 【miscellaneous】GStreamer下的音视频播放
  10. nginx.conf文件配置明细详解