React Grid のリモート データ操作

    デフォルトで、IgrGrid は独自のロジックを使用してデータ操作を実行します。

    これらのタスクをリモートで実行し、IgrGrid で公開される特定の入力とイベントを使用して IgrGrid に結果のデータを供給できます。

    無限スクロール

    エンドポイントからデータを分割して取得するシナリオの一般的なデザインは、無限スクロールです。データ グリッドの場合、エンドユーザーが一番下までスクロールすることによってトリガーされたロードデータが連続的に増加します。次の段落では、使用可能な API を使用して IgrGrid で無限スクロールを簡単に実現する方法について説明します。

    無限スクロールを実装するには、データを分割してフェッチする必要があります。すでにフェッチされたデータはローカルに保存し、チャンクの長さおよび数を決定する必要があります。また、グリッドで最後に表示されるデータ行インデックスを追跡する必要があります。このように、StartIndexChunkSize プロパティを使用して、ユーザーが上にスクロールして既にフェッチしたデータを表示するか、下にスクロールしてエンドポイントからさらにデータをフェッチする必要があるかを決定できます。

    最初に、データの最初のチャンクをフェッチします。totalItemCount プロパティはグリッドがスクロールバーのサイズを正しく設定できるようにするために重要です。

    さらに、DataPreLoad 出力にサブスクライブする必要があります。これにより、グリッドが現在ロードされているものではなく、異なるチャンクを表示しようとするときに必要なデータを提供できます。イベント ハンドラーで、ローカルに既にキャッシュされている新しいデータをフェッチするか、データを返すかを決定する必要があります。

    無限スクロールのデモ

    EXAMPLE
    DATA
    TSX
    CSS

    このサンプルが気に入りましたか? 完全な Ignite UI for Reactツールキットにアクセスして、すばやく独自のアプリの作成を開始します。無料でダウンロードできます。

    リモート ページング

    ページング機能はリモート データで処理することもできます。はじめにデータ フェッチングを行うサービスを宣言します。ページ カウントを計算するためすべてのデータ項目のカウントをが必要なため、ロジックをサービスに追加する必要があります。

    const CUSTOMERS_URL = `https://data-northwind.indigo.design/Customers/GetCustomersWithPage`;
    
    export class RemoteService {
    
        public static getDataWithPaging(pageIndex?: number, pageSize?: number) {
            return fetch(this.buildUrl(CUSTOMERS_URL, pageIndex, pageSize))
            .then((result) => result.json());
        }
    
        private static buildUrl(baseUrl: string, pageIndex?: number, pageSize?: number) {
            let qS = "";
            if (baseUrl) {
                    qS += `${baseUrl}`;
            }
    
            // Add pageIndex and size to the query string if they are defined
            if (pageIndex !== undefined) {
                qS += `?pageIndex=${pageIndex}`;
                if (pageSize !== undefined) {
                    qS += `&size=${pageSize}`;
                }
            } else if (pageSize !== undefined) {
                qS += `?perPage=${pageSize}`;
            }
    
            return `${qS}`;
        }
    }
    tsx

    サービスを宣言した後にコンポーネントを作成する必要があり、IgrGrid コンストラクションとデータ サブスクリプションを処理します。

         <IgrGrid
              ref={grid}
              data={data}
              pagingMode={GridPagingMode.Remote}
              primaryKey="customerId"
              height="600px"
              isLoading={isLoading}
            >
            <IgrPaginator 
              perPage={perPage}
              ref={paginator}
              pageChange={onPageNumberChange}
              perPageChange={onPageSizeChange}>
            </IgrPaginator>
              <IgrColumn field="customerId" hidden={true}></IgrColumn>
              <IgrColumn field="companyName" header="Company Name"></IgrColumn>
              <IgrColumn field="contactName" header="Contact Name"></IgrColumn>
              <IgrColumn field="contactTitle" header="Contact Title"></IgrColumn>
              <IgrColumn field="address.country" header="Country"></IgrColumn>
              <IgrColumn field="address.phone" header="Phone"></IgrColumn>
            </IgrGrid>
    tsx

    次に状態を設定します。

      const grid = useRef<IgrGrid>(null);
      const paginator = useRef<IgrPaginator>(null);
      const [data, setData] = useState([]);
      const [page, setPage] = useState(0);
      const [perPage, setPerPage] = useState(15);
      const [isLoading, setIsLoading] = useState(true);
    
      useEffect(() => {
        loadGridData(page, perPage);
      }, [page, perPage]);
    tsx

    最後に、データを読み込むためのメソッドを設定します。

      function loadGridData(pageIndex?: number, pageSize?: number) {
        // Set loading state
        setIsLoading(true);
    
        // Fetch data
        RemoteService.getDataWithPaging(pageIndex, pageSize)
          .then((response: CustomersWithPageResponseModel) => {
            setData(response.items);
            // Stop loading when data is retrieved
            setIsLoading(false);
            paginator.current.totalRecords = response.totalRecordsCount;
          })
          .catch((error) => {
            console.error(error.message);
            setData([]);
            // Stop loading even if error occurs. Prevents endless loading
            setIsLoading(false);
          })
      }
    tsx

    詳細については、以下の完全なサンプルをご覧ください。

    グリッド リモート ページングのデモ

    EXAMPLE
    CustomersWithPageResponseModel.ts
    RemotePagingService.ts
    TSX
    CSS

    最後に、RowIslands の動作を設定します。

    Ignite UI for React | CTA Banner

    既知の問題と制限

    • グリッドに PrimaryKey が設定されておらず、リモート データ シナリオが有効になっている場合 (ページング、ソート、フィルタリング、スクロール時に、グリッドに表示されるデータを取得するためのリモート サーバーへのリクエストがトリガーされる場合)、データ要求が完了すると、行は次の状態を失います:
    • 行の選択
    • 行の展開/縮小
    • 行の編集
    • 行のピン固定

    API リファレンス

    その他のリソース

    コミュニティに参加して新しいアイデアをご提案ください。