React Splide
Reactインテグレーション
概要
React SplideはSplideをReactプロジェクトに導入するためのパッケージです。
インストール
最新版をNPMから取得してください。
$ npm install @splidejs/react-splide
$ npm install @splidejs/react-splide
使用方法
コンポーネント
パッケージから、SplideとSplideSlideの2つのコンポーネントをインポートします。
import{Splide,SplideSlide}from'@splidejs/react-splide';JavaScript
import { Splide, SplideSlide } from '@splidejs/react-splide';
これらを、以下のようにしてレンダリングしてください。
<Splidearia-label="お気に入りの写真"><SplideSlide><imgsrc="image1.jpg"alt="Image 1"/></SplideSlide><SplideSlide><imgsrc="image2.jpg"alt="Image 2"/></SplideSlide></Splide>JSX
<Splide aria-label="お気に入りの写真">
<SplideSlide>
<img src="image1.jpg" alt="Image 1"/>
</SplideSlide>
<SplideSlide>
<img src="image2.jpg" alt="Image 2"/>
</SplideSlide>
</Splide>
CSS
CSSファイルを選択し、インポートしてください。<link>タグで読み込んでも構いません。
// デフォルトのテーマimport'@splidejs/react-splide/css';// または、ほかのテーマimport'@splidejs/react-splide/css/skyblue';import'@splidejs/react-splide/css/sea-green';// あるいは、コアスタイルのみimport'@splidejs/react-splide/css/core';JavaScript
// デフォルトのテーマ import '@splidejs/react-splide/css'; // または、ほかのテーマ import '@splidejs/react-splide/css/skyblue'; import '@splidejs/react-splide/css/sea-green'; // あるいは、コアスタイルのみ import '@splidejs/react-splide/css/core';
構成のカスタマイズ
<Splide>はトラック要素をレンダリングしますが、hasTrackと<SplideTrack>を用いれば、別々に管理できます。例えば、次の2つのコンポーネントは、全く同じ結果を出力します。
import{Splide,SplideTrack,SplideSlide}from'@splidejs/react-splide';<Splide><SplideSlide>...</SplideSlide></Splide><SplidehasTrack={false}><SplideTrack><SplideSlide>...</SplideSlide></SplideTrack></Splide>JSX
import { Splide, SplideTrack, SplideSlide } from '@splidejs/react-splide';
<Splide>
<SplideSlide>...</SplideSlide>
</Splide>
<Splide hasTrack={ false }>
<SplideTrack>
<SplideSlide>...</SplideSlide>
</SplideTrack>
</Splide>
<SplideTrack>を<Splide>から分離することで、矢印やページネーション、あるいはそのほかのコントロール要素を自由に配置できるようになります。例えば、Splideはデフォルトで、矢印をトラック要素の直前にレンダリングしますが、プレースホルダを用いてこの位置を指定できます。
<SplidehasTrack={false}aria-label="..."><divclassName="custom-wrapper"><SplideTrack><SplideSlide>...</SplideSlide></SplideTrack><divclassName="splide__arrows"/></div></Splide>JSX
<Splide hasTrack={ false } aria-label="...">
<div className="custom-wrapper">
<SplideTrack>
<SplideSlide>...</SplideSlide>
</SplideTrack>
<div className="splide__arrows" />
</div>
</Splide>
または、独自の矢印も定義できます。
<SplidehasTrack={false}aria-label="..."><SplideTrack><SplideSlide>...</SplideSlide></SplideTrack><divclassName="splide__arrows"><buttonclassName="splide__arrow splide__arrow--prev">Prev</button><buttonclassName="splide__arrow splide__arrow--next">Next</button></div></Splide>JSX
<Splide hasTrack={ false } aria-label="...">
<SplideTrack>
<SplideSlide>...</SplideSlide>
</SplideTrack>
<div className="splide__arrows">
<button className="splide__arrow splide__arrow--prev">Prev</button>
<button className="splide__arrow splide__arrow--next">Next</button>
</div>
</Splide>
同じようにして、自動再生のトグルボタンや、プログレスバーの表示も行えます。
<SplidehasTrack={false}aria-label="..."><SplideTrack><SplideSlide>...</SplideSlide></SplideTrack><divclassName="splide__progress"><divclassName="splide__progress__bar"/></div><buttonclass="splide__toggle"type="button"><spanclass="splide__toggle__play">Play</span><spanclass="splide__toggle__pause">Pause</span></button></Splide>JSX
<Splide hasTrack={ false } aria-label="...">
<SplideTrack>
<SplideSlide>...</SplideSlide>
</SplideTrack>
<div className="splide__progress">
<div className="splide__progress__bar" />
</div>
<button class="splide__toggle" type="button">
<span class="splide__toggle__play">Play</span>
<span class="splide__toggle__pause">Pause</span>
</button>
</Splide>
あるいは:
<SplidehasTrack={false}aria-label="..."><divclassName="custom-wrapper"><buttonclass="splide__toggle"type="button"><spanclass="splide__toggle__play">Play</span><spanclass="splide__toggle__pause">Pause</span></button><divclassName="splide__progress"><divclassName="splide__progress__bar"/></div><SplideTrack><SplideSlide>...</SplideSlide></SplideTrack></div></Splide>JSX
<Splide hasTrack={ false } aria-label="...">
<div className="custom-wrapper">
<button class="splide__toggle" type="button">
<span class="splide__toggle__play">Play</span>
<span class="splide__toggle__pause">Pause</span>
</button>
<div className="splide__progress">
<div className="splide__progress__bar" />
</div>
<SplideTrack>
<SplideSlide>...</SplideSlide>
</SplideTrack>
</div>
</Splide>
Props
<Splide>はDOMAttributes以外のHTMLAttributesを受け付け、ルート要素に展開します。例えば、classNameや'aria-label'を設定できます。
<SplideclassName="my-carousel"aria-label="お気に入りの写真"></Splide>JSX
<Splide className="my-carousel" aria-label="お気に入りの写真"> </Splide>
加えて、以下で述べるいくつかのプロパティを取ります。
options
options: OptionsSplideのオプション をオブジェクトで渡します。
<Splideoptions={{rewind:true,width:800,gap:'1rem',}}></Splide>JSX
<Splide
options={ {
rewind: true,
width : 800,
gap : '1rem',
} }
>
</Splide>
このプロパティはリアクティブであり、値を更新するとスライダー自身も更新されますが、読み取り専用のオプションは変更しないでください。
tag
tag: 'div' | 'section' | 'header' | 'footer' | 'nav' = 'div'ルート要素に使用するタグを変更します。後方互換のため、初期値は'div'ですが、'section'を推奨します。
もしheader、footerならびにnavを使用する場合は、適切なランドマークロールも同時に指定する必要があります。そうしないと、不適切なアクセシビリティツリーが出来上がります。
<Splidetag="section"></Splide>JSX
<Splide tag="section"></Splide>
extensions
Extensions: Record<string, ComponentConstructor>エクステンションをオブジェクト形式で追加します。
transition
Transition: ComponentConstructorトランジションコンポーネントを上書きます。
hasTrack
hasTrack: booleanトラック要素をレンダリングするかどうかを決めます。
イベント
Splideコンポーネント経由で、Splide内のすべてのイベントにハンドラを登録できます。ハンドラの関数名はイベント名から生成されますが、"on"接頭子の付加、キャメルケースへの変換、コロンの削除という3つの処理が行われます。たとえば、"arrows:mounted"は"onArrowsMounted"に変換されます。
実際のイベントリストは、このソースから確認できます。
<SplideonArrowsMounted={(splide,prev,next)=>{console.log(prev,next)}}>JSX
<Splide onArrowsMounted={ ( splide, prev, next ) => { console.log( prev, next ) } }>
なお、ハンドラの第一引数は常にSplideのインスタンスで、オリジナルの引数はそのあとに続きます。
Splideインスタンスの取得
Splideインスタンスを取得し、直接操作したい場合は、React.createRefメソッドまたはuseRefフックによるRefオブジェクトを介して取得できます。
<Splideref={ref}>...</Splide>JSX
<Splide ref={ ref }>
...
</Splide>
ReactがSplideコンポーネントをマウントした後で、ref.current.splideからインスタンスを取得してください(マウント前はundefinedです)。
componentDidMount(){if(this.ref.current){console.log(this.ref.current.splide.length);}}// またはuseEffect(()=>{if(ref.current){console.log(ref.current.splide.length);}});JSX
componentDidMount() {
if ( this.ref.current ) {
console.log( this.ref.current.splide.length );
}
}
// または
useEffect( () => {
if ( ref.current ) {
console.log( ref.current.splide.length );
}
} );
サンプル
以下に簡単な例を示します。
123456789101112131415161718192021222324importReactfrom'react';import{Splide,SplideSlide}from'@splidejs/react-splide';exportdefault()=>{return(<Splideoptions={{rewind:true,gap:'1rem',}}aria-label="お気に入りの写真"><SplideSlide><imgsrc="image1.jpg"alt="Image 1"/></SplideSlide><SplideSlide><imgsrc="image2.jpg"alt="Image 2"/></SplideSlide><SplideSlide><imgsrc="image3.jpg"alt="Image 3"/></SplideSlide></Splide>);}JSX
import React from 'react';
import { Splide, SplideSlide } from '@splidejs/react-splide';
export default () => {
return (
<Splide
options={ {
rewind: true,
gap : '1rem',
} }
aria-label="お気に入りの写真"
>
<SplideSlide>
<img src="image1.jpg" alt="Image 1"/>
</SplideSlide>
<SplideSlide>
<img src="image2.jpg" alt="Image 2"/>
</SplideSlide>
<SplideSlide>
<img src="image3.jpg" alt="Image 3"/>
</SplideSlide>
</Splide>
);
}
このページで、実際に動作している例を見ることができ、それぞれのソースコードは以下の場所に置いてあります。
v3か らの移行方法
v3からv4へ移行するには、次の手順を参考にしてください。
- 破壊的変更に目を通します
- もしこれらの変更が既存のスライダーに影響を与える場合は、v3からv4への移行を参考に「スライダー要素」以外を修正します
- 下に記載した「廃止されたプロパティ」を利用している場合は、構成のカスタマイズを参考に、コンポーネントをアップデートします
ExtensionsプロパティをextensionsにTransitionプロパティをtransitionに変更します- CSSを更新します(古いパスのままでも動作しますが、短縮パスも利用可能になりました)
- (任意)あたらしく追加された
i18nを翻訳します - (任意)
aria-labelまたはaria-labelledbyをそれぞれのスライダーに挿入します
以下のプロパティは廃止されました。
hasSliderWrapperhasAutoplayProgresshasAutoplayControlsplayButtonLabelpauseButtonLabelrenderControls