【React】React Windowの紹介とリストの作成方法

はじめに

こんにちは、ナオキです!
今回はReactのライブラリである「React Window」について紹介します!
DOM要素の多いリスト表示やグリッド表示を扱うときに役立つと思うので、ぜひ参考にしてください!

対象読者

  • WEB開発を行っている方

React Windowについて

React WindowはReactアプリケーションで沢山のDOM要素を表示する際に表示パフォーマンスを改善するためのライブラリです。
通常多くの要素を一度に表示をしようとすると、表示されるまでに時間がかかってしまいますが、React Windowを使用したらその問題が解決できます!

具体的にいうと、React Windowは画面の表示領域に入っている要素のみをレンダリングします。これにより一度にレンダリングされる量が減り、パフォーマンス改善が見込めます!

React Windowのコンポーネント

React Windowには次の4つのコンポーネント(パッケージ)があります。

  • FixedSizeList
  • VariableSizeList
  • FixedSizeGrid
  • VariableSizeGrid

それぞれの用途を簡単に説明します!

コンポーネント用途
FixedSizeListリスト内の全ての要素が同じ高さ、幅をもつ場合に使用します。
VariableSizeListリスト内の要素が異なる高さ、幅をもつ場合に使用します。
FixedSizeGridグリッドレイアウトで、要素のサイズが一定であり、行数と列数が固定されている場合に使用します。
VariableSizeGridグリッドレイアウトで、要素のサイズが可変であり、行数と列数が動的に変わる場合に使用します。

これらのコンポーネントを用途に合わせて適切に使用しましょう!

プロパティ

それぞれのコンポーネントには豊富なPropsが存在します。
今回は実際にFixedSizeListを使用して簡単なリストを作成していきたいと思いますので、FixeSizeListで主に使われているPropsを紹介します!
()が付いているPropsは必須のPropsになります!

FixedSizeListのProps用途
childrencomponentindex porpによって指定された個々の要素のレンダリングを担当するReactコンポーネント。このコンポーネントは、(位置決めに使用される)style propも受け取ります。
heightnumber | stringリストの高さ
水平リストの場合は数値でも文字列でも大丈夫ですが、縦書きリストの場合は数値でなければなりません。
widthnumber | stringリストの幅
縦書きリストの場合は数値でも文字列でも大丈夫ですが、水平リストの場合は数値でなければなりません
itemCountnumberリスト内の項目の総数
itemSizenumberウィンドウ表示される方向の項目のサイズ
縦書きリストの場合は行の高さ。横長のリストでは列の幅です。
classNamestring一番外側の<div>要素に付けるCSSクラス
layoutstringリストのレイアウト/方向
使用可能な値は以下の2つです
・vertical (デフォルト) 上下スクロール
・horizontal 左右スクロール
itemDataany要素に data propとして渡すデータ
styleobject一番外側の<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コンポーネントでは、表示をさせたい領域をheightwidthでを指定します。
表示させたいコンポーネントの数をItemCountで指定します、表示させたいコンポーネントのheightをitemSizeで指定します。
そしてchildrenとして表示させたいコンポーネントを指定します。
今回はListItemを指定しています。
またchirdrenで指定したコンポーネントはindexstyleを受け取ることができます。

  • index : インデックス番号
  • style : itemSizeなどChildrenに対してのcssプロパティ

今回は受け取ったindexを表示させます。
childrenが受け取ったcssプロパティで補えない場合は別途スタイルを当てる必要があります。(今回の場合はclassNameでTailwindを使用し指定しています。)

以上になります。
とても簡単にFixedSizeListを使用しリストの作成が出来ることがわかってもらえたと思います!

さいごに

今回はReact Windowについての紹介と、実際にReact WindowのFixedSizeListコンポーネントを使って簡単なリストの作成をしました。
React Windowは4つのコンポーネントと豊富なプロパティをうまく使えばさまざまなニーズに対応することが出来ると思うので、パフォーマンス改善として色々試しながら使用してみてください。