iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
Modern Web

關於寫react 那二三事系列 第 13

Day13 PrimeReact 的tables(3)

  • 分享至 

  • xImage
  •  

忙碌一整天,專案進程超頭痛...
不知道是被SA卡還是後端卡,總之...茫然無措

今天來說說table的paginator
Paginator其實本身也可以獨立呼喚出來,
但這邊用的是Datatable的paginator 的api
先來上基礎用法

<DataTable
    value={tabledata}
    paginator
    rows={2}
    paginatorTemplate="RowsPerPageDropdown CurrentPageReport  FirstPageLink PrevPageLink JumpToPageInput NextPageLink LastPageLink"
    currentPageReportTemplate="{currentPage} / {totalPages} 頁 共 {totalRecords} 筆"
    rowsPerPageOptions={[2, 4]}
>
    <Column field="code" header="產品編號"></Column>
    <Column field="name" header="產品名稱"></Column>
    <Column field="category" header="產品類別"></Column>
    <Column field="quantity" header="數量"></Column>
</DataTable>

其實光呼叫 paginator 跟設定 rows(每頁顯示幾筆資料) 其實就可以有簡單 paginator,
而這邊是我私心喜歡添加的樣式
rowsPerPageOptions 這是下拉選單決定每筆要顯示多少資料的選項設定
currentPageReportTemplate 客製顯示當前資料顯示的狀況
paginatorTemplate 客製調整paginator順序跟樣式
根據官方文件有以下樣式
FirstPageLink //第一頁按鈕
PrevPageLink //上一頁按鈕
PageLinks //設定跳頁連接 就是會顯示 1 2 3 4...的按鈕的部分
JumpToPageInput//輸入直接跳到第幾頁
NextPageLink //下一頁按鈕
LastPageLink //最後一頁按鈕
RowsPerPageDropdown //下拉選單選擇一頁顯示幾筆
CurrentPageReport //當前資料顯示的狀況

那麼說完基礎用法,來點花式用法
因為使用TS所以要借一點paginator的type用用

import { PaginatorRowsPerPageDropdownOptions } from 'primereact/paginator'

再來宣告一下當前頁數的state

const [perpage, setPerpage] = useState<number>(2);

再來開始魔改
我想要每頁幾筆的下拉選單魔改成input

<DataTable
    value={tabledata}
    paginator
    rows={perpage || 1}
    currentPageReportTemplate="{currentPage} / {totalPages} 頁 共 {totalRecords} 筆"
    paginatorTemplate={{
        layout: "RowsPerPageDropdown CurrentPageReport  FirstPageLink PrevPageLink JumpToPageInput NextPageLink LastPageLink",
        RowsPerPageDropdown: (option: PaginatorRowsPerPageDropdownOptions) => (
            <div>
                <InputText
                    style={{ width: '40px' }}
                    value={perpage.toString()}
                    onChange={(e: any) => { 
                    if(!e.target.value||Number(e.target.value)>0){
                        setPerpage(e.target.value);}
                    }}
                    onKeyDown={(e: any) => {
                        if (e.keyCode == 13) {
                            let value: any = { 
                                label: e.target.value, 
                                value: Number(e.target.value) 
                             };
                            option.onChange(value);
                        }}
                    }/>
            </div>
        )
    }}
>
    <Column field="code" header="產品編號"></Column>
    <Column field="name" header="產品名稱"></Column>
    <Column field="category" header="產品類別"></Column>
    <Column field="quantity" header="數量"></Column>
</DataTable>

其實最困難的點是option.onChange
我打onChange={option.onChange}嗯...報錯...
怎麼辦呢...
只好假扮...select option...?
還真的可以...

再來我想enter時,再切換顯示頁數
所以用了onkeyDown
再來在切換時在刪除時會顯示 NaN/Infinity
所以特別在rows 修改rows={perpage || 1}

好了~~今天就到這先上全code

import React, { useEffect, useState } from 'react';
import { DataTable } from 'primereact/datatable';
import { Column } from 'primereact/column';
import { ProductService } from '../service/table';
import { Product } from '../interfaces/table';
import { InputText } from 'primereact/inputtext';
import { PaginatorRowsPerPageDropdownOptions } from 'primereact/paginator';
const Tables3Compnent: React.FC = () => {
  let service = new ProductService();
  const [tabledata, setTabledata] = useState<Product[]>();
  const [perpage, setPerpage] = useState<number>(2);
  useEffect(() => {
    service.getProductsMini().then(data => setTabledata(data));
  }, []);
  return (
    <div>
      <div className="mt-3">
        <DataTable
          value={tabledata}
          paginator
          rows={2}
          paginatorTemplate="RowsPerPageDropdown CurrentPageReport FirstPageLink PrevPageLink JumpToPageInput NextPageLink LastPageLink"
          currentPageReportTemplate="{currentPage} / {totalPages} 頁 共 {totalRecords} 筆"
          rowsPerPageOptions={[2, 4]}
        >
          <Column field="code" header="產品編號"></Column>
          <Column field="name" header="產品名稱"></Column>
          <Column field="category" header="產品類別"></Column>
          <Column field="quantity" header="數量"></Column>
        </DataTable>
      </div>
      <div className="mt-3">
        <DataTable
          value={tabledata}
          paginator
          rows={perpage || 1}
          currentPageReportTemplate="{currentPage} / {totalPages} 頁 共 {totalRecords} 筆"
          paginatorTemplate={{
            layout: "RowsPerPageDropdown CurrentPageReport  FirstPageLink PrevPageLink JumpToPageInput NextPageLink LastPageLink",
            RowsPerPageDropdown: (option: PaginatorRowsPerPageDropdownOptions) => (
              <div>
                <InputText
                  style={{ width: '40px' }}
                  value={perpage.toString()}
                  onChange={(e: any) => { if (!e.target.value || Number(e.target.value) > 0) setPerpage(e.target.value); }}
                  onKeyDown={(e: any) => {
                    if (e.keyCode == 13) {
                      let value: any = { label: e.target.value, value: Number(e.target.value) };
                      option.onChange(value);
                    }
                  }
                  } />
              </div>
            )
          }}
        >
          <Column field="code" header="產品編號"></Column>
          <Column field="name" header="產品名稱"></Column>
          <Column field="category" header="產品類別"></Column>
          <Column field="quantity" header="數量"></Column>
        </DataTable>
      </div>
    </div>
  );
}
export default Tables3Compnent;

結束~~明天見!


上一篇
Day12 PrimeReact 的tables(2)
下一篇
Day14 PrimeReact 的tables(4)
系列文
關於寫react 那二三事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言