<div> などの一般的なコンポーネント
<div> などすべての組み込みブラウザコンポーネントは、いくつかの共通の props とイベントをサポートしています。
- リファレンス
<div>などの一般的なコンポーネントrefコールバック関数- React イベントオブジェクト
AnimationEventハンドラ関数ClipboardEventハンドラ関数CompositionEventハンドラ関数DragEventハンドラ関数FocusEventハンドラ関数Eventハンドラ関数InputEventハンドラ関数KeyboardEventハンドラ関数MouseEventハンドラ関数PointerEventハンドラ関数TouchEventハンドラ関数TransitionEventハンドラ関数UIEventハンドラ関数WheelEventハンドラ関数
- 使用法
リファレンス
<div> などの一般的なコンポーネント
<div className="wrapper">Some content</div>props
これらの特別な React の props はすべての組み込みコンポーネントでサポートされています。
-
children: React ノード(要素、文字列、数値、ポータル、nullやundefinedやブーリアンのような空ノード、あるいは他の React ノードの配列)。コンポーネントの内容を指定します。JSX を使用する場合、通常は<div><span /></div>のようにタグをネストすることで props として暗黙的にchildrenを指定します。 -
dangerouslySetInnerHTML:{ __html: '<p>some html</p>' }という形式の、内部に生の HTML 文字列を含んだオブジェクト。DOM ノードのinnerHTMLプロパティを上書きし、渡された HTML を表示します。これは最大限に注意して使用する必要があります! 内部の HTML が信頼できない場合(例えば、ユーザデータに基づいている場合)、XSS 脆弱性を導入するリスクがあります。dangerouslySetInnerHTMLの使用について詳しく読む -
ref:useRefまたはcreateRefから得られる ref オブジェクト、またはrefコールバック関数、またはレガシー ref 用の文字列。指定された ref にこのノードの DOM 要素が渡されます。ref を使った DOM の操作について詳しく読む -
suppressContentEditableWarning: ブーリアン値。trueの場合、React がchildrenとcontentEditable={true}を両方持つ要素(通常、これらは一緒に動作しません)に対して表示する警告を抑止します。contentEditableの内容を手動で管理するテキスト入力ライブラリを作成している場合に使用します。 -
suppressHydrationWarning: ブーリアン値。サーバレンダリングを使用する場合、通常、サーバとクライアントが異なる内容をレンダーすると警告が表示されます。一部の稀なケース(タイムスタンプなど)では、完全な一致を保証することが非常に困難または不可能です。suppressHydrationWarningをtrueに設定すると、React はその要素の属性と内容の不一致について警告しなくなります。これは 1 レベルの深さまでしか機能せず、避難ハッチとして使用することを目的としています。過度な使用はしないでください。ハイドレーションエラーの抑制について読む -
style: CSS スタイルを持つオブジェクト。例えば{ fontWeight: 'bold', margin: 20 }のようなものです。DOM のstyleプロパティと同様に、CSS プロパティ名はcamelCaseで記述する必要があります。例えばfont-weightではなくfontWeightと書きます。値として文字列や数値を渡すことができます。数値を渡す場合、例えば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 Drag and Drop API の一部です。enterKeyHint: 文字列。仮想キーボードのエンターキーに対してどのアクションを表示するかを指定します。htmlFor: 文字列。<label>と<output>に対して、ラベルを何らかのコントロールに関連付ける ために使います。HTML のfor属性と同じです。React では HTML 属性名ではなく、標準の DOM プロパティ名 (htmlFor) の方を使用します。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ハンドラ関数。要素がフォーカスを失ったときに発火します。React のonBlurイベントは、ブラウザの組み込みblurイベントとは異なり、バブルします。onBlurCapture:onBlurのキャプチャフェーズで発火するバージョン。onClick:MouseEventハンドラ関数。ポインティングデバイスのプライマリボタンがクリックされたときに発火します。onClickCapture:onClickのキャプチャフェーズで発火するバージョン。onCompositionStart:CompositionEventハンドラ関数。インプットメソッドエディタ (IME) が新しいコンポジションセッションを開始するときに発火します。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ハンドラ関数。1 つ以上のタッチポイントが削除されると発火します。onTouchEndCapture:onTouchEndのキャプチャフェーズで発火するバージョン。onTouchMove:TouchEventハンドラ関数。1 つ以上のタッチポイントが移動すると発火します。onTouchMoveCapture:onTouchMoveのキャプチャフェーズで発火するバージョン。onTouchStart:TouchEventハンドラ関数。1 つ以上のタッチポイントが配置されると発火します。onTouchStartCapture:onTouchStartのキャプチャフェーズで発火するバージョン。onTransitionEnd:TransitionEventハンドラ関数。CSS のトランジションが完了すると発火します。onTransitionEndCapture:onTransitionEndのキャプチャフェーズで発火するバージョン。onWheel:WheelEventハンドラ関数。ユーザがホイールボタンを回転させると発火します。onWheelCapture:onWheelのキャプチャフェーズで発火するバージョン。role: 文字列。支援技術に対して要素の役割を明示的に指定します。slot: 文字列。シャドウ 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ハンドラ関数。シーク操作が完了したときに発火します。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のキャプチャフェーズで発火するバージョン。
注意点
childrenとdangerouslySetInnerHTMLを同時に渡すことはできません。- 一部のイベント(
onAbortやonLoadなど)はブラウザではバブルしませんが、React ではバブルします。
ref コールバック関数
useRef などが返す ref オブジェクトの代わりに、ref 属性に関数を渡すことができます。
<div ref={(node) => console.log(node)} /><div> DOM ノードが画面に追加されると、React はその DOM node を引数として ref コールバックを呼び出します。<div> DOM ノードが削除されると、React は null を引数として ref コールバックを呼び出します。
React は、異なる ref コールバックが渡された場合も ref コールバックを呼び出します。上記の例では、(node) => { ... } は毎回のレンダーで異なる関数です。コンポーネントが再レンダーされると、前の関数が null を引数として呼び出され、次の関数が DOM ノードを引数として呼び出されます。
引数
node: DOM ノードまたはnull。ref がアタッチされるときに React は DOM ノードを渡し、refがデタッチされるときにnullを渡します。毎回のレンダーでrefコールバックに同じ関数参照を渡さない限り、コールバックは一時的にデタッチされ、コンポーネントの再レンダーごとに再アタッチされます。
React イベントオブジェクト
イベントハンドラは React イベントオブジェクトを受け取ります。これは “合成イベント (synthetic event)” とも呼ばれることがあります。
<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: DOM のEvent。オリジナルのブラウザイベントオブジェクト。
メソッド
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とは同じでないかもしれません。ポリフィルされたイベントでは、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 ハンドラ関数
Clipboard 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: 以下の追加のCompositionEventプロパティを持つ React イベントオブジェクト。
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: 以下の追加のDragEventプロパティを持つ React イベントオブジェクト。また、継承元である
MouseEventのプロパティも含みます:altKeybuttonbuttonsctrlKeyclientXclientYgetModifierState(key)metaKeymovementXmovementYpageXpageYrelatedTargetscreenXscreenYshiftKey
また、継承元である
UIEventのプロパティも含みます:
FocusEvent ハンドラ関数
フォーカスイベントのためのイベントハンドラタイプです。
<input
onFocus={e => console.log('onFocus')}
onBlur={e => console.log('onBlur')}
/>引数
-
e: 以下の追加のFocusEventプロパティを持つ React イベントオブジェクト。また、継承元である
UIEventのプロパティも含みます:
Event ハンドラ関数
一般的なイベントのためのイベントハンドラタイプです。
引数
e: 追加のプロパティがない React イベントオブジェクト。
InputEvent ハンドラ関数
onBeforeInput イベントのためのイベントハンドラタイプです。
<input onBeforeInput={e => console.log('onBeforeInput')} />引数
e: 以下の追加のInputEventプロパティを持つ React イベントオブジェクト。
KeyboardEvent ハンドラ関数
キーボードイベントのためのイベントハンドラタイプです。
<input
onKeyDown={e => console.log('onKeyDown')}
onKeyUp={e => console.log('onKeyUp')}
/>引数
-
e: 以下の追加のKeyboardEventプロパティを持つ React イベントオブジェクト。altKeycharCodecodectrlKeygetModifierState(key)keykeyCodelocalemetaKeylocationrepeatshiftKeywhich
また、継承元である
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: 以下の追加のMouseEventプロパティを持つ React イベントオブジェクト。altKeybuttonbuttonsctrlKeyclientXclientYgetModifierState(key)metaKeymovementXmovementYpageXpageYrelatedTargetscreenXscreenYshiftKey
また、継承元である
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: 以下の追加のPointerEventプロパティを持つ React イベントオブジェクト。また、継承元である
MouseEventのプロパティも含みます:altKeybuttonbuttonsctrlKeyclientXclientYgetModifierState(key)metaKeymovementXmovementYpageXpageYrelatedTargetscreenXscreenYshiftKey
また、継承元である
UIEventのプロパティも含みます:
TouchEvent ハンドラ関数
タッチイベントのためのイベントハンドラタイプです。
<div
onTouchStart={e => console.log('onTouchStart')}
onTouchMove={e => console.log('onTouchMove')}
onTouchEnd={e => console.log('onTouchEnd')}
onTouchCancel={e => console.log('onTouchCancel')}
/>引数
-
e: 以下の追加のTouchEventプロパティを持つ React イベントオブジェクト。また、継承元である
UIEventのプロパティも含みます:
TransitionEvent ハンドラ関数
CSS トランジションイベントのためのイベントハンドラタイプです。
<div
onTransitionEnd={e => console.log('onTransitionEnd')}
/>引数
e: 以下の追加のTransitionEventプロパティを持つ React イベントオブジェクト。
UIEvent ハンドラ関数
一般的な UI イベントのためのイベントハンドラタイプです。
<div
onScroll={e => console.log('onScroll')}
/>引数
e: 以下の追加のUIEventプロパティを持つ React イベントオブジェクト。
WheelEvent ハンドラ関数
onWheel イベントのためのイベントハンドラタイプです。
<div
onWheel={e => console.log('onWheel')}
/>引数
-
e: 以下の追加のWheelEventプロパティを持つ React イベントオブジェクト。また、継承元である
MouseEventのプロパティも含みます:altKeybuttonbuttonsctrlKeyclientXclientYgetModifierState(key)metaKeymovementXmovementYpageXpageYrelatedTargetscreenXscreenYshiftKey
また、継承元である
UIEventのプロパティも含みます:
使用法
CSS スタイルの適用
React では、CSS クラスを className で指定します。これは HTML の class 属性と同様に動作します。
<img className="avatar" />そして別の CSS ファイルでそれに対する CSS ルールを記述します。
/* In your CSS */
.avatar {
border-radius: 50%;
}React は CSS ファイルの追加方法を規定しません。最も単純なケースでは、HTML に <link> タグを追加します。ビルドツールやフレームワークを使用している場合は、そのドキュメンテーションを参照して、プロジェクトに CSS ファイルを追加する方法を学んでください。
時には、スタイルの値がデータに依存することがあります。style 属性を使用して、一部のスタイルを動的に渡します。
<img
className="avatar"
style={{
width: user.imageSize,
height: user.imageSize
}}
/>上記の例では、style={{}} は特別な構文ではなく、style={ } という JSX の波括弧内の通常の {} オブジェクトです。スタイルが JavaScript 変数に依存する場合にのみ style 属性を使用することをお勧めします。
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 であるとマークされるようになり、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> ); }