目次
完成したテーブル
本記事のコンポーネントでは、以下の画像のテーブルが作成できます。
テーブルのコンポーネント作成
以下、「CustomTable
」という名前でコンポーネントを用意します。
import React, { useEffect } from "react"; const CustomTable = ({ header = [], body = [], pageLen = 5 }: Props) => { const [bodyData, setBodyData] = React.useState(body); // 画面描画データ const [pagerList, setPagerList] = React.useState<number[]>([]); // ページ表示情報 const [pageNum, setPageNum] = React.useState(1); // ページ番号 // =====ページャー===== const changePage = (num: number) => { setPageNum(num); pageChangeList(num); }; const pageChangeList = (num: number) => { const pageMax = Math.ceil(bodyData.length / pageLen); let pager = []; if (pageMax > 5) { if (num < 3) { for (let r = 1; r <= 5; r++) { pager.push(r); } } else if (num > pageMax - 2) { const lowNum = pageMax - 5; for (let r = lowNum; r <= pageMax; r++) { pager.push(r); } } else { const lowNum = num - 2; const heiNum = num + 2; for (let r = lowNum; r <= heiNum; r++) { pager.push(r); } } } else { for (let r = 1; r <= pageMax; r++) { pager.push(r); } } setPagerList(pager); }; // =====ソート===== const [columnNo, setColumnNo] = React.useState(-1); // 前回クリックされた列番号 // 配列のソート const arraySortAct = (a: any, b: any) => { if (!isNaN(a) && !isNaN(b)) { return a - b; } else { if (a > b) { return -1; } else { return 1; } } }; // ソートの処理 const sortAct = (e: any) => { var target = e.srcElement || e.target; const nowClm = target.cellIndex; const targett = bodyData.concat(); if (columnNo === nowClm) { // 昇順 targett.sort((a, b) => arraySortAct(a[nowClm], b[nowClm])); setBodyData(targett); setColumnNo(-1); } else { // 降順 targett.sort((a, b) => arraySortAct(b[nowClm], a[nowClm])); setBodyData(targett); setColumnNo(nowClm); } }; useEffect(() => { const pageMax = Math.ceil(bodyData.length / pageLen); let pager = []; if (pageMax > 5) { for (let r = 1; r <= 5; r++) { pager.push(r); } } else { for (let r = 1; r <= pageMax; r++) { pager.push(r); } } setPagerList(pager); }, []); return ( <div> <table id="sort_table"> <tr> {header.map((tgt) => ( <th onClick={sortAct}>{tgt}</th> ))} </tr> {bodyData.map((tgt, index) => { const minPage = (pageNum - 1) * pageLen; const maxPage = minPage + pageLen; if (index >= minPage && index < maxPage) { return ( <tr> {tgt.map((data) => ( <td onClick={() => { console.log("========HELLO"); console.log(`行数:${index}`); console.log(`行データ:${tgt}`); }} > {data} </td> ))} </tr> ); } else { return <></>; } })} </table> <button onClick={() => { if (pageNum > 1) { changePage(pageNum - 1); } }} > 前へ </button> {pagerList.map((val) => ( <button onClick={() => changePage(val)}>{val}</button> ))} <button onClick={() => { const pageMax = Math.ceil(bodyData.length / pageLen); if (pageNum < pageMax) { changePage(pageNum + 1); } }} > 次へ </button> </div> ); }; type Props = { header?: string[]; // テーブルヘッダー body?: Array<string[]>; // テーブル表示データ pageLen?: number; // 1ページの上限件数 }; export default CustomTable;
テーブルコンポーネントを使用
以下の様に「PageData
」というページにコンポーネントを呼び出して使用する事で、カスタムテーブルが表示されます。
import CustomTable from "./CustomTable"; const PageData = () => { return ( <div> <CustomTable header={["No", "あああ", "いいい", "ううう"]} body={[ ["1", "あasds", "か", "123"], ["2", "あi,1", "か", "123"], ["3", "あ3,u", "か", "123"], ["4", "あasd", "か", "123"], ["5", "あnt1", "か", "123"], ["6", "あdd3", "か", "123"], ["7", "あcasc", "か", "123"], ["8", "あs1", "か", "123"], ["9", "あ ad3", "か", "123"], ["10", "あas", "か", "123"], ["11", "あdht1", "か", "123"], ["12", "あi,3", "か", "123"], ["1", "あasds", "か", "123"], ["2", "あi,1", "か", "123"], ["3", "あ3,u", "か", "123"], ["4", "あasd", "か", "123"], ["5", "あnt1", "か", "123"], ["6", "あdd3", "か", "123"], ["7", "あcasc", "か", "123"], ["8", "あs1", "か", "123"], ["9", "あ ad3", "か", "123"], ["10", "あas", "か", "123"], ["11", "あdht1", "か", "123"], ["12", "あi,3", "か", "123"], ["6", "あdd3", "か", "123"], ["7", "あcasc", "か", "123"], ["8", "あs1", "か", "123"], ["9", "あ ad3", "か", "123"], ["10", "あas", "か", "123"], ["11", "あdht1", "か", "123"], ["12", "あi,3", "か", "123"], ]} /> </div> ); }; export default PageData;
ソートの方法
完成したテーブルのヘッダーをクリックすることで、ソートが実行されます。
1度クリックすると、「降順」
もう一度同じヘッダーをクリックすると、「昇順」になります。
フィルターの方法
テーブルの下の数字のボタンが、ページ数になります。
ボタンを押下することで、該当のページに切り替わります。
「前へ」ボタンは、1つ前のページへ切り替わります。
※現在のページが1ページ目だと動作しません。
「次へ」ボタンは、1つ次のページへ切り替わります。
※現在のページが最後のページだと動作しません。