旧ブログ(ISSEN)から移行しました

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

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

塩見直樹
塩見直樹5分で読めます

はじめに

こんにちは、株式会社TOKOSのナオキです!
今回は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を使用して簡単なリストを作成していきたいと思いますので、FixedSizeListで主に使われている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-window: render everything

Documentation for the react-window NPM package

react-window.vercel.app

開発環境

  • react: "18.2.0"
  • react-window: "^1.8.10"
  • typescript: "^5.3.3"
  • next: "^14.1.0"
  • tailwindcss: "^3.3.3"

今回はTailwindcssを使用しています。

FixedSizeListを使用したリスト

サンプルリスト

今回はFixedSizeListを使用してリストのサンプルを作成しました。

コード

List.tsx
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>
  )
 
  // FixedSizeListコンポーネントを使ってリストを作成
  return (
    <div>
      <FixedSizeList
        height={400} // リストの高さ
        width={300} // リストの幅
        itemCount={1000} // 要素の総数
        itemSize={50} // 要素の高さ
      >
        {ListItem}
      </FixedSizeList>
    </div>
  )
}

コード説明

まずReact Windowの中からFixedSizeListをインポートします。
FixedSizeListコンポーネントでは、表示をさせたい領域をheightwidthでを指定します。
表示させたいコンポーネントの数をItemCountで指定します、表示させたいコンポーネントのheightをitemSizeで指定します。
そしてchildrenとして表示させたいコンポーネントを指定します。
今回はListItemを指定しています。
またchildrenで指定したコンポーネントはindexstyleを受け取ることができます。

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

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

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

さいごに

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

この記事を書いた人

塩見直樹
塩見直樹

TOKOSのバックエンドエンジニア。パフォーマンス最適化と可読性の向上を目指しています。アニメ好きで、特にHUNTER×HUNTERが好きです。