React event

组件:

  • React 自有方法
  • 用户定义方法

一、虚拟事件对象

事件处理器将会传入 虚拟事件对象 的实例,一个对浏览器本地事件的跨浏览器封装。它有和浏览器本地事件相同的属性和方法,包括 stopPropagation() 和 preventDefault(),但是没有浏览器兼容问题。

如果因为一些因素,需要底层的浏览器事件对象,只要使用 nativeEvent 属性就可以获取到它了。每一个虚拟事件对象都有下列的属性:

boolean bubbles
boolean cancelable
DOMEventTarget currentTarget
boolean defaultPrevented
number eventPhase
boolean isTrusted
DOMEvent nativeEvent
void preventDefault()
void stopPropagation()
DOMEventTarget target
number timeStamp
string type

注意:

对于 v0.12,在事件处理函数中返回 false 将不会阻止事件冒泡。取而代之的是在合适的应用场景下,手动调用 e.stopPropagation() 或者 e.preventDefault()。


二、支持的事件

React 标准化了事件对象,因此在不同的浏览器中都会有相同的属性。

如下的事件处理器在事件 冒泡阶段触发。要在捕获阶段触发某个事件处理器,在事件名字后面追加 Capture 字符串;例如,使用 onClickCapture 而不是 onClick 来在捕获阶段处理点击事件。

1、剪贴板事件

事件名:
onCopy
onCut
onPaste 属性:
DOMDataTransfer clipboardData

2、键盘事件:

事件名:
onKeyDown
onKeyPress
onKeyUp 属性:
boolean altKey
Number charCode
boolean ctrlKey
function getModifierState(key)
String key
Number keyCode
String locale
Number location
boolean metaKey
boolean repeat
boolean shiftKey
Number which

3、焦点事件

事件名:
onFocus
onBlur 属性:
DOMEventTarget relatedTarget

4、表单事件

事件名:
onChange
onInput
onSubmit

5、鼠标事件

事件名:
onClick
onContextMenu:右键,上下文菜单
onDoubleClick
onDrag
onDragEnd
onDragEnter
onDragExit
onDragLeave
onDragOver
onDragStart
onDrop
onMouseDown
onMouseEnter
onMouseLeave
onMouseMove
onMouseOut
onMouseOver
onMouseUp 属性:
boolean altKey
Number button
Number buttons
Number clientX
Number clientY
boolean ctrlKey
function getModifierState(key)
boolean metaKey
Number pageX
Number pageY
DOMEventTarget relatedTarget
Number screenX
Number screenY
boolean shiftKey

6、触摸事件

为了使触摸事件生效,在渲染所有组件之前调用

React.initializeTouchEvents(true)。该方法是React顶层API

initializeTouchEvents(boolean shouldUseTouch)

配置 React 的事件系统,使 React 能处理移动设备的触摸( touch )事件。

事件名:
onTouchCancel
onTouchEnd
onTouchMove
onTouchStart 属性:
boolean altKey
DOMTouchList changedTouches
boolean ctrlKey
function getModifierState(key)
boolean metaKey
boolean shiftKey
DOMTouchList targetTouches
DOMTouchList touches

7、UI 事件

事件名:
onScroll:元素或页面的滚动事件 属性:
Number detail
DOMAbstractView view

8、鼠标滚轮滚动事件

事件名:
onWheel:监听滚动的位置、方向 属性:
Number deltaMode:单位
Number deltaX
Number deltaY
Number deltaZ:坐标轴对应的位置

三、自定义事件

没有嵌套关系的组件(如兄弟组件)之间的通信,只能通过自定义事件的方式来进行。

详见:https://www.cnblogs.com/Michelle20180227/p/9105585.html

var EventEmitter = require('events').EventEmitter;
import React,{Component} from 'react';
import ReactDOM from 'react-dom'; let emitter = new EventEmitter(); class ListItem extends Component{
static defaultProps = {
checked: false
};
constructor(props){
super(props);
}
render(){
return (
<li>
<input type="checkbox" checked={this.props.checked} onChange={this.props.onChange} />
<span>{this.props.value}</span>
</li>
);
}
} class List extends Component{
constructor(props){
super(props); this.state = {
list: this.props.list.map(entry=>({
text:entry.text,
checked:entry.checked || false
}))
};
console.log(this.state);
} onItemChange(entry){
const {list} = this.state;
this.setState({
list:list.map(prevEntry=>({
text: prevEntry.text,
checked:prevEntry.text === entry.text? !prevEntry.checked : prevEntry.checked
}))
});
//这里触发事件
emitter.emit('ItemChange',entry);
}
render(){
return (
<div>
<ul>
{this.state.list.map((entry,index)=>{
return (<ListItem
key={`list-${index}`}
value = {entry.text}
checked = {entry.checked}
onChange = {this.onItemChange.bind(this, entry)}
/>);
})}
</ul>
</div>
);
}
} class App extends Component{
constructor(props){
super(props);
}
componentDidMount(){
this.itemChange = emitter.addListener('ItemChange',(msg,data)=>console.log(msg));//注册事件
}
componentWillUnmount(){
emitter.removeListener(this.itemChange);//取消事件
}
render(){
return (
<List list={[{text:1},{text:2}]}/>
)
}
} ReactDOM.render(
<App/>,
document.getElementById('root')
);

React event的更多相关文章

  1. React & `event.persist()`

    React & event.persist() event.persist() https://reactjs.org/docs/events.html#event-pooling Tabs ...

  2. React使用笔记(3)-React Event Listener

    Date: 2015-11-28 12:18 Category: Web Tags: JavaScript Author: 刘理想 [toc] 1. 构造基本结构 首先,我们先创建一个按钮,一个输入框 ...

  3. React——event

    1.绑定在React元素上的事件与绑定在DOM元素上的事件非常相似,但是也有一个不同的地方 React事件使用驼峰命名法命名 //在HTML中 <button onclick='handle() ...

  4. react与jQuery对比,有空的时候再翻译一下

    参考资料:http://reactfordesigners.com/labs/reactjs-introduction-for-people-who-know-just-enough-jquery-t ...

  5. ANGULAR 2 FOR REACT DEVELOPERS

    Now that Angular 2 is in beta, the time has come for us to drop everything and learn something new, ...

  6. React 介绍

    ttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind The sm ...

  7. 最正确的React事件绑定方式

    参考这篇文章:Choosing the Best Approach for React Event Handlers 1.function.bind()方式 2.inline arrow functi ...

  8. 【React】354- 一文吃透 React 事件机制原理

    大纲 主要分为4大块儿,主要是结合源码对 react事件机制的原理 进行分析,希望可以让你对 react事件机制有更清晰的认识和理解. 当然肯定会存在一些表述不清或者理解不够标准的地方,还请各位大神. ...

  9. Reactjs事件处理的三种写法

    目录 前言 1. 在回调函数中使用箭头函数 2. 在构造器中绑定this 3. 使用类字段语法 事件参数的传递. 总结 前言 Reactjs中事件处理,与DOM元素处理类似,但也有一些不同的语法. R ...

随机推荐

  1. Android 组件系列-----Activity初步

    在上篇博文讲解了Android的Activity这个组件的启动流程后,接下来我们就来看看我们的Activity与我们的布局文件的关系吧 我们先来看看一个最简单的布局文件的内容: <Relativ ...

  2. MacOS安装react。问题 -- npm全局包的权限问题

    网上的教程有好多,在这里不一一列举,我只介绍我今天安装成功的步骤 首先,在安装react之前要先配置好node 1.安装node 在这里下载node的安装包https://nodejs.org/en/ ...

  3. C# 版本的24点实现

    C# 版本的24点实现. 已经实现基本功能,可以正确的算 3, 3, 8, 8 这类组合. 稍加修改就可以支持任意数目的操作数和操作符组合形成的四则运算表达式,不限于24点. 代码还比较简单粗糙,晚一 ...

  4. JS控制音频顺序播放

    做一项目,用到“叫号功能”,网页上有一“叫号”按钮,点击后就读数据库中存的号码,如123号, 然后就发声音出来, 思路是网上下载0123456789的叫号声音,然后按钮点击事件里就在JS里写用那个HT ...

  5. golang:吐槽multipart的设计

    最近在做邮件解析的工作,因此接触到multipart库,用了之后才发现golang的multipart有一点设计很诡异. 红线标出来的话意思是:当Content-Transfer-Encoding的值 ...

  6. VS2013 未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService

    全是2012版本的  没找到2013的! 控制面板>程序>程序和功能 找到如下选中软件右击修复 即可 需关闭VS2013 参考:https://blog.csdn.net/zhaoyun9 ...

  7. 【iCore1S 双核心板_FPGA】例程九:锁相环实验——锁相环的使用

    实验现象: 利用Quartus内部组件生成锁相环,用SignalTap II进行校验. 核心代码: //--------------------Module_PLL------------------ ...

  8. webstorm开发vue项目环境配置

    1.首先安装nodejs,官网下载nodejs安装包,默认安装NPM包管理器(国内使用npm需要FQ,也可以使用淘宝的镜像:npm install -g cnpm –registry=https:// ...

  9. React Native 进的第一个坑

    Bundling index.ios.js [development, non-minified, hmr disabled] 0.0% (0/1), failed. error: bundling ...

  10. Jquery 上传插件 FineUploader 在 webform 和 mvc 中的使用;

      多文件上传组件FineUploader使用心得 FineUploader 结合 一般处理程序 [上传示例] 参考:http://www.cnblogs.com/dudu/archive/2012/ ...