I am attempting to add sorting functionality to a DataTable using primereact 8.6.1
.
As written in the official documentation (https://www.primefaces.org/primereact/datatable) "In lazy mode, pagination, sorting and filtering must be used in controlled mode" and "In controlled mode, sortField, sortOrder and onSort properties need to be defined to control the sorting state". The following example is provided:
const onSort = (e) => {
setSortField(e.sortField);
setSortOrder(e.sortOrder);
}
<DataTable value={products} sortField={sortField} sortOrder={sortOrder} onSort={onSort}>
<Column field="code" header="Code" sortable></Column>
<Column field="name" header="Name" sortable></Column>
<Column field="category" header="Category" sortable></Column>
<Column field="quantity" header="Quantity" sortable></Column>
</DataTable>
However, in my case, only the sorting which takes place by default based on the initial values of sortField and sortOrder, works. Clicking on any of the sortable columns triggers the "onSort" function, but doesn't re-order the data. Below are excerpts of my code:
const [sortField, setSortField] = useState<string>('lastModified');
const [sortOrder, setSortOrder] = useState<any>(-1);
const handleSorting = (e: any) => {
setSortField(e.sortField);
setSortOrder(e.sortOrder);
};
<DataTable value={(data?.items || []) as NlSearchResult[]} paginator paginatorRight
paginatorTemplate={paginatorTemplate}
first={paginatorFirst} rows={rowsPerPage} lazy totalRecords={data?.total || 0}
onPage={handlePageChange} onSort={handleSorting} sortField={sortField}
sortOrder={sortOrder}>
<Column header="Last Updated" sortable field="lastModified" body={lastUpdatedDateTemplate}/>
<Column header="Created By" sortable field="createdBy"/>
<Column header="Newsletter" body={imageTemplate}/>
<Column header="Name" sortable field="name" body={nameAndSubjectTemplate}/>
<Column header="Scheduled" body={scheduledTemplate}/>
<Column header="Campaign/Company" body={campaignCompanyTemplate}/>
<Column header="Newsletter Type" body={nlTypeTemplate}/>
<Column header={filterHeader}/>
</DataTable>
I'm not sure what I'm missing or doing wrong and any help would be immensely appreciated.