<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('Attached', node);
return () => {
console.log('Clean up', node)
}
}}>
<div>
DOM ノードが画面に追加されると、React はその DOM node
を引数として ref
コールバックを呼び出します。<div>
DOM ノードが削除されると、React はコールバックが返したクリーンアップ関数を呼び出します。
React は、異なる ref
コールバックが渡された場合も ref
コールバックを呼び出します。上記の例では、(node) => { ... }
は毎回のレンダーで異なる関数です。コンポーネントが再レンダーされると、前の関数が null
を引数として呼び出され、次の関数が DOM ノードを引数として呼び出されます。
引数
node
: DOM ノード。ref がアタッチされるときに React は DOM ノードを渡します。毎回のレンダーでref
コールバックに同じ関数参照を渡さない限り、コンポーネントのレンダー毎に一時的なクリーンアップと再作成が繰り返されることになります。
返り値
- 省略可能 クリーンアップ関数:
ref
がデタッチされると、React はクリーンアップ関数を呼び出します。ref コールバックが関数を返さない場合、ref がデタッチされたときに、React は null を引数として再度コールバックを呼び出しますが、この動作は将来のバージョンで削除される予定です。
注意事項
- Strict Mode が有効の場合、React は最終的なセットアップの前に、開発時専用のセットアップ+クリーンアップのサイクルを追加で 1 回実行します。これはクリーンアップのロジックがセットアップロジックに「鏡のように対応」しており、セットアップが行っていることが何であれそれの停止ないし取り消しを行っている、ということを保証するために行う、ストレステストです。問題が生じている場合は正しくクリーンアップ関数を実装してください。
- 異なる
ref
のコールバックを渡した場合、React は古いコールバックのクリーンアップが存在する場合それをまず実行します。クリーンアップ関数が定義されていない場合は、ref
コールバック自体がnull
を引数にして呼び出されます。その後新しい関数が、DOM ノードを引数にして呼び出されます。
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
のプロパティも含みます: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
: 以下の追加の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 イベントオブジェクト。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
: 以下の追加のMouseEvent
プロパティを持つ React イベントオブジェクト。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
: 以下の追加のPointerEvent
プロパティを持つ React イベントオブジェクト。また、継承元である
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
: 以下の追加の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
のプロパティも含みます:altKey
button
buttons
ctrlKey
clientX
clientY
getModifierState(key)
metaKey
movementX
movementY
pageX
pageY
relatedTarget
screenX
screenY
shiftKey
また、継承元である
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> ); }