はじめに
こんにちは、ナオキです!
今回はReactのライブラリである「React Window」について紹介します!
DOM要素の多いリスト表示やグリッド表示を扱うときに役立つと思うので、ぜひ参考にしてください!
- WEB開発を行っている方
React Windowについて
React WindowはReactアプリケーションで沢山のDOM要素を表示する際に表示パフォーマンスを改善するためのライブラリです。
通常多くの要素を一度に表示をしようとすると、表示されるまでに時間がかかってしまいますが、React Windowを使用したらその問題が解決できます!
具体的にいうと、React Windowは画面の表示領域に入っている要素のみをレンダリングします。これにより一度にレンダリングされる量が減り、パフォーマンス改善が見込めます!
React Windowには次の4つのコンポーネント(パッケージ)があります。
- FixedSizeList
- VariableSizeList
- FixedSizeGrid
- VariableSizeGrid
それぞれの用途を簡単に説明します!
コンポーネント | 用途 |
---|---|
FixedSizeList | リスト内の全ての要素が同じ高さ、幅をもつ場合に使用します。 |
VariableSizeList | リスト内の要素が異なる高さ、幅をもつ場合に使用します。 |
FixedSizeGrid | グリッドレイアウトで、要素のサイズが一定であり、行数と列数が固定されている場合に使用します。 |
VariableSizeGrid | グリッドレイアウトで、要素のサイズが可変であり、行数と列数が動的に変わる場合に使用します。 |
これらのコンポーネントを用途に合わせて適切に使用しましょう!
それぞれのコンポーネントには豊富なPropsが存在します。
今回は実際にFixedSizeListを使用して簡単なリストを作成していきたいと思いますので、FixeSizeListで主に使われているPropsを紹介します!
(※)が付いているPropsは必須のPropsになります!
FixedSizeListのProps | 型 | 用途 |
---|---|---|
※ children | component | index porpによって指定された個々の要素のレンダリングを担当するReactコンポーネント。このコンポーネントは、(位置決めに使用される)style propも受け取ります。 |
※ height | number | string | リストの高さ 水平リストの場合は数値でも文字列でも大丈夫ですが、縦書きリストの場合は数値でなければなりません。 |
※ width | number | string | リストの幅 縦書きリストの場合は数値でも文字列でも大丈夫ですが、水平リストの場合は数値でなければなりません |
※ itemCount | number | リスト内の項目の総数 |
※ itemSize | number | ウィンドウ表示される方向の項目のサイズ 縦書きリストの場合は行の高さ。横長のリストでは列の幅です。 |
className | string | 一番外側の<div>要素に付けるCSSクラス |
layout | string | リストのレイアウト/方向 使用可能な値は以下の2つです ・vertical (デフォルト) 上下スクロール ・horizontal 左右スクロール |
itemData | any | 要素に data propとして渡すデータ |
style | object | 一番外側の<div>要素に付けるインラインスタイル (オプション) |
詳しく知りたい方は下記を参照してください!
開発環境
- react: “18.2.0”
- react-window: “^1.8.10”
- typescript: “^5.3.3”
- next: “^14.1.0”
- tailwindcss: “^3.3.3”
今回はTailwindcssを使用しています。
FixedSizeListを使用したリスト
今回はFixedSizeListを使用してリストのサンプルを作成しました。
import React from "react"
import { FixedSizeList } from "react-window"
export default function List() {
// レンダリングする要素を定義しています
const ListItem = ({
index, // 要素のインデックス
style, // 要素のスタイル
}: {
index: number
style: React.CSSProperties
}) => (
<div
style={style} // 要素のスタイルを適用
className="flex items-center justify-center border" // 要素のスタイルを適用
>
Item {index} // 要素のインデックスを表示
</div>
)
return (
<div
{/* FixedSizeListコンポーネントを使ってリストを作成 */}
<FixedSizeList
height={400} // リストの高さ
width={300} // リストの幅
itemCount={1000} // 要素の総数
itemSize={50} // 要素の高さ
>
{ListItem}
</FixedSizeList>
</div>
)
}
まずReact Windowの中からFixedSizeListをインポートします。
FixedSizeListコンポーネントでは、表示をさせたい領域をheight
とwidth
でを指定します。
表示させたいコンポーネントの数をItemCount
で指定します、表示させたいコンポーネントのheightをitemSize
で指定します。
そしてchildren
として表示させたいコンポーネントを指定します。
今回はListItem
を指定しています。
またchirdren
で指定したコンポーネントはindex
とstyle
を受け取ることができます。
- index : インデックス番号
- style : itemSizeなどChildrenに対してのcssプロパティ
今回は受け取ったindex
を表示させます。children
が受け取ったcssプロパティで補えない場合は別途スタイルを当てる必要があります。(今回の場合はclassName
でTailwindを使用し指定しています。)
以上になります。
とても簡単にFixedSizeListを使用しリストの作成が出来ることがわかってもらえたと思います!
さいごに
今回はReact Windowについての紹介と、実際にReact WindowのFixedSizeListコンポーネントを使って簡単なリストの作成をしました。
React Windowは4つのコンポーネントと豊富なプロパティをうまく使えばさまざまなニーズに対応することが出来ると思うので、パフォーマンス改善として色々試しながら使用してみてください。