React グリッド / テーブルのページネーション
表形式のテーブル UI は、多くの Web 製品で一般的に使用されています。表形式のテーブル UI を最初から作成するのは簡単ではありませんが、Ignite UI for React グリッドを使用すると、テーブル UI の作成が簡単になり、大量のローカル データまたはリモート データを React グリッドにバインドするのも簡単です。グリッドはデフォルトで仮想化されているため、大きなデータ セットを表示するためにテーブルのページネーションを含める必要はありません。これは主に、UI で複雑なデータを整理する最も効率的な方法のために使用されます。テーブルのページネーションを使用すると、データを設定された行数で表示できるため、ユーザーは実際にスクロールバーを必要とせずに、データをスクロールできます。テーブルのページネーション UI には通常、現在のページ、合計ページ、クリック可能な [前へ] と [次へ] の矢印/ボタンなどが含まれ、ユーザーは次のようにページをめくることができます:
行のページングは、IsPagerVisible
プロパティを設定することにより、Ignite UI for React データ テーブル / データ グリッド内で有効になります。さらに、pageSize
を設定することで、表示される行の最大数を制限できます。
React 行のページングの例
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import { IgrDataGridModule } from "@infragistics/igniteui-react-grids";
import { IgrDataGrid } from "@infragistics/igniteui-react-grids";
import { IgrImageColumn } from "@infragistics/igniteui-react-grids";
import { IgrTextColumn } from "@infragistics/igniteui-react-grids";
import { IgrNumericColumn } from "@infragistics/igniteui-react-grids";
import { IgrDateTimeColumn } from "@infragistics/igniteui-react-grids";
import { IgrColumnGroupDescription } from "@infragistics/igniteui-react-grids";
import { IgrGridColumnOptionsModule } from "@infragistics/igniteui-react-grids";
IgrDataGridModule.register();
IgrGridColumnOptionsModule.register();
export default class DataGridPager extends React.Component<any, any> {
public data: any[];
public grid: IgrDataGrid;
constructor(props: any) {
super(props);
this.state = { componentVisible: true }
this.initData();
}
public onGridRef = (grid: IgrDataGrid) => {
if (!grid) { return; }
const state = new IgrColumnGroupDescription();
state.field = "Status";
state.displayName = "Status";
this.grid = grid;
this.grid.groupDescriptions.add(state);
}
public render(): JSX.Element {
return (
<div className="container sample">
<IgrDataGrid
ref={this.onGridRef}
height="100%"
width="100%"
autoGenerateColumns="false"
isColumnOptionsEnabled="true"
isPagerVisible="true"
pageSize="20"
dataSource={this.data}>
<IgrTextColumn field="ProductID" headerText="ID" width="*>110" horizontalAlignment="center"/>
<IgrTextColumn field="ProductName" headerText="Product" width="*>120" />
<IgrImageColumn field="CountryFlag" headerText="Country" width="*>130"
contentOpacity="1" horizontalAlignment="center" paddingTop="5" paddingBottom="5"/>
<IgrNumericColumn field="ProductPrice" headerText="Price" width="*>110"
positivePrefix="$" showGroupingSeparator="true" minFractionDigits={2}/>
<IgrNumericColumn field="OrderItems" headerText="Orders" width="*>140"/>
<IgrNumericColumn field="OrderValue" headerText="Order Value" width="*>160"
positivePrefix="$" showGroupingSeparator="true" />
<IgrDateTimeColumn field="OrderDate" headerText="Order Date" width="*>150"
horizontalAlignment="right" dateTimeFormat="DateShort" />
<IgrNumericColumn field="Margin" headerText="Margin" width="*>140"
positiveSuffix="%" horizontalAlignment="center" />
<IgrNumericColumn field="Profit" headerText="Profit" width="*>140"
positivePrefix="$" showGroupingSeparator="true" />
<IgrTextColumn field="Status" headerText="Status" width="*>140"
horizontalAlignment="center" />
</IgrDataGrid>
</div>
);
}
public getRandomDate(): Date {
const today: Date = new Date();
const year: number = today.getFullYear();
const month: number = this.getRandomNumber(0, 8);
const day: number = this.getRandomNumber(10, 27);
return new Date(year, month, day);
}
public getRandomNumber(min: number, max: number): number {
return Math.round(min + Math.random() * (max - min));
}
public getRandomItem(array: any[]): any {
const index = Math.round(this.getRandomNumber(0, array.length - 1));
return array[index];
}
public getCountryFlag(country: string): string {
const flag = 'https://static.infragistics.com/xplatform/images/flags/' + country + '.png'
return flag;
}
public initData() {
const names: string[] = [
"Intel CPU", "AMD CPU",
"Intel Motherboard", "AMD Motherboard", "Nvidia Motherboard",
"Nvidia GPU", "Gigabyte GPU", "Asus GPU", "AMD GPU", "MSI GPU",
"Corsair Memory", "Patriot Memory", "Skill Memory",
"Samsung HDD", "WD HDD", "Seagate HDD", "Intel HDD", "Asus HDD",
"Samsung SSD", "WD SSD", "Seagate SSD", "Intel SSD", "Asus SSD",
"Samsung Monitor", "Asus Monitor", "LG Monitor", "HP Monitor" ];
const countries: string[] = ["USA", "UK", "France", "Canada", "Poland",
"Denmark", "Croatia", "Australia", "Seychelles",
"Sweden", "Germany", "Japan", "Ireland",
"Barbados", "Jamaica", "Cuba", "Spain",];
const status: string[] = [ "Packing", "Shipped", "Delivered"]
const sales: any[] = [];
for (let i = 0; i < 200; i++) {
const price = this.getRandomNumber(10000, 90000) / 100;
const items = this.getRandomNumber(4, 30);
const value = Math.round(price * items);
const margin = this.getRandomNumber(2, 5);
const profit = Math.round((price * margin / 100) * items);
const country = this.getRandomItem(countries);
sales.push({
Country: country,
CountryFlag: this.getCountryFlag(country),
Margin: margin,
OrderDate: this.getRandomDate(),
OrderItems: items,
OrderValue: value,
ProductID: 1001 + i,
ProductName: this.getRandomItem(names),
ProductPrice: price,
Profit: Math.round(profit),
Status: this.getRandomItem(status),
});
}
this.data = sales;
}
}
// rendering above class to the React DOM
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<DataGridPager/>);
tsx
このサンプルが気に入りましたか? 完全な Ignite UI for Reactツールキットにアクセスして、すばやく独自のアプリの作成を開始します。無料でダウンロードできます。
概要
UX の観点から、テーブルのページネーションには長所と短所があります。UX Matters の最近の記事による、テーブルのページネーションの良い面と悪い面の分類です:
テーブルのページネーションの利点:
- ユーザーの選択を制限します。
- クリック数は測定可能です。
テーブルのページネーションの欠点:
- ユーザーはまだスクロールする必要があります。
- ページャーの作業と動作はサイトごとに異なります。
- UI コントロールが多すぎると、混乱する可能性があります。
- ユーザーは、ページネーションが遅くて面倒だと考えています。
- ユーザーはページネーション コントロールに気付かない場合があります。
- ページの読み込みが遅い場合があります。
- アクションがページに適用されるのか、データ セット全体に適用されるのか、ユーザーは混乱します。
Ignite UI React グリッドを使用すると、開発者はページングを追加できますが、グリッドにはデフォルトで無限スクロールが組み込まれているため、グリッドにページャーを追加するのではなく、無限 (または仮想) スクロールをお勧めします。デフォルトのユーザー エクスペリエンスとして仮想化された無限スクロールを使用すると、次のことが可能になります:
- スクロール操作によってページングされるデータの量を制御しながら、最高のパフォーマンスを実現。
- すべてのコンテンツをスクロールするための自然なアプローチ。
- すべてのインタラクションはエンド ユーザーに明確です。
- モバイル UX での自然なインタラクションにマップします。
React グリッド/ページの同期
ユーザーがソートやグループ化などのグリッドを操作し、グリッドで React Pager を有効にした場合、次の関数を使用して、React ページネーション データが React テーブル表示と同期されるようにする必要があります。
- applySorts
- applyGroups
- applyFilters
API リファレンス