React Table v8 で row ごとに表示/非表示を変えるフラグを表示するセルを作る


こんにちはフロントエンドエンジニアの茶木です。
React Table v8 で 列ごとにフラグを表示(非表示)するセルを作ります。

🚩 を表示するセルですね。

シンプルな方法

Forum(掲示板一覧)テーブルを想定しています。

flag という bool値を row にもたせてフラグの出し分けをするというものです。

const columnHelper = createColumnHelper<Forum>();

const columns = [
  columnHelper.accessor("flag", {
    header: "フラグ数",
    cell: FlagCell,
  }),
  columnHelper.accessor("unread", {
    header: "未読数",
  }),
  columnHelper.accessor("timestamp", {
    header: "更新日",
    cell: DateCell,
  }),
  columnHelper.accessor("title", {
    header: "タイトル",
  }),
  columnHelper.accessor("important", {
    header: "重要",
  }),
];

const table = useReactTable<Forum>({
  data: rows,
  columns,
  getCoreRowModel: getCoreRowModel(),
});

useReactTable から テーブルを生成する方法は 【React Table v7 → v8】【TypeScript 】アップデートの勘所 も参照ください。今回注目するのは、FlagCell です。

type Props = CellContext<Folum, boolean>
export const FlagCell = (props: Props): ReactElement => {
  return <Cell>{props.getValue() ? "🚩" : " " }</Cell>;
};

props.getValue() から accessor で指定した key の値( flag )が取得でき、これによりフラグの出し分けをしています。

他のセルの値を参照する方法

flag という bool値を row にもたせず、他の値を参照して行うとします。

const columnHelper = createColumnHelper<Forum>();
const columns = [
  {
    header: "フラグ数",
    cell: FlagCell,
  },
  columnHelper.accessor("unread", {
    header: "未読数",
  }),
  // :
  // 省略
  // :
  columnHelper.accessor("important", {
    header: "重要",
  }),
];

FlagCell は他のセルの値を参照して表示を行うので、 accessor でキーを指定する必要がないため、 columnHelper も不要です。

ここでは 未読数( unread ) と重要( important )の値を参照して、フラグの有無を判断します。

type Props = CellContext<Folum, undefined>
export const FlagCell = (props: Props): ReactElement => {
  const { unread, important } = props.row.origin;
  const flag = unread > 0 && important;
  return <Cell>{ flag ? "🚩" : " " }</Cell>;
};

props.row.origin から対象の row の値すべてにアクセスできます。

ここでは、未読件数が1つ以上かつ重要であるものにフラグを設定しています。

おわり

これで rowごとにフラグの判定ができるようになりました。

実際の状況では、複数のテーブルがあり、セルはある程度テーブル間で汎用化されるべきだと思います。つまり、日付のセルや時間のセルは、別のテーブルでも使えるような設計が望ましいです。

それを踏まえると、フラグセルも汎用化したいところです。そのためには、フラグの表示/非表示の判定ルールはセル内に持たせないほうが良さそうだと感じます。ルールの外部化について次回挑戦してみようと考えています。

Gaji-Labo は React 開発の実績と知見があります

フロントエンド開発の専門家である私たちが御社の開発チームに入ることで、バックエンドも含めた全体の開発効率が上がります。

「人手が足りず信頼できるエンジニアを探している」
「Vue.js から React へリプレイスを検討している」
「フロントエンドの効率化をどうしたらいいか分からない」
「自分たちで手を付けてみたがいまいち上手くいかない」

フロントエンド開発に関わるお困りごとがあれば、まずは一度お気軽に Gaji-Labo にご相談ください。

オンラインでのヒアリングとフルリモートでのプロセス支援にも対応しています。

フロントエンドの相談をする!

投稿者 Chaki Hironori

webライターもやってるフロントエンドエンジニアです。Reactは自信があります。またデザイン畑の出身で、気持ちのいいアニメーションやインタラクティブな表現は丁寧に手掛けます。好きなものは中南米の遺跡で、スペイン語が少しできます。