Server-side sort, page & filter

Enable sortServer, paginationServer, and pass controlled filterValues. Refetch from a single effect that depends on every state knob. The demo below simulates a 400ms API delay — filter by name or department to see it in action.

There are no records to display
import { useEffect, useState } from 'react';
import DataTable, { type FilterState, SortOrder, type TableColumn } from 'react-data-table-component';

export default function App() {
  const [rows, setRows]       = useState<Employee[]>([]);
  const [total, setTotal]     = useState(0);
  const [page, setPage]       = useState(1);
  const [perPage, setPerPage] = useState(20);
  const [sort, setSort]       = useState<{ id?: string; dir: SortOrder }>({ dir: SortOrder.ASC });
  const [filters, setFilters] = useState<Record<string, FilterState>>({});
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    let cancelled = false;
    setLoading(true);
    fetchEmployees({ page, perPage, sort, filters }).then(res => {
      if (cancelled) return;
      setRows(res.rows);
      setTotal(res.total);
      setLoading(false);
    });
    return () => { cancelled = true; };
  }, [page, perPage, sort, filters]);

  const columns: TableColumn<Employee>[] = [
    { id: 'name',   name: 'Name',   selector: r => r.name,   sortable: true, filterable: true },
    { id: 'salary', name: 'Salary', selector: r => r.salary, sortable: true, filterable: true,
      filterType: 'number', right: true },
  ];

  return (
    <DataTable
      columns={columns}
      data={rows}
      progressPending={loading}

      pagination
      paginationServer
      paginationTotalRows={total}
      onChangePage={setPage}
      onChangeRowsPerPage={setPerPage}

      sortServer
      onSort={(col, dir) => setSort({ id: col.id as string, dir })}

      filterValues={filters}
      onFilterChange={(columnId, next) =>
        setFilters(prev => ({ ...prev, [columnId]: next }))
      }
    />
  );
}