所有内置浏览器组件,例如 <div>
,都支持一些常见的属性和事件。
参考
常见组件(例如 <div>
)
<div className="wrapper">Some content</div>
属性
所有内置组件都支持这些特殊的 React 属性
-
children
:一个 React 节点(一个元素、一个字符串、一个数字、一个 portal、一个空节点(例如null
、undefined
和布尔值),或者其他 React 节点的数组)。指定组件内部的内容。当您使用 JSX 时,您通常会通过嵌套标签(例如<div><span /></div>
)隐式地指定children
属性。 -
dangerouslySetInnerHTML
:一个包含原始 HTML 字符串的对象,格式为{ __html: '<p>一些 HTML</p>' }
。它会覆盖 DOM 节点的innerHTML
属性,并在内部显示传递的 HTML。这应该非常谨慎地使用!如果内部的 HTML 不受信任(例如,如果它基于用户数据),则可能会引入 XSS 漏洞。详细了解如何使用dangerouslySetInnerHTML
。 -
ref
:来自useRef
或createRef
的 ref 对象,或ref
回调函数,或用于 旧版 refs 的字符串。您的 ref 将填充此节点的 DOM 元素。 详细了解如何使用 refs 操作 DOM。 -
suppressContentEditableWarning
:一个布尔值。如果为true
,则会抑制 React 对同时具有children
和contentEditable={true}
的元素显示的警告(通常它们不能一起使用)。如果您正在构建一个手动管理contentEditable
内容的文本输入库,请使用此选项。 -
suppressHydrationWarning
:一个布尔值。如果您使用 服务器端渲染,则当服务器和客户端渲染不同的内容时,通常会发出警告。在极少数情况下(例如时间戳),很难或不可能保证完全匹配。如果将suppressHydrationWarning
设置为true
,React 将不会警告您该元素的属性和内容不匹配。它只在单层深度起作用,并且旨在用作应急方案。不要过度使用它。了解如何抑制水合错误。 -
style
:一个包含 CSS 样式的对象,例如{ fontWeight: 'bold', margin: 20 }
。与 DOMstyle
属性类似,CSS 属性名称需要写成camelCase
形式,例如fontWeight
而不是font-weight
。您可以传递字符串或数字作为值。如果传递一个数字,例如width: 100
,React 会自动将px
(“像素”)追加到值后面,除非它是 无单位属性。我们建议仅对动态样式使用style
,即您事先不知道样式值的情况下。在其他情况下,使用className
应用普通 CSS 类效率更高。详细了解className
和style
。
所有内置组件也支持以下标准 DOM 属性
accessKey
:一个字符串。指定元素的键盘快捷键。通常不推荐使用。aria-*
:ARIA 属性允许您为此元素指定辅助功能树信息。有关完整参考,请参阅 ARIA 属性。在 React 中,所有 ARIA 属性名称都与 HTML 中的完全相同。autoCapitalize
:一个字符串。指定是否以及如何对用户输入进行大写。className
:一个字符串。指定元素的 CSS 类名。 详细了解如何应用 CSS 样式。contentEditable
:一个布尔值。如果为true
,则浏览器允许用户直接编辑渲染的元素。这用于实现富文本输入库,例如 Lexical。如果您尝试将 React 子级传递给contentEditable={true}
的元素,React 会发出警告,因为 React 将无法在用户编辑后更新其内容。data-*
:数据属性允许您将一些字符串数据附加到元素,例如data-fruit="banana"
。在 React 中,它们并不常用,因为您通常会从 props 或 state 中读取数据。dir
:'ltr'
或'rtl'
。指定元素的文本方向。draggable
:一个布尔值。指定元素是否可拖动。它是 HTML 拖放 API 的一部分。enterKeyHint
:一个字符串。指定在虚拟键盘上按下回车键时要执行的操作。htmlFor
:一个字符串。对于<label>
和<output>
,允许您 将标签与某个控件关联起来。 与for
HTML 属性 相同。React 使用标准 DOM 属性名称(htmlFor
)而不是 HTML 属性名称。hidden
:一个布尔值或字符串。指定是否应隐藏该元素。id
:一个字符串。为此元素指定一个唯一的标识符,稍后可以使用该标识符查找该元素或将其与其他元素连接起来。使用useId
生成它,以避免同一个组件的多个实例之间发生冲突。is
:一个字符串。如果指定,则该组件的行为将类似于 自定义元素。inputMode
:一个字符串。指定要显示哪种键盘(例如,文本、数字或电话)。itemProp
:一个字符串。指定元素代表结构化数据爬虫的属性。lang
:一个字符串。指定元素的语言。onAnimationEnd
:一个AnimationEvent
处理程序 函数。当 CSS 动画完成时触发。onAnimationEndCapture
:onAnimationEnd
的一个版本,在 捕获阶段 触发。onAnimationIteration
:一个AnimationEvent
处理程序 函数。当 CSS 动画的一次迭代结束并开始另一次迭代时触发。onAnimationIterationCapture
:onAnimationIteration
的一个版本,在 捕获阶段 触发。onAnimationStart
:一个AnimationEvent
处理程序 函数。当 CSS 动画开始时触发。onAnimationStartCapture
:onAnimationStart
,但在 捕获阶段 触发。onAuxClick
:一个MouseEvent
处理程序 函数。当单击非主要指针按钮时触发。onAuxClickCapture
:onAuxClick
的一个版本,在 捕获阶段 触发。onBeforeInput
:一个InputEvent
处理程序 函数。在修改可编辑元素的值之前触发。React 尚未使用原生的beforeinput
事件,而是尝试使用其他事件对其进行 polyfill。onBeforeInputCapture
:onBeforeInput
的一个版本,在 捕获阶段 触发。onBlur
:一个FocusEvent
处理程序 函数。当元素失去焦点时触发。与内置浏览器blur
事件不同,在 React 中,onBlur
事件会冒泡。onBlurCapture
:onBlur
的一个版本,在 捕获阶段 触发。onClick
:一个MouseEvent
处理程序 函数。当指针设备上的主按钮被点击时触发。onClickCapture
:onClick
的一个版本,在 捕获阶段 触发。onCompositionStart
:一个CompositionEvent
处理程序 函数。当 输入法编辑器 开始新的组合会话时触发。onCompositionStartCapture
:onCompositionStart
的一个版本,在 捕获阶段 触发。onCompositionEnd
:一个CompositionEvent
处理程序 函数。当 输入法编辑器 完成或取消组合会话时触发。onCompositionEndCapture
:onCompositionEnd
的一个版本,在 捕获阶段 触发。onCompositionUpdate
:一个CompositionEvent
处理程序 函数。当 输入法编辑器 接收到新字符时触发。onCompositionUpdateCapture
:onCompositionUpdate
的一个版本,在 捕获阶段 触发。onContextMenu
:一个MouseEvent
处理程序 函数。当用户尝试打开上下文菜单时触发。onContextMenuCapture
:onContextMenu
的一个版本,在 捕获阶段 触发。onCopy
:一个ClipboardEvent
处理程序 函数。当用户尝试将内容复制到剪贴板时触发。onCopyCapture
:onCopy
的一个版本,在 捕获阶段 触发。onCut
:一个ClipboardEvent
处理程序 函数。当用户尝试将内容剪切到剪贴板时触发。onCutCapture
:onCut
的一个版本,在 捕获阶段 触发。onDoubleClick
:一个MouseEvent
处理程序 函数。当用户双击时触发。对应于浏览器dblclick
事件。onDoubleClickCapture
:onDoubleClick
的一个版本,在 捕获阶段 触发。onDrag
:一个DragEvent
处理程序 函数。当用户拖动某些内容时触发。onDragCapture
:onDrag
的一个版本,在 捕获阶段 触发。onDragEnd
:一个DragEvent
处理器 函数。当用户停止拖动某个东西时触发。onDragEndCapture
:onDragEnd
的一个版本,在 捕获阶段触发。onDragEnter
:一个DragEvent
处理器 函数。当被拖动内容进入有效的放置目标时触发。onDragEnterCapture
:onDragEnter
的一个版本,在 捕获阶段触发。onDragOver
:一个DragEvent
处理器 函数。当被拖动内容在其上方拖动时,在有效的放置目标上触发。您必须在此处调用e.preventDefault()
才能允许放置。onDragOverCapture
:onDragOver
的一个版本,在 捕获阶段触发。onDragStart
:一个DragEvent
处理器 函数。当用户开始拖动元素时触发。onDragStartCapture
:onDragStart
的一个版本,在 捕获阶段触发。onDrop
:一个DragEvent
处理器 函数。当某个东西被放置在有效的放置目标上时触发。onDropCapture
:onDrop
的一个版本,在 捕获阶段触发。onFocus
:一个FocusEvent
处理器 函数。当元素获得焦点时触发。与内置浏览器focus
事件不同,在 React 中,onFocus
事件会冒泡。onFocusCapture
:onFocus
的一个版本,在 捕获阶段触发。onGotPointerCapture
:一个PointerEvent
处理器 函数。当元素以编程方式捕获指针时触发。onGotPointerCaptureCapture
:onGotPointerCapture
的一个版本,在 捕获阶段触发。onKeyDown
:一个KeyboardEvent
处理器 函数。当按下某个键时触发。onKeyDownCapture
:onKeyDown
的一个版本,在 捕获阶段触发。onKeyPress
:一个KeyboardEvent
处理器 函数。已弃用。请改用onKeyDown
或onBeforeInput
。onKeyPressCapture
:onKeyPress
的一个版本,在 捕获阶段触发。onKeyUp
:一个KeyboardEvent
处理器 函数。当释放某个键时触发。onKeyUpCapture
:onKeyUp
的一个版本,在 捕获阶段触发。onLostPointerCapture
:一个PointerEvent
处理器 函数。当元素停止捕获指针时触发。onLostPointerCaptureCapture
:onLostPointerCapture
的一个版本,在捕获阶段触发。onMouseDown
:一个MouseEvent
处理程序函数。当指针按下时触发。onMouseDownCapture
:onMouseDown
的一个版本,在捕获阶段触发。onMouseEnter
:一个MouseEvent
处理程序函数。当指针移动到元素内部时触发。没有捕获阶段。相反,onMouseLeave
和onMouseEnter
从离开的元素传播到进入的元素。onMouseLeave
:一个MouseEvent
处理程序函数。当指针移动到元素外部时触发。没有捕获阶段。相反,onMouseLeave
和onMouseEnter
从离开的元素传播到进入的元素。onMouseMove
:一个MouseEvent
处理程序函数。当指针坐标发生变化时触发。onMouseMoveCapture
:onMouseMove
的一个版本,在捕获阶段触发。onMouseOut
:一个MouseEvent
处理程序函数。当指针移动到元素外部,或者移动到子元素内部时触发。onMouseOutCapture
:onMouseOut
的一个版本,在捕获阶段触发。onMouseUp
:一个MouseEvent
处理程序函数。当指针释放时触发。onMouseUpCapture
:onMouseUp
的一个版本,在捕获阶段触发。onPointerCancel
:一个PointerEvent
处理程序函数。当浏览器取消指针交互时触发。onPointerCancelCapture
:onPointerCancel
的一个版本,在捕获阶段触发。onPointerDown
:一个PointerEvent
处理程序函数。当指针变为活动状态时触发。onPointerDownCapture
:onPointerDown
的一个版本,在捕获阶段触发。onPointerEnter
:一个PointerEvent
处理程序函数。当指针移动到元素内部时触发。没有捕获阶段。相反,onPointerLeave
和onPointerEnter
从离开的元素传播到进入的元素。onPointerLeave
:一个PointerEvent
处理程序函数。当指针移动到元素外部时触发。没有捕获阶段。相反,onPointerLeave
和onPointerEnter
从离开的元素传播到进入的元素。onPointerMove
:一个PointerEvent
处理程序函数。当指针坐标发生变化时触发。onPointerMoveCapture
:onPointerMove
的一个版本,在捕获阶段触发。onPointerOut
:一个PointerEvent
处理程序 函数。当指针移出元素,指针交互被取消,以及 其他一些原因时触发。onPointerOutCapture
:onPointerOut
的一个版本,在 捕获阶段触发。onPointerUp
:一个PointerEvent
处理程序 函数。当指针不再处于活动状态时触发。onPointerUpCapture
:onPointerUp
的一个版本,在 捕获阶段触发。onPaste
:一个ClipboardEvent
处理程序 函数。当用户尝试从剪贴板粘贴内容时触发。onPasteCapture
:onPaste
的一个版本,在 捕获阶段触发。onScroll
:一个Event
处理程序 函数。当元素滚动时触发。此事件不会冒泡。onScrollCapture
:onScroll
的一个版本,在 捕获阶段触发。onSelect
:一个Event
处理程序 函数。在像输入框这样的可编辑元素内部的选区发生变化后触发。React 扩展了onSelect
事件,使其也适用于contentEditable={true}
元素。此外,React 还扩展了它,使其在空选区和编辑(这可能会影响选区)时触发。onSelectCapture
:onSelect
的一个版本,在 捕获阶段触发。onTouchCancel
:一个TouchEvent
处理程序 函数。当浏览器取消触摸交互时触发。onTouchCancelCapture
:onTouchCancel
的一个版本,在 捕获阶段触发。onTouchEnd
:一个TouchEvent
处理程序 函数。当一个或多个触摸点被移除时触发。onTouchEndCapture
:onTouchEnd
的一个版本,在 捕获阶段触发。onTouchMove
:一个TouchEvent
处理程序 函数。当一个或多个触摸点移动时触发。onTouchMoveCapture
:onTouchMove
的一个版本,在 捕获阶段触发。onTouchStart
:一个TouchEvent
处理程序 函数。当一个或多个触摸点被放置时触发。onTouchStartCapture
:onTouchStart
的一个版本,在 捕获阶段触发。onTransitionEnd
:一个TransitionEvent
处理程序 函数。当 CSS 过渡完成时触发。onTransitionEndCapture
:onTransitionEnd
的一个版本,在 捕获阶段触发。onWheel
:一个WheelEvent
处理程序 函数。当用户滚动滚轮按钮时触发。onWheelCapture
:onWheel
的一个版本,在 捕获阶段触发。role
:一个字符串。为辅助技术明确指定元素角色。slot
:一个字符串。指定使用 shadow DOM 时的插槽名称。在 React 中,通常通过将 JSX 作为 props 传递来实现等效模式,例如<Layout left={<Sidebar />} right={<Content />} />
。spellCheck
:一个布尔值或 null。如果显式设置为true
或false
,则启用或禁用拼写检查。tabIndex
:一个数字。覆盖默认的 Tab 键行为。避免使用-1
和0
以外的值。title
:一个字符串。指定元素的工具提示文本。translate
:'yes'
或'no'
。传递'no'
会排除元素内容被翻译。
您还可以将自定义属性作为 props 传递,例如 mycustomprop="someValue"
。这在与第三方库集成时非常有用。自定义属性名称必须为小写,并且不能以 on
开头。该值将转换为字符串。如果传递 null
或 undefined
,则自定义属性将被删除。
这些事件仅针对 <form>
元素触发
onReset
:一个Event
处理程序 函数。当表单被重置时触发。onResetCapture
:onReset
的一个版本,在 捕获阶段触发。onSubmit
:一个Event
处理程序 函数。当表单被提交时触发。onSubmitCapture
:onSubmit
的一个版本,在 捕获阶段触发。
这些事件仅针对 <dialog>
元素触发。与浏览器事件不同,它们在 React 中会冒泡
onCancel
:一个Event
处理程序 函数。当用户尝试关闭对话框时触发。onCancelCapture
:onCancel
的一个版本,在 捕获阶段触发。onClose
:一个Event
处理程序 函数。当对话框已关闭时触发。onCloseCapture
:onClose
的一个版本,在 捕获阶段触发。
这些事件仅针对 <details>
元素触发。与浏览器事件不同,它们在 React 中会冒泡
onToggle
:一个Event
处理程序 函数。当用户切换详情时触发。onToggleCapture
:onToggle
的一个版本,在 捕获阶段触发。
这些事件针对 <img>
、<iframe>
、<object>
、<embed>
、<link>
和 SVG <image>
元素触发。与浏览器事件不同,它们在 React 中会冒泡。
onLoad
:一个Event
处理程序 函数。当资源加载完毕后触发。onLoadCapture
:onLoad
的一个版本,在 捕获阶段触发。onError
:一个Event
处理程序 函数。当资源加载失败时触发。onErrorCapture
:onError
的一个版本,在 捕获阶段触发。
这些事件针对 <audio>
和 <video>
等资源触发。与浏览器事件不同,它们在 React 中会冒泡。
onAbort
:一个Event
处理程序 函数。当资源未完全加载,但不是由于错误而停止加载时触发。onAbortCapture
:onAbort
的一个版本,在 捕获阶段触发。onCanPlay
:一个Event
处理程序 函数。当有足够的数据可以开始播放,但不足以播放到结束而无需缓冲时触发。onCanPlayCapture
:onCanPlay
的一个版本,在 捕获阶段触发。onCanPlayThrough
:一个Event
处理程序 函数。当有足够的数据,很可能可以开始播放而无需缓冲到结束时触发。onCanPlayThroughCapture
:onCanPlayThrough
的一个版本,在 捕获阶段触发。onDurationChange
:一个Event
处理程序 函数。当媒体时长更新时触发。onDurationChangeCapture
:onDurationChange
的一个版本,在 捕获阶段触发。onEmptied
:一个Event
处理程序 函数。当媒体变为空时触发。onEmptiedCapture
:onEmptied
的一个版本,在 捕获阶段触发。onEncrypted
:一个Event
处理程序 函数。当浏览器遇到加密媒体时触发。onEncryptedCapture
:onEncrypted
的一个版本,在 捕获阶段触发。onEnded
:一个Event
处理程序 函数。当播放停止时触发,因为它没有剩余内容可播放。onEndedCapture
:onEnded
的一个版本,在 捕获阶段触发。onError
:一个Event
处理程序 函数。当资源加载失败时触发。onErrorCapture
:onError
的一个版本,在 捕获阶段触发。onLoadedData
:一个Event
处理程序 函数。当当前播放帧已加载时触发。onLoadedDataCapture
:onLoadedData
的一个版本,在 捕获阶段触发。onLoadedMetadata
:一个Event
处理程序 函数。当元数据已加载时触发。onLoadedMetadataCapture
:onLoadedMetadata
的一个版本,在 捕获阶段触发。onLoadStart
:一个Event
处理程序 函数。当浏览器开始加载资源时触发。onLoadStartCapture
:onLoadStart
的一个版本,在 捕获阶段触发。onPause
:一个Event
处理程序 函数。当媒体暂停时触发。onPauseCapture
:onPause
的一个版本,在 捕获阶段触发。onPlay
:一个Event
处理程序 函数。当媒体不再暂停时触发。onPlayCapture
:onPlay
的一个版本,在 捕获阶段触发。onPlaying
:一个Event
处理程序 函数。当媒体开始或重新开始播放时触发。onPlayingCapture
:onPlaying
的一个版本,在 捕获阶段触发。onProgress
:一个Event
处理程序 函数。在资源加载时定期触发。onProgressCapture
:onProgress
的一个版本,在 捕获阶段触发。onRateChange
:一个Event
处理程序 函数。当播放速率改变时触发。onRateChangeCapture
:onRateChange
的一个版本,在 捕获阶段触发。onResize
:一个Event
处理程序 函数。当视频大小改变时触发。onResizeCapture
:onResize
的一个版本,在 捕获阶段触发。onSeeked
:一个Event
处理程序 函数。当 seek 操作完成时触发。onSeekedCapture
:onSeeked
的一个版本,在 捕获阶段 触发。onSeeking
:一个事件
处理程序 函数。当查找操作开始时触发。onSeekingCapture
:onSeeking
的一个版本,在 捕获阶段 触发。onStalled
:一个事件
处理程序 函数。当浏览器正在等待数据但数据一直没有加载时触发。onStalledCapture
:onStalled
的一个版本,在 捕获阶段 触发。onSuspend
:一个事件
处理程序 函数。当资源加载被暂停时触发。onSuspendCapture
:onSuspend
的一个版本,在 捕获阶段 触发。onTimeUpdate
:一个事件
处理程序 函数。当前播放时间更新时触发。onTimeUpdateCapture
:onTimeUpdate
的一个版本,在 捕获阶段 触发。onVolumeChange
:一个事件
处理程序 函数。音量发生变化时触发。onVolumeChangeCapture
:onVolumeChange
的一个版本,在 捕获阶段 触发。onWaiting
:一个事件
处理程序 函数。由于暂时缺少数据而停止播放时触发。onWaitingCapture
:onWaiting
的一个版本,在 捕获阶段 触发。
注意事项
- 您不能同时传递
children
和dangerouslySetInnerHTML
。 - 某些事件(例如
onAbort
和onLoad
)在浏览器中不会冒泡,但在 React 中会冒泡。
ref
回调函数
您可以将一个函数传递给 ref
属性,而不是一个 ref 对象(例如 useRef
返回的对象)。
<div ref={(node) => console.log(node)} />
当 <div>
DOM 节点被添加到屏幕时,React 会调用您的 ref
回调,并将 DOM 节点
作为参数。当 <div>
DOM 节点被移除时,React 会调用您的 ref
回调,并将 null
作为参数。
当您传递不同的 ref
回调时,React 也会调用您的 ref
回调。在上面的例子中,(node) => { ... }
在每次渲染时都是不同的函数。当您的组件重新渲染时,前一个函数将以 null
作为参数被调用,而下一个函数将以 DOM 节点作为参数被调用。
参数
node
:一个 DOM 节点或null
。当 ref 被附加时,React 会将 DOM 节点传递给您,当ref
被分离时,React 会传递null
。除非您在每次渲染时都为ref
回调传递相同的函数引用,否则在组件的每次重新渲染期间,回调都会被暂时分离并重新附加。
React 事件对象
您的事件处理程序将接收到一个React 事件对象。它有时也被称为“合成事件”。
<button onClick={e => {
console.log(e); // React event object
}} />
它符合与底层 DOM 事件相同的标准,但修复了一些浏览器不一致的问题。
一些 React 事件并不能直接映射到浏览器的原生事件。例如,在 onMouseLeave
中,e.nativeEvent
将指向一个 mouseout
事件。具体的映射不是公共 API 的一部分,将来可能会发生变化。如果您由于某种原因需要底层的浏览器事件,请从 e.nativeEvent
中读取它。
属性
React 事件对象实现了一些标准的 Event
属性
bubbles
:布尔值。返回事件是否在 DOM 中冒泡。cancelable
:布尔值。返回事件是否可以取消。currentTarget
:DOM 节点。返回当前处理程序在 React 树中附加到的节点。defaultPrevented
:布尔值。返回是否调用了preventDefault
。eventPhase
:数字。返回事件当前所处的阶段。isTrusted
:布尔值。返回事件是否由用户发起。target
:DOM 节点。返回发生事件的节点(可能是远端子节点)。timeStamp
:数字。返回事件发生的时间。
此外,React 事件对象还提供以下属性
nativeEvent
:DOMEvent
。原始的浏览器事件对象。
方法
React 事件对象实现了部分标准 Event
方法
preventDefault()
: 阻止事件的默认浏览器行为。stopPropagation()
: 阻止事件在 React 树中的传播。
此外,React 事件对象还提供以下方法:
isDefaultPrevented()
: 返回一个布尔值,指示是否调用了preventDefault
。isPropagationStopped()
: 返回一个布尔值,指示是否调用了stopPropagation
。persist()
: 不适用于 React DOM。在 React Native 中,调用此方法可在事件发生后读取事件的属性。isPersistent()
: 不适用于 React DOM。在 React Native 中,返回是否已调用persist
。
注意事项
currentTarget
、eventPhase
、target
和type
的值反映了 React 代码预期值。在底层,React 将事件处理程序附加到根目录,但这不会反映在 React 事件对象中。例如,e.currentTarget
可能与底层的e.nativeEvent.currentTarget
不同。对于 polyfilled 事件,e.type
(React 事件类型)可能与e.nativeEvent.type
(底层类型)不同。
AnimationEvent
处理函数
用于 CSS 动画 事件的事件处理程序类型。
<div
onAnimationStart={e => console.log('onAnimationStart')}
onAnimationIteration={e => console.log('onAnimationIteration')}
onAnimationEnd={e => console.log('onAnimationEnd')}
/>
参数
e
: 一个具有以下额外AnimationEvent
属性的 React 事件对象
ClipboardEvent
处理函数
用于 剪贴板 API 事件的事件处理程序类型。
<input
onCopy={e => console.log('onCopy')}
onCut={e => console.log('onCut')}
onPaste={e => console.log('onPaste')}
/>
参数
-
e
: 一个具有以下额外ClipboardEvent
属性的 React 事件对象
CompositionEvent
处理函数
用于 输入法编辑器 (IME) 事件的事件处理程序类型。
<input
onCompositionStart={e => console.log('onCompositionStart')}
onCompositionUpdate={e => console.log('onCompositionUpdate')}
onCompositionEnd={e => console.log('onCompositionEnd')}
/>
参数
e
:一个React 事件对象,包含以下额外的CompositionEvent
属性
DragEvent
处理函数
HTML 拖放 API 事件的事件处理函数类型。
<>
<div
draggable={true}
onDragStart={e => console.log('onDragStart')}
onDragEnd={e => console.log('onDragEnd')}
>
Drag source
</div>
<div
onDragEnter={e => console.log('onDragEnter')}
onDragLeave={e => console.log('onDragLeave')}
onDragOver={e => { e.preventDefault(); console.log('onDragOver'); }}
onDrop={e => console.log('onDrop')}
>
Drop target
</div>
</>
参数
-
e
:一个React 事件对象,包含以下额外的DragEvent
属性它还包括继承自
MouseEvent
的属性altKey
button
buttons
ctrlKey
clientX
clientY
getModifierState(key)
metaKey
movementX
movementY
pageX
pageY
relatedTarget
screenX
screenY
shiftKey
它还包括继承自
UIEvent
的属性
FocusEvent
处理函数
焦点事件的事件处理函数类型。
<input
onFocus={e => console.log('onFocus')}
onBlur={e => console.log('onBlur')}
/>
参数
-
e
:一个React 事件对象,包含以下额外的FocusEvent
属性它还包括继承自
UIEvent
的属性
Event
处理函数
通用事件的事件处理函数类型。
参数
e
:一个没有额外属性的React 事件对象。
InputEvent
处理函数
onBeforeInput
事件的事件处理函数类型。
<input onBeforeInput={e => console.log('onBeforeInput')} />
参数
e
:一个React 事件对象,包含以下额外的InputEvent
属性
KeyboardEvent
处理函数
用于键盘事件的事件处理程序类型。
<input
onKeyDown={e => console.log('onKeyDown')}
onKeyUp={e => console.log('onKeyUp')}
/>
参数
-
e
:一个 React 事件对象,包含以下额外的KeyboardEvent
属性altKey
charCode
code
ctrlKey
getModifierState(key)
key
keyCode
locale
metaKey
location
repeat
shiftKey
which
它还包括继承自
UIEvent
的属性
MouseEvent
处理函数
用于鼠标事件的事件处理程序类型。
<div
onClick={e => console.log('onClick')}
onMouseEnter={e => console.log('onMouseEnter')}
onMouseOver={e => console.log('onMouseOver')}
onMouseDown={e => console.log('onMouseDown')}
onMouseUp={e => console.log('onMouseUp')}
onMouseLeave={e => console.log('onMouseLeave')}
/>
参数
-
e
:一个 React 事件对象,包含以下额外的MouseEvent
属性altKey
button
buttons
ctrlKey
clientX
clientY
getModifierState(key)
metaKey
movementX
movementY
pageX
pageY
relatedTarget
screenX
screenY
shiftKey
它还包括继承自
UIEvent
的属性
PointerEvent
处理函数
用于 指针事件 的事件处理程序类型。
<div
onPointerEnter={e => console.log('onPointerEnter')}
onPointerMove={e => console.log('onPointerMove')}
onPointerDown={e => console.log('onPointerDown')}
onPointerUp={e => console.log('onPointerUp')}
onPointerLeave={e => console.log('onPointerLeave')}
/>
参数
-
e
:一个 React 事件对象,包含以下额外的PointerEvent
属性它还包括继承自
MouseEvent
的属性altKey
button
buttons
ctrlKey
clientX
clientY
getModifierState(key)
metaKey
movementX
movementY
pageX
pageY
relatedTarget
screenX
screenY
shiftKey
它还包括继承自
UIEvent
的属性
TouchEvent
处理函数
用于 触摸事件 的事件处理程序类型。
<div
onTouchStart={e => console.log('onTouchStart')}
onTouchMove={e => console.log('onTouchMove')}
onTouchEnd={e => console.log('onTouchEnd')}
onTouchCancel={e => console.log('onTouchCancel')}
/>
参数
-
e
:一个 React 事件对象,包含以下额外的TouchEvent
属性它还包括继承自
UIEvent
的属性
TransitionEvent
处理函数
用于 CSS 过渡事件的事件处理程序类型。
<div
onTransitionEnd={e => console.log('onTransitionEnd')}
/>
参数
export default function Avatar({ user }) { return ( <img src={user.imageUrl} alt={'Photo of ' + user.name} className="avatar" style={{ width: user.imageSize, height: user.imageSize }} /> ); }
深入探讨
要根据条件应用 CSS 类,您需要使用 JavaScript 自己生成 className
字符串。
例如,className={'row ' + (isSelected ? 'selected': '')}
会根据 isSelected
是否为 true
来生成 className="row"
或 className="row selected"
。
为了提高可读性,您可以使用像 classnames
: 这样的小型辅助库:
import cn from 'classnames';
function Row({ isSelected }) {
return (
<div className={cn('row', isSelected && 'selected')}>
...
</div>
);
}
如果您有多个条件类,这将特别方便
import cn from 'classnames';
function Row({ isSelected, size }) {
return (
<div className={cn('row', {
selected: isSelected,
large: size === 'large',
small: size === 'small',
})}>
...
</div>
);
}
使用 ref 操作 DOM 节点
有时,您需要获取与 JSX 中的标签关联的浏览器 DOM 节点。例如,如果您想在单击按钮时聚焦 <input>
,则需要在浏览器 <input>
DOM 节点上调用 focus()
。
要获取标签的浏览器 DOM 节点,请声明一个 ref 并将其作为 ref
属性传递给该标签
import { useRef } from 'react';
export default function Form() {
const inputRef = useRef(null);
// ...
return (
<input ref={inputRef} />
// ...
React 会在将 DOM 节点渲染到屏幕后将其放入 inputRef.current
中。
import { useRef } from 'react'; export default function Form() { const inputRef = useRef(null); function handleClick() { inputRef.current.focus(); } return ( <> <input ref={inputRef} /> <button onClick={handleClick}> Focus the input </button> </> ); }
阅读有关使用 ref 操作 DOM 和查看更多示例的更多信息。
对于更高级的用例,ref
属性还接受回调函数。
危险地设置内部 HTML
您可以将原始 HTML 字符串传递给如下所示的元素
const markup = { __html: '<p>some raw html</p>' };
return <div dangerouslySetInnerHTML={markup} />;
这很危险。与底层 DOM innerHTML
属性一样,您必须格外小心!除非标记来自完全受信任的来源,否则很容易以这种方式引入XSS漏洞。
例如,如果您使用将 Markdown 转换为 HTML 的 Markdown 库,您相信其解析器不包含错误,并且用户只能看到他们自己的输入,则可以像这样显示生成的 HTML
import { Remarkable } from 'remarkable'; const md = new Remarkable(); function renderMarkdownToHTML(markdown) { // This is ONLY safe because the output HTML // is shown to the same user, and because you // trust this Markdown parser to not have bugs. const renderedHTML = md.render(markdown); return {__html: renderedHTML}; } export default function MarkdownPreview({ markdown }) { const markup = renderMarkdownToHTML(markdown); return <div dangerouslySetInnerHTML={markup} />; }
{__html}
对象应该尽可能靠近生成 HTML 的位置创建,就像上面示例在 renderMarkdownToHTML
函数中所做的那样。这确保了代码中使用的所有原始 HTML 都被明确标记为此类,并且只有您希望包含 HTML 的变量才会传递给 dangerouslySetInnerHTML
。不建议像 <div dangerouslySetInnerHTML={{__html: markup}} />
那样内联创建对象。
要了解为什么渲染任意 HTML 很危险,请将上面的代码替换为
const post = {
// Imagine this content is stored in the database.
content: `<img src="" onerror='alert("you were hacked")'>`
};
export default function MarkdownPreview() {
// 🔴 SECURITY HOLE: passing untrusted input to dangerouslySetInnerHTML
const markup = { __html: post.content };
return <div dangerouslySetInnerHTML={markup} />;
}
嵌入在 HTML 中的代码将运行。黑客可以利用此安全漏洞窃取用户信息或代表用户执行操作。 仅将 dangerouslySetInnerHTML
与受信任和已清理的数据一起使用。
处理鼠标事件
此示例显示了一些常见的鼠标事件以及它们的触发时间。
export default function MouseExample() { return ( <div onMouseEnter={e => console.log('onMouseEnter (parent)')} onMouseLeave={e => console.log('onMouseLeave (parent)')} > <button onClick={e => console.log('onClick (first button)')} onMouseDown={e => console.log('onMouseDown (first button)')} onMouseEnter={e => console.log('onMouseEnter (first button)')} onMouseLeave={e => console.log('onMouseLeave (first button)')} onMouseOver={e => console.log('onMouseOver (first button)')} onMouseUp={e => console.log('onMouseUp (first button)')} > First button </button> <button onClick={e => console.log('onClick (second button)')} onMouseDown={e => console.log('onMouseDown (second button)')} onMouseEnter={e => console.log('onMouseEnter (second button)')} onMouseLeave={e => console.log('onMouseLeave (second button)')} onMouseOver={e => console.log('onMouseOver (second button)')} onMouseUp={e => console.log('onMouseUp (second button)')} > Second button </button> </div> ); }
export default function PointerExample() { return ( <div onPointerEnter={e => console.log('onPointerEnter (parent)')} onPointerLeave={e => console.log('onPointerLeave (parent)')} style={{ padding: 20, backgroundColor: '#ddd' }} > <div onPointerDown={e => console.log('onPointerDown (first child)')} onPointerEnter={e => console.log('onPointerEnter (first child)')} onPointerLeave={e => console.log('onPointerLeave (first child)')} onPointerMove={e => console.log('onPointerMove (first child)')} onPointerUp={e => console.log('onPointerUp (first child)')} style={{ padding: 20, backgroundColor: 'lightyellow' }} > First child </div> <div onPointerDown={e => console.log('onPointerDown (second child)')} onPointerEnter={e => console.log('onPointerEnter (second child)')} onPointerLeave={e => console.log('onPointerLeave (second child)')} onPointerMove={e => console.log('onPointerMove (second child)')} onPointerUp={e => console.log('onPointerUp (second child)')} style={{ padding: 20, backgroundColor: 'lightblue' }} > Second child </div> </div> ); }
处理焦点事件
在 React 中,焦点事件 会冒泡。您可以使用 currentTarget
和 relatedTarget
来区分获得焦点或失去焦点的事件是否源自父元素外部。此示例展示了如何检测子元素获得焦点、父元素获得焦点以及如何检测焦点进入或离开整个子树。
export default function FocusExample() { return ( <div tabIndex={1} onFocus={(e) => { if (e.currentTarget === e.target) { console.log('focused parent'); } else { console.log('focused child', e.target.name); } if (!e.currentTarget.contains(e.relatedTarget)) { // Not triggered when swapping focus between children console.log('focus entered parent'); } }} onBlur={(e) => { if (e.currentTarget === e.target) { console.log('unfocused parent'); } else { console.log('unfocused child', e.target.name); } if (!e.currentTarget.contains(e.relatedTarget)) { // Not triggered when swapping focus between children console.log('focus left parent'); } }} > <label> First name: <input name="firstName" /> </label> <label> Last name: <input name="lastName" /> </label> </div> ); }
export default function KeyboardExample() { return ( <label> First name: <input name="firstName" onKeyDown={e => console.log('onKeyDown:', e.key, e.code)} onKeyUp={e => console.log('onKeyUp:', e.key, e.code)} /> </label> ); }