React API リファレンス

@reelkit/react のコンポーネント、props、メソッドの完全なリファレンスです。

Reel の Props

ReelProps

Prop型デフォルト説明
countnumber必須アイテムの総数
size[number, number]-[幅, 高さ] の形での幅と高さ。省略すると ResizeObserver で自動計測します
itemBuilder(index, indexInRange, size) => ReactElement必須各スライドを描画する関数
direction'vertical' | 'horizontal''vertical'スクロールの方向
initialIndexnumber0開始時のインデックス
loopbooleanfalse無限ループを有効にします
enableWheelbooleanfalseマウスホイールでの操作を有効にします
wheelDebounceMsnumber200ホイールイベントのデバウンス(ms)
enableNavKeysbooleantrueキーボード操作を有効にします
onNavKeyPress(increment: -1 | 1) => void-矢印キーによる操作の独自ハンドラー。デフォルトの前後移動を置き換えます。
transitionTransitionTransformFnslideTransitionトランジション効果の関数。組み込み:slideTransition、fadeTransition、flipTransition、cubeTransition、zoomTransition
transitionDurationnumber300アニメーションの長さ(ms)
enableGesturesbooleantrueタッチやマウスのドラッグによる操作を有効にします
swipeDistanceFactornumber0.12スワイプのしきい値(0-1)
rangeExtractor(index: number, count: number) => number[]defaultRangeExtractor描画するインデックスを決める独自の関数
keyExtractor(index: number) => string-React の差分更新に使う独自のキー関数(ループ時に便利)
apiRefRefObject<ReelApi>-API のメソッドにアクセスするための ref
classNamestring-コンテナー要素の CSS クラス
styleCSSProperties-コンテナー要素のインラインスタイル
ariaLabelstring-スクリーンリーダーが読み上げる、カルーセル領域のアクセシブルなラベル

コールバック

Prop型説明
afterChange(index, indexInRange) => voidスライドの切り替えが完了したあとに呼ばれます
beforeChange(index, nextIndex, indexInRange) => voidスライドの切り替えが始まる前に呼ばれます
onSlideDragStart(index) => voidドラッグジェスチャーが始まったときに呼ばれます
onSlideDragEnd(index) => voidドラッグジェスチャーが終わったときに呼ばれます
onSlideDragCanceled(index) => voidドラッグがキャンセルされたときに呼ばれます

ReelApi のメソッド

apiRef からスライダーのメソッドにアクセスします:

typescript
const apiRef = useRef<ReelApi>(null);

// Navigation
apiRef.current?.next();
apiRef.current?.prev();
apiRef.current?.goTo(5);           // instant
apiRef.current?.goTo(5, true);     // animated

// Lifecycle
apiRef.current?.adjust();          // recalculate positions
apiRef.current?.observe();         // start observing keyboard
apiRef.current?.unobserve();       // stop observing keyboard
メソッド型説明
next()() => void次のスライドへ移動します
prev()() => void前のスライドへ移動します
goTo(index, animate?)(number, boolean?) => Promise指定したスライドへ移動します
adjust()() => voidスライドの位置を計算し直します
observe()() => voidキーボードの監視を始めます
unobserve()() => voidキーボードの監視を止めます

ReelIndicator の Props

ReelIndicatorProps

Prop型デフォルト説明
countnumber自動アイテムの総数。Reel の中に置けば親から自動で接続されます。単独で使うときは明示的に渡してください
activenumber自動現在アクティブなインデックス。Reel の中に置けば親から自動で接続されます。単独で使うときは明示的に渡してください
direction'vertical' | 'horizontal''vertical'インジケーターの向き
radiusnumber3ドットの大きさ(ピクセル)
visiblenumber5通常サイズで表示するドットの最大数
gapnumber4ドットの間隔(ピクセル)
activeColorstring'#fff'アクティブなドットの色
inactiveColorstring'rgba(255,255,255,0.5)'非アクティブなドットの色
edgeScalenumber0.5はみ出した端のドットの縮小率
onDotClick(index: number) => void-ドットがクリックされたときのコールバック
classNamestring-独自の CSS クラス
styleCSSProperties-独自のインラインスタイル

オブザーバーコンポーネント

Observe

親を再レンダリングさせずに、コアのシグナルを React の描画につなぎます。購読しているシグナルが変わったときに再実行されるのは、children の関数だけです。

tsx
import { Observe } from '@reelkit/react';

<Observe signals={[controller.state.index]}>
  {() => <span>Current: {controller.state.index.value}</span>}
</Observe>
Prop型デフォルト説明
signalsSubscribable[]必須購読するシグナル。どれかが通知すると children の関数が再実行されます。再実行されるのはその関数だけで、親は再レンダリングされません。後のレンダーで別のシグナルを渡すと、置き換えられたものの代わりにそちらを追従します。
children() => ReactElement | null必須変更のたびに再実行される描画関数。シグナルの値はこの中で読んでください。外で読んだ値は一度だけ取り込まれ、古くなります。

AnimatedObserve

アニメーションする値のシグナルを購読し、requestAnimationFrame でなめらかに補間します。

tsx
import { AnimatedObserve } from '@reelkit/react';

<AnimatedObserve signal={controller.state.axisValue}>
  {(value) => (
    <div style={{ transform: `translateY(${value}px)` }} />
  )}
</AnimatedObserve>
Prop型デフォルト説明
signalSignal<AnimatedValue>必須{ value, duration, done? } を出すシグナル。duration が 0 より大きければ現在の値から新しい値へ補間し、0 ならすぐその値になります。
children(value: number) => ReactElement必須現在のフレームの補間された値を受け取る描画関数。DOM がアニメーションに遅れないよう、同期的に反映されます。

SwipeToClose

<SwipeToClose> は子要素を縦のスワイプに追従するコンテナーで包み、スワイプがしきい値を超えると onClose を呼びます。Lightbox と Stories Player の閉じるジェスチャーを、自分の独自のオーバーレイで使うためのものです。SwipeToCloseProps はそのプロップの型で、SwipeToCloseDirection は 'up' | 'down' です。

プロップ型デフォルト説明
directionSwipeToCloseDirection必須'up' は Lightbox のように、'down' は Stories Player のように閉じます
onClose() => void必須スワイプがしきい値を超え、退場アニメーションが終わったあとに呼ばれます
enabledbooleantrueアンマウントせずにジェスチャーを無効にします
thresholdnumber0.2スワイプが移動しなければならないビューポートの高さの割合
classNamestring—外側の <div> に付けるクラス
childrenReactNode必須スワイプと一緒に動く中身

SoundProvider

<SoundProvider> は最初はミュートの SoundController を 1 つ作り、useSoundState を通して子に渡します。オーバーレイは自分で 1 つ描画するので、独自のプロバイダーを足すのは、コントロールがミュートの状態を共有する独自のプレイヤーを囲むときだけです。

フック

useBodyLock

body のスクロールを止め、スクロールバーの幅によるずれを補正します。

typescript
import { useBodyLock } from '@reelkit/react';

// Lock body scroll when overlay is open
useBodyLock(isOpen);

useOverlayUrlState

OverlayUrlStateOptions

オーバーレイ用の URL 状態コントローラーを作ります。それを *UrlOverlay の controller プロップに渡します。

手順と例は React ガイドの URL の状態 を参照してください。

オプション型デフォルト説明
paramstring必須アクティブなスライドを持つクエリパラメーター(たとえば "photo")。最初の描画で読まれ、コンポーネントが生きているあいだは固定です。変えるには再マウント(key を付ける)してください。
adapterUrlAdapterHistory API読み書きに使うナビゲーションの仕組み。ルーターを使うアプリでは、ルーター自身の位置情報が古くならないよう、ルーターに連動したアダプターを渡してください。最初の描画で読まれ、コンポーネントが生きているあいだは固定です。変えるには再マウントしてください。
codec{ decode(raw) => Id | null; encode(id) => string }必須通信形式:パラメーターの文字列 ↔ 安定した識別子で、コレクションは見ません。同じ Id を共有する対として locator と一緒に使います。デフォルトの ?photo=3 のインデックスギャラリーなら ...urlIndexKey(() => images.length) を展開し、ギャラリーが並べ替えられてもブックマークが保たれるようにするなら独自のもの(base64、スラッグ)を用意します。毎回読まれるので、次のデコードやエンコードは最新の描画の codec が担当します。
locator{ locate(id) => number | null; locateAsync?(id) => Promise<number | null>; identify(index) => id }必須識別子を位置に対応させ、その妥当性を自分で判断します:locate(同期)、locateAsync(ページングされたギャラリー向けの非同期フォールバック)、identify(書き込み)。単純なインデックスのギャラリーなら ...urlIndexKey(() => images.length) を展開します。この locator と対応する codec を提供し、?photo=3 を現在の件数で制限するので、古い ?photo=99 は指されていないスライドを開く代わりに URL から取り除かれます。ページングされたフィードや識別子で指すギャラリーは、代わりに独自の codec と locator の対を用意します。毎回読まれるので、次の検索には最新の描画の locator が答え、描画のあいだに locateAsync を追加または削除すると、次に見つからなかったときから反映されます。

useReactRouterUrlAdapter

React Router に連動した UrlAdapter です。ルーターを使うアプリで useOverlayUrlState の adapter オプションに渡すと、ナビゲーションの信頼できる情報源がルーターだけに保たれます。ルーターの裏で history.pushState を書くと、その位置情報が古くなり、次のナビゲーションでパラメーターが消えます。書き込むのはクエリだけなので、パス名とハッシュはそのまま残ります。変更のたびに、ルーターが同じページで push したのか、replace したのか、履歴をたどったのかを報告するので、<Link> から開いたギャラリーは 1 回戻るだけで閉じます。

独自のサブパスから提供されるので、ルーターを使わないアプリのバンドルに react-router-dom が入ることはありません。react-router-dom は任意の peer dependency です。

tsx
import { useReactRouterUrlAdapter } from '@reelkit/react/react-router-url-adapter';

const adapter = useReactRouterUrlAdapter();
const photo = useOverlayUrlState({
  param: 'photo',
  adapter,
  ...urlIndexKey(() => images.length),
});

useReelContext

useReelContext() は最も近い親の <Reel> の ReelContextValue を読み、外側では null を返します。<ReelIndicator> はこれで自分を接続します。<Reel> の子として描画する独自のコントロールで使えば、プロップなしでスライダーに追従します。ReelContext はその裏にあるコンテキストオブジェクトです。自分の値を渡すのはテストや独自のラッパーの中だけにしてください。

プロパティ型説明
indexSignal<number>アクティブなスライドのインデックス。.value は Observe の中で読みます
countSignal<number>スライドの総数
goTo(index: number, animate?: boolean) => Promise<void>スライドへ移動します。アニメーションの有無を選べます

useSoundState

useSoundState() は最も近い <SoundProvider> から SoundController を読み、外側では例外を投げます。Reel Player、Lightbox、Stories Player は中身をプロバイダーで包んでいるので、レンダープロップで渡す独自のコントロールからこれを呼んで、ミュートの状態を読んだり切り替えたりできます。

useFullscreen

useFullscreen({ ref }) は ref の要素に対して Fullscreen API を操作し、コンポーネントがアンマウントされるとフルスクリーンを終了します。UseFullscreenProps はその引数、UseFullscreenResult は返すタプルです。

インデックス型説明
[0]Signal<boolean>ページがフルスクリーンかどうか。.value は Observe の中で読みます
[1]() => Promise<void>要素のフルスクリーンを要求します。別の要素がフルスクリーンなら先に抜けます
[2]() => Promise<void>フルスクリーンを終了します
[3]() => Promise<void>2 つの状態を切り替えます

アクセシビリティ

<Reel> は aria-roledescription="carousel" を持つ role="region" として描画されます。ariaLabel プロップを指定すると、スクリーンリーダー向けの名前が付きます。控えめなライブリージョンが、カルーセルを再レンダリングせずに、スライドが変わるたびに「Slide N of M」と読み上げます。非アクティブなスライドには inert 属性が付くので、フォーカスや支援技術での移動では飛ばされます。

<ReelIndicator> は、ドットにローミング tabindex を持つ role="tablist" として描画されます。矢印キーでフォーカスが移動し、Enter か Space でスライドが有効になります。

<Reel> を囲む独自のモーダルを作るなら、フォーカスを戻したり閉じ込めたりするために captureFocusForReturn、createFocusTrap、getFocusableElements が @reelkit/react から再エクスポートされています。

ユーティリティ

createDefaultKeyExtractorForLoop

loop が有効なときに重複するインデックスを扱うキーエクストラクターを作ります。

tsx
import { createDefaultKeyExtractorForLoop } from '@reelkit/react';

<Reel
  count={items.length}
  size={size}
  loop
  keyExtractor={createDefaultKeyExtractorForLoop(items.length)}
  itemBuilder={...}
/>

サイズの検出

observeElementSize、getViewportSize、observeViewportSize、isMobileWidth、fitAspectRatio、isTouchDevice は @reelkit/react から再エクスポートされています。reelkit のオーバーレイと同じ方法で自分の大きさを決める独自のオーバーレイに使えます。コア API のサイズの検出を参照してください。

自動再生とダウンロード

createTimerController、createSlideshowController、downloadFile も @reelkit/react から再エクスポートされています。それぞれ Stories Player を動かすタイマー、Lightbox の autoAdvance を動かすスライドショー、そのダウンロードボタンの裏にあるヘルパーです。コア API の自動再生とダウンロードを参照してください。