所有内置浏览器组件,例如 <div>,都支持一些常见的属性和事件。
🌐 All built-in browser components, such as <div>, support some common props and events.
参考
🌐 Reference
常见组件(例如 <div>)
🌐 Common components (e.g. <div>)
<div className="wrapper">Some content</div>属性
🌐 Props
所有内置组件都支持这些特殊的 React 属性:
🌐 These special React props are supported for all built-in components:
children:一个 React 节点(一个元素、一个字符串、一个数字、一个门户, 一个空节点比如null、undefined和布尔值,或者一个由其他 React 节点组成的数组)。指定组件内部的内容。当你使用 JSX 时,通常通过嵌套标签如<div><span /></div>隐式指定children属性。dangerouslySetInnerHTML:一个形式为{ __html: '<p>some html</p>' }的对象,内部包含原始 HTML 字符串。它会覆盖 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 属性:
🌐 These standard DOM props are also supported for all built-in components:
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>,允许你 将标签与某个控件关联。 与forHTML 属性。 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事件,而是尝试通过其他事件来填充它。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](https://web.nodejs.cn/en-US/docs/Web/Accessibility/ARIA/Roles):一个字符串。明确地为辅助技术指定元素角色。[slot](https://web.nodejs.cn/en-US/docs/Web/Accessibility/ARIA/Roles):一个字符串。在使用 shadow DOM 时指定插槽名称。在 React 中,通常通过将 JSX 作为 props 传递来实现类似的模式,例如<Layout left={<Sidebar />} right={<Content />} />。spellCheck:布尔值或空值。如果明确设置为true或false,则启用或禁用拼写检查。tabIndex:一个数字。覆盖默认的 Tab 键行为。避免使用除-1和0之外的值。[title](https://web.nodejs.cn/en-US/docs/Web/HTML/Global_attributes/title): 一个字符串。指定该元素的工具提示文本。translate:可以是'yes'或'no'。传递'no'会排除元素内容的翻译。
你也可以将自定义属性作为 props 传递,例如 mycustomprop="someValue"。这在与第三方库集成时可能很有用。自定义属性名必须是小写字母,并且不能以 on 开头。其值将被转换为字符串。如果你传递 null 或 undefined,该自定义属性将被移除。
🌐 You can also pass custom attributes as props, for example mycustomprop="someValue". This can be useful when integrating with third-party libraries. The custom attribute name must be lowercase and must not start with on. The value will be converted to a string. If you pass null or undefined, the custom attribute will be removed.
这些事件仅在 <form> 元素上触发:
🌐 These events fire only for the <form> elements:
onReset:一个Event处理程序函数。当表单被重置时触发。onResetCapture:onReset的一个版本,会在捕获阶段触发。onSubmit:一个Event处理程序函数。当表单提交时触发。onSubmitCapture:onSubmit的一个版本,会在捕获阶段触发。
这些事件仅在 <dialog> 元素上触发。与浏览器事件不同,它们在 React 中会冒泡:
🌐 These events fire only for the <dialog> elements. Unlike browser events, they bubble in React:
onCancel:一个Event处理程序函数。当用户尝试关闭对话框时触发。onCancelCapture:onCancel的一个版本,会在捕获阶段触发。onClose:一个Event处理函数。当对话框关闭时触发。onCloseCapture:onClose的一个版本,会在捕获阶段触发。
这些事件仅在 <details> 元素上触发。与浏览器事件不同,它们在 React 中会冒泡:
🌐 These events fire only for the <details> elements. Unlike browser events, they bubble in React:
onToggle:一个Event处理函数。当用户切换详细信息时触发。onToggleCapture:onToggle的一个版本,会在捕获阶段触发。
这些事件会在 <img>、<iframe>、<object>、<embed>、<link> 和 SVG <image> 元素上触发。与浏览器事件不同,它们在 React 中会冒泡:
🌐 These events fire for <img>, <iframe>, <object>, <embed>, <link>, and SVG <image> elements. Unlike browser events, they bubble in React:
onLoad:一个Event处理程序 函数。当资源加载完成时触发。onLoadCapture:onLoad的一个版本,会在捕获阶段触发。onError:一个Event处理程序函数。当资源无法加载时触发。onErrorCapture:一个在捕获阶段触发的onError版本
这些事件会在像 <audio> 和 <video> 这样的资源上触发。与浏览器事件不同,它们会在 React 中冒泡:
🌐 These events fire for resources like <audio> and <video>. Unlike browser events, they bubble in 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处理程序函数。当搜索操作完成时触发。onSeekedCapture:onSeeked的一个版本,会在捕获阶段触发。onSeeking:一个Event处理程序函数。当开始搜索操作时触发。onSeekingCapture:onSeeking的一个版本,会在捕获阶段触发。onStalled:一个Event处理程序函数。当浏览器在等待数据时却一直无法加载时触发。onStalledCapture:onStalled的一个版本,会在捕获阶段触发。onSuspend:一个Event处理函数。当加载资源被暂停时触发。onSuspendCapture:onSuspend的一个版本,会在捕获阶段触发。onTimeUpdate:一个Event处理函数。在当前播放时间更新时触发。onTimeUpdateCapture:onTimeUpdate的一个版本,会在捕获阶段触发。onVolumeChange:一个Event处理程序函数。当音量发生变化时触发。onVolumeChangeCapture:onVolumeChange的一个版本,会在捕获阶段触发。onWaiting:一个Event处理程序函数。当由于临时缺少数据而停止播放时触发。onWaitingCapture:onWaiting的一个版本,会在捕获阶段触发。
注意事项
🌐 Caveats
- 你不能同时传入
children和dangerouslySetInnerHTML。 - 有些事件(比如
onAbort和onLoad)在浏览器中不会冒泡,但在 React 中会冒泡。
ref 回调函数
🌐 ref callback function
你可以将一个函数传递给 ref 属性,而不是传递一个 ref 对象(比如由 useRef 返回的对象)。
🌐 Instead of a ref object (like the one returned by useRef), you may pass a function to the ref attribute.
<div ref={(node) => {
console.log('Attached', node);
return () => {
console.log('Clean up', node)
}
}}>当 <div> DOM 节点被添加到屏幕上时,React 会使用 DOM node 作为参数调用你的 ref 回调。当该 <div> DOM 节点被移除时,React 会调用从回调中返回的清理函数。
🌐 When the <div> DOM node is added to the screen, React will call your ref callback with the DOM node as the argument. When that <div> DOM node is removed, React will call your the cleanup function returned from the callback.
每当你传入一个不同的 ref 回调时,React 也会调用你的 ref 回调。在上述示例中,(node) => { ... } 在每次渲染时都是一个不同的函数。当你的组件重新渲染时,之前 的函数将以 null 作为参数被调用,而 下一个 函数将以 DOM 节点被调用。
🌐 React will also call your ref callback whenever you pass a different ref callback. In the above example, (node) => { ... } is a different function on every render. When your component re-renders, the previous function will be called with null as the argument, and the next function will be called with the DOM node.
参数
🌐 Parameters
node:一个 DOM 节点。当 ref 被附加时,React 会将 DOM 节点传递给你。除非你在每次渲染时都传递相同的函数引用给ref回调,否则该回调会在组件每次重新渲染时暂时清理并重新创建。
返回
🌐 Returns
- 可选
cleanup function:当ref被分离时,React 会调用清理函数。如果ref回调没有返回函数,当ref被分离时,React 会再次以null作为参数调用该回调。此行为将在将来的版本中移除。
注意事项
🌐 Caveats
- 当严格模式开启时,React 会在第一次真正的 setup 之前额外运行一次仅用于开发的 setup+cleanup 循环。这是一个压力测试,用于确保你的 cleanup 逻辑与 setup 逻辑“镜像”,并停止或撤销 setup 所做的任何操作。如果这导致问题,请实现 cleanup 函数。
- 当你传递一个不同的
ref回调时,如果提供了,React 将调用上一个回调的清理函数。如果没有定义清理函数,ref回调将以null作为参数被调用。下一个函数将以 DOM 节点为参数被调用。
React 事件对象
🌐 React event object
你的事件处理程序将接收到一个 React 事件对象。它有时也被称为“合成事件”。
🌐 Your event handlers will receive a React event object. It is also sometimes known as a “synthetic event”.
<button onClick={e => {
console.log(e); // React event object
}} />它符合与底层 DOM 事件相同的标准,但修复了一些浏览器不一致的问题。
🌐 It conforms to the same standard as the underlying DOM events, but fixes some browser inconsistencies.
某些 React 事件并不直接映射到浏览器的原生事件。例如在 onMouseLeave 中,e.nativeEvent 将指向 mouseout 事件。具体的映射不是公共 API 的一部分,将来可能会发生变化。如果由于某种原因需要底层浏览器事件,请从 e.nativeEvent 读取。
🌐 Some React events do not map directly to the browser’s native events. For example in onMouseLeave, e.nativeEvent will point to a mouseout event. The specific mapping is not part of the public API and may change in the future. If you need the underlying browser event for some reason, read it from e.nativeEvent.
属性
🌐 Properties
React 事件对象实现了一些标准 Event 属性:
🌐 React event objects implement some of the standard Event properties:
bubbles:一个布尔值。返回事件是否会在 DOM 中冒泡。[cancelable](https://web.nodejs.cn/en-US/docs/Web/API/Event/cancelable):布尔值。返回事件是否可以取消。currentTarget:一个 DOM 节点。返回当前处理程序在 React 树中附加的节点。defaultPrevented:一个布尔值。返回preventDefault是否被调用。eventPhase:一个数字。返回事件当前处于哪个阶段。isTrusted:一个布尔值。返回事件是否由用户发起。target:一个 DOM 节点。返回事件发生的节点(可能是一个远程子节点)。timeStamp:一个数字。返回事件发生的时间。
此外,React 事件对象提供以下属性:
🌐 Additionally, React event objects provide these properties:
nativeEvent:一个 DOMEvent。原始的浏览器事件对象。
方法
🌐 Methods
React 事件对象实现了一些标准 Event 方法:
🌐 React event objects implement some of the standard Event methods:
preventDefault():阻止事件的默认浏览器行为。stopPropagation():阻止事件在 React 树中的传播。
此外,React 事件对象提供了这些方法:
🌐 Additionally, React event objects provide these methods:
isDefaultPrevented():返回一个布尔值,指示是否调用了preventDefault。isPropagationStopped():返回一个布尔值,指示是否调用了stopPropagation。persist():不用于 React DOM。在 React Native 中,在事件之后调用此方法以读取事件的属性。isPersistent():不适用于 React DOM。在 React Native 中,返回persist是否已被调用。
注意事项
🌐 Caveats
currentTarget、eventPhase、target和type的值反映了你的 React 代码所期望的值。在底层,React 会在根节点附加事件处理程序,但这并不会反映在 React 事件对象中。例如,e.currentTarget可能与底层的e.nativeEvent.currentTarget不同。对于带有 polyfill 的事件,e.type(React 事件类型)可能与e.nativeEvent.type(底层类型)不同。
AnimationEvent 处理函数
🌐 AnimationEvent handler function
用于 CSS 动画 事件的事件处理程序类型。
🌐 An event handler type for the CSS animation events.
<div
onAnimationStart={e => console.log('onAnimationStart')}
onAnimationIteration={e => console.log('onAnimationIteration')}
onAnimationEnd={e => console.log('onAnimationEnd')}
/>参数
🌐 Parameters
e:一个具有这些额外AnimationEvent属性的 React 事件对象 :
ClipboardEvent 处理函数
🌐 ClipboardEvent handler function
用于 Clipboard API 事件的事件处理程序类型。
🌐 An event handler type for the Clipboard API events.
<input
onCopy={e => console.log('onCopy')}
onCut={e => console.log('onCut')}
onPaste={e => console.log('onPaste')}
/>参数
🌐 Parameters
e:一个具有这些额外ClipboardEvent属性的 React 事件对象 :
CompositionEvent 处理函数
🌐 CompositionEvent handler function
用于 输入法编辑器 (IME) 事件的事件处理程序类型。
🌐 An event handler type for the input method editor (IME) events.
<input
onCompositionStart={e => console.log('onCompositionStart')}
onCompositionUpdate={e => console.log('onCompositionUpdate')}
onCompositionEnd={e => console.log('onCompositionEnd')}
/>参数
🌐 Parameters
e:一个具有这些额外CompositionEvent属性的 React 事件对象 :
DragEvent 处理函数
🌐 DragEvent handler function
用于 HTML 拖放 API 事件的事件处理程序类型。
🌐 An event handler type for the HTML Drag and Drop API events.
<>
<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>
</>参数
🌐 Parameters
-
e:一个具有这些额外DragEvent属性的 React 事件对象:它还包括继承的
MouseEvent属性:altKeybuttonbuttonsctrlKeyclientXclientYgetModifierState(key)metaKeymovementXmovementYpageXpageYrelatedTargetscreenXscreenYshiftKey
它还包括继承的
UIEvent属性:
FocusEvent 处理函数
🌐 FocusEvent handler function
焦点事件的事件处理程序类型。
🌐 An event handler type for the focus events.
<input
onFocus={e => console.log('onFocus')}
onBlur={e => console.log('onBlur')}
/>参数
🌐 Parameters
-
e:一个具有这些额外FocusEvent属性的 React 事件对象 :它还包括继承的
UIEvent属性:
Event 处理函数
🌐 Event handler function
通用事件的事件处理程序类型。
🌐 An event handler type for generic events.
参数
🌐 Parameters
e:一个没有附加属性的 React 事件对象。
InputEvent 处理函数
🌐 InputEvent handler function
onBeforeInput 事件的事件处理程序类型。
🌐 An event handler type for the onBeforeInput event.
<input onBeforeInput={e => console.log('onBeforeInput')} />参数
🌐 Parameters
e:一个具有这些额外InputEvent属性的 React 事件对象 :
KeyboardEvent 处理函数
🌐 KeyboardEvent handler function
键盘事件的事件处理程序类型。
🌐 An event handler type for keyboard events.
<input
onKeyDown={e => console.log('onKeyDown')}
onKeyUp={e => console.log('onKeyUp')}
/>参数
🌐 Parameters
-
e:一个具有这些额外KeyboardEvent属性的 React 事件对象 :altKeycharCodecodectrlKeygetModifierState(key)keykeyCodelocalemetaKeylocationrepeatshiftKeywhich
它还包括继承的
UIEvent属性:
MouseEvent 处理函数
🌐 MouseEvent handler function
鼠标事件的事件处理程序类型。
🌐 An event handler type for mouse events.
<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')}
/>参数
🌐 Parameters
-
e:一个具有这些额外MouseEvent属性的 React 事件对象:altKeybuttonbuttonsctrlKeyclientXclientYgetModifierState(key)metaKeymovementXmovementYpageXpageYrelatedTargetscreenXscreenYshiftKey
它还包括继承的
UIEvent属性:
PointerEvent 处理函数
🌐 PointerEvent handler function
用于指针事件的事件处理程序类型
🌐 An event handler type for pointer events.
<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')}
/>参数
🌐 Parameters
-
e:一个具有这些额外PointerEvent属性的 React 事件对象:它还包括继承的
MouseEvent属性:altKeybuttonbuttonsctrlKeyclientXclientYgetModifierState(key)metaKeymovementXmovementYpageXpageYrelatedTargetscreenXscreenYshiftKey
它还包括继承的
UIEvent属性:
TouchEvent 处理函数
🌐 TouchEvent handler function
用于触摸事件的事件处理程序类型
🌐 An event handler type for touch events.
<div
onTouchStart={e => console.log('onTouchStart')}
onTouchMove={e => console.log('onTouchMove')}
onTouchEnd={e => console.log('onTouchEnd')}
onTouchCancel={e => console.log('onTouchCancel')}
/>参数
🌐 Parameters
-
e:一个具有这些额外TouchEvent属性的 React 事件对象:它还包括继承的
UIEvent属性:
TransitionEvent 处理函数
🌐 TransitionEvent handler function
CSS 转场事件的事件处理程序类型。
🌐 An event handler type for the CSS transition events.
<div
onTransitionEnd={e => console.log('onTransitionEnd')}
/>参数
🌐 Parameters
e:一个具有这些额外TransitionEvent属性的 React 事件对象 :
UIEvent 处理函数
🌐 UIEvent handler function
通用 UI 事件的事件处理程序类型。
🌐 An event handler type for generic UI events.
<div
onScroll={e => console.log('onScroll')}
/>参数
🌐 Parameters
e:一个具有这些额外UIEvent属性的 React 事件对象:
WheelEvent 处理函数
🌐 WheelEvent handler function
onWheel 事件的事件处理程序类型。
🌐 An event handler type for the onWheel event.
<div
onWheel={e => console.log('onWheel')}
/>参数
🌐 Parameters
-
e:一个具有这些额外WheelEvent属性的 React 事件对象 :它还包括继承的
MouseEvent属性:altKeybuttonbuttonsctrlKeyclientXclientYgetModifierState(key)metaKeymovementXmovementYpageXpageYrelatedTargetscreenXscreenYshiftKey
它还包括继承的
UIEvent属性:
用法
🌐 Usage
应用 CSS 样式
🌐 Applying CSS styles
在 React 中,你可以使用 className. 指定一个 CSS 类。它的作用类似于 HTML 中的 class 属性:
🌐 In React, you specify a CSS class with className. It works like the class attribute in HTML:
<img className="avatar" />然后在单独的 CSS 文件中为其编写 CSS 规则:
🌐 Then you write the CSS rules for it in a separate CSS file:
/* In your CSS */
.avatar {
border-radius: 50%;
}React 并没有规定如何添加 CSS 文件。在最简单的情况下,你可以在 HTML 中添加一个 <link> 标签。如果你使用构建工具或框架,请查阅其文档以了解如何将 CSS 文件添加到你的项目中。
🌐 React does not prescribe how you add CSS files. In the simplest case, you’ll add a <link> tag to your HTML. If you use a build tool or a framework, consult its documentation to learn how to add a CSS file to your project.
有时,样式值取决于数据。使用 style 属性可以动态传递一些样式:
🌐 Sometimes, the style values depend on data. Use the style attribute to pass some styles dynamically:
<img
className="avatar"
style={{
width: user.imageSize,
height: user.imageSize
}}
/>在上面的示例中,style={{}} 并不是特殊的语法,而是 style={ } JSX 大括号 内的常规 {} 对象。我们建议仅在样式依赖于 JavaScript 变量时使用 style 属性。
🌐 In the above example, style={{}} is not a special syntax, but a regular {} object inside the style={ } JSX curly braces. We recommend only using the style attribute when your styles depend on JavaScript variables.
export default function Avatar({ user }) { return ( <img src={user.imageUrl} alt={'Photo of ' + user.name} className="avatar" style={{ width: user.imageSize, height: user.imageSize }} /> ); }
深入研究
🌐 How to apply multiple CSS classes conditionally?
要有条件地应用 CSS 类,你需要使用 JavaScript 自己生成 className 字符串。
🌐 To apply CSS classes conditionally, you need to produce the className string yourself using JavaScript.
例如,className={'row ' + (isSelected ? 'selected': '')} 将根据 isSelected 是否为 true 生成 className="row" 或 className="row selected"。
🌐 For example, className={'row ' + (isSelected ? 'selected': '')} will produce either className="row" or className="row selected" depending on whether isSelected is true.
为了使其更易读,你可以使用一个像 classnames: 这样的小型辅助库
🌐 To make this more readable, you can use a tiny helper library like classnames:
import cn from 'classnames';
function Row({ isSelected }) {
return (
<div className={cn('row', isSelected && 'selected')}>
...
</div>
);
}如果你有多个条件类,这将特别方便:
🌐 It is especially convenient if you have multiple conditional classes:
import cn from 'classnames';
function Row({ isSelected, size }) {
return (
<div className={cn('row', {
selected: isSelected,
large: size === 'large',
small: size === 'small',
})}>
...
</div>
);
}使用引用操作 DOM 节点
🌐 Manipulating a DOM node with a ref
有时,你需要获取与 JSX 标签关联的浏览器 DOM 节点。例如,如果你想在点击按钮时聚焦 <input>,你需要在浏览器 <input> DOM 节点上调用 focus()。
🌐 Sometimes, you’ll need to get the browser DOM node associated with a tag in JSX. For example, if you want to focus an <input> when a button is clicked, you need to call focus() on the browser <input> DOM node.
要获取标签的浏览器 DOM 节点,声明一个 ref 并将其作为 ref 属性传递给该标签:
🌐 To obtain the browser DOM node for a tag, declare a ref and pass it as the ref attribute to that tag:
import { useRef } from 'react';
export default function Form() {
const inputRef = useRef(null);
// ...
return (
<input ref={inputRef} />
// ...React 会在节点渲染到屏幕之后,将 DOM 节点放入 inputRef.current。
🌐 React will put the DOM node into inputRef.current after it’s been rendered to the screen.
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> </> ); }
阅读更多关于使用 refs 操作 DOM的信息,并查看更多示例。
🌐 Read more about manipulating DOM with refs and check out more examples.
对于更高级的用例,ref 属性也接受一个 回调函数。
🌐 For more advanced use cases, the ref attribute also accepts a callback function.
危险地设置内部 HTML
🌐 Dangerously setting the inner HTML
你可以像这样将原始 HTML 字符串传递给元素:
🌐 You can pass a raw HTML string to an element like so:
const markup = { __html: '<p>some raw html</p>' };
return <div dangerouslySetInnerHTML={markup} />;这是危险的。与底层 DOM innerHTML 属性一样,你必须极其小心!除非标记来自完全可信的来源,否则通过这种方式引入 XSS 漏洞是非常容易的。
例如,如果你使用将 Markdown 转换为 HTML 的 Markdown 库,你相信它的解析器不包含错误,并且用户只能看到他们自己的输入,你可以像这样显示生成的 HTML:
🌐 For example, if you use a Markdown library that converts Markdown to HTML, you trust that its parser doesn’t contain bugs, and the user only sees their own input, you can display the resulting HTML like this:
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,并且只有你期望包含 HTML 的变量才会被传递给 dangerouslySetInnerHTML。不建议像 <div dangerouslySetInnerHTML={{__html: markup}} /> 那样内联创建对象。
🌐 The {__html} object should be created as close to where the HTML is generated as possible, like the above example does in the renderMarkdownToHTML function. This ensures that all raw HTML being used in your code is explicitly marked as such, and that only variables that you expect to contain HTML are passed to dangerouslySetInnerHTML. It is not recommended to create the object inline like <div dangerouslySetInnerHTML={{__html: markup}} />.
要了解为什么渲染任意 HTML 是危险的,请将上面的代码替换为:
🌐 To see why rendering arbitrary HTML is dangerous, replace the code above with this:
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。
🌐 The code embedded in the HTML will run. A hacker could use this security hole to steal user information or to perform actions on their behalf. Only use dangerouslySetInnerHTML with trusted and sanitized data.
处理鼠标事件
🌐 Handling mouse events
此示例显示了一些常见的鼠标事件以及它们触发的时间。
🌐 This example shows some common mouse events and when they fire.
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> ); }
处理指针事件
🌐 Handling pointer events
此示例显示了一些常见的指针事件以及它们何时触发。
🌐 This example shows some common pointer events and when they fire.
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> ); }
处理焦点事件
🌐 Handling focus events
在 React 中,聚焦事件 会冒泡。你可以使用 currentTarget 和 relatedTarget 来区分聚焦或失焦事件是否源自父元素之外。示例展示了如何检测子元素被聚焦、父元素被聚焦,以及如何检测焦点进入或离开整个子树。
🌐 In React, focus events bubble. You can use the currentTarget and relatedTarget to differentiate if the focusing or blurring events originated from outside of the parent element. The example shows how to detect focusing a child, focusing the parent element, and how to detect focus entering or leaving the whole subtree.
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> ); }
处理键盘事件
🌐 Handling keyboard events
此示例显示了一些常见的键盘事件以及它们触发的时间。
🌐 This example shows some common keyboard events and when they fire.
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> ); }