此文章是翻译SyntheticEvent这篇React(版本v16.2.0)官方文档。
SyntheticEvent
入门参考记录React 事件系统中的表单部分的SynthecticEvent 包装器。参考Handling Event 获取更多信息。
Overview
事件处理器将会传入一个SyntheticEvent 实例,一个跨浏览器的包装器包装着浏览器原生事件。它有着和浏览器原生事件相同的接口,包括stopPropagation() 和preventDefault() ,除了这些事件在所有浏览器中的工作相同。
如果你发现由于某些原因你需要底层浏览器事件,可以简单地使用nativeEvent 特性去处理它。每一个SyntheticEvent 对象有下面这些特性:
boolean bubblesboolean cancelableDOMEventTarget currentTargetboolean defaultPreventednumber eventPhaseboolean isTrustedDOMEvent nativeEventvoid preventDefault()boolean isDefaultPrevented()void stopPropagation()boolean isPropagationStopped()DOMEventTarget targetnumber timeStampstring type
Note: 截至v0.14 这个版本,事件处理器中返回
false不再阻止事件传递。相反,视情况而定手动的触发e.stopPropagation()或者e.preventDefault()方法。
Event Pooling
SyntheticEvent 是一个池子(pooled)。这意味着SyntheticEvent 对象是可复用的并且所有的属性在事件函数被调用后都是无效的。这是考虑到性能问题。因此,你不能异步地访问这些事件。
function onClick(event){console.log(event); // => nullified objectconsole.log(event.type); // => "click"const eventType = event.type; // => "click"setTimeout(function(){console.log(event.type); // => nullconsole.log(eventType); // => "click"},0);// Won't work, this.state.clickEvent will only contain null valuesthis.setState({clickEvent: event});// You can still export event properties.this.setState({eventType: event.type});}
注意: 如果你想要异步地访问事件属性,你应该调用事件的
event.persist(),这会从池子(pool)中移除合成事件(synthetic event)并且允许事件的引用通过用户代码保存。
Supported Events
React 标准化事件以至于它们有跨浏览器一致的属性。
下面的事件局部在冒泡阶段(in bubbling phase)被触发。在捕获阶段(the capture phase)注册一个事件句柄,追加Capture 到事件名称上:例如,替代使用onClick,你应该使用onClickCapture 在捕获阶段去处理事件。
- Clipboard Events
- Composition Events
- Keyboard Events
- Focus Events
- Form Events
- Mouse Events
- Selection Events
- Touch Events
- UI Events
- Wheel Events
- Media Events
- Image Events
- Animation Events
- Transition Events
- Other Events
参考
Clipboard Events
事件名称:
onCopy onCute onPaste
属性:
DOMDataTransfer clipboardData
Composition Events
事件名称:
onCompositionEnd onCompositionStart onCompositionUpdate
属性:
string data
Keyboard Events
事件名称:
onKeyDown onKeyPress onKeyUp
属性:
boolean altKeynumber charCodeboolean ctrlKeyboolean getModifierState(key)string keynumber keyCodestring localenumber locationboolean metaKeyboolean repeatboolean shiftKeynumber which
key 属性可以接受DOM级别3事件规范中记录的任何值。
Focus Events
事件名称:
onFocus onBlur
这些focus event 工作在React DOM 上所有的元素,不仅是表单元素(form element)
属性:
DOMEventTarget relatedTarget
Form Events
事件名称:
onChange onInput onSubmit
了解更多关于onChange event,参考Forms
Mouse Events
事件名称:
onClick onContextMenu onDoubleClick onDrag onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp
onMouseEnter 和onMouseLeave 事件传播是从离开的元素 到进入的元素,而不是普通的冒泡,并且没有捕获阶段。
属性:
boolean altKeynumber buttonnumber buttonsnumber clientXnumber clientYboolean ctrlKeyboolean getModifierState(key)boolean metaKeynumber pageXnumber pageYDOMEventTarget relatedTargetnumber screenXnumber screenYboolean shiftKey
Selection Events
事件名称:
onSelect
Touch Events
事件名称:
onTouchCancel onTouchEnd onTouchMove onTouchStart
属性:
boolean altKeyDOMTouchList changedTouchesboolean ctrlKeyboolean getModifierState(key)boolean metaKeyboolean shiftKeyDOMTouchList targetTouchesDOMTouchList touches
UI Events
事件名称:
onScroll
属性:
number detailDOMAbstractView view
Wheel Events
事件名称:
onWheel
属性:
number deltaModenumber deltaXnumber deltaYnumber deltaZ
Media Events
事件名称:
onAbort onCanPlay onCanPlayThrough onDurationChange onEmptied onEncryted onEnded onError onLoadeData onLoadeMetadata onLoadStart onPause onPlay onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend onTimeUpdate onVolumeChange onWaiting
Image Events
事件名称:
onLoad onError
Animation Events
事件名称:
onAnimationStart onAnimationEnd onAnimationIteration
属性:
string animationNamestring pseudoElementfloat elapsedTime
Transition Events
事件名称:
onTransitionEnd
属性:
string propertyNamestring pseudoElementfloat elapsedTime
Other Events
事件名称:
onToggle
