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 にご相談ください。
オンラインでのヒアリングとフルリモートでのプロセス支援にも対応しています。
フロントエンドの相談をする!