I'm trying to keep track of selected items by page.
- When I click next page I'm updating the "currentPage" state with "onChangePage" event of data table.
- Because "onChangeRowsPerPage" event triggers first before "onChangePage" event and reset selected items before page change, I always end up losing the previous page selected items.
Here is the codesandbox link: https://codesandbox.io/s/affectionate-forest-tx3309?file=/src/App.js
No matter what I tried, when I click the next page it triggers "onChangeRowsPerPage" first and removes all selected items. Any ideas on how can I solve this problem?
Thanks!
import { useEffect, useMemo, useState } from "react";
import axios from "axios";
import DataTable from "react-data-table-component";
import "./styles.css";
export default function App() {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(false);
const [totalRows, setTotalRows] = useState(0);
const [perPage, setPerPage] = useState(10);
const [currentPage, setCurrentPage] = useState(1);
const [selectedRows, setSelectedRows] = useState([]);
const fetchUsers = async (page) => {
setLoading(true);
const response = await axios.get(`https://reqres.in/api/users?page=${page}&per_page=${perPage}&delay=1`);
setData(response.data.data);
setTotalRows(response.data.total);
setLoading(false);
};
const handlePageChange = (page) => {
setCurrentPage(page);
fetchUsers(page);
};
const handlePerRowsChange = async (newPerPage, page) => {
setLoading(true);
const response = await axios.get(`https://reqres.in/api/users?page=${page}&per_page=${newPerPage}&delay=1`);
setData(response.data.data);
setPerPage(newPerPage);
setLoading(false);
};
const handleRowSelected = async (row) => {
console.log(row, currentPage);
// Check current page has selected items
const selectedPageRowIndex = selectedRows.findIndex((row) => row.page === currentPage);
// If there is no selected records for this page
if (selectedPageRowIndex === -1) {
const tmpRow = { ...row }; // Copy returned row object
tmpRow.page = currentPage; // Set page
setSelectedRows([...selectedRows, tmpRow]); // Update state
} else {
// If exist, update
console.log("Current page :", currentPage, " updating...");
const tmpSelectedPageRows = [...selectedRows]; // Copy state
tmpSelectedPageRows[selectedPageRowIndex].selectedRows = row.selectedRows; // Update selected rows
setSelectedRows(tmpSelectedPageRows); // Update state
}
};
useEffect(() => {
fetchUsers(1); // fetch page 1 of users
}, []); // eslint-disable-line react-hooks/exhaustive-deps
// Table Column Configuration
const columns = useMemo(() => [
{
name: "Avatar",
cell: (row) => (
<img height="30px" width="30px" alt={row.first_name} src={row.avatar} />
)
},
{
name: "First Name",
selector: (row) => row.first_name
},
{
name: "Last Name",
cell: (row) => row.last_name
},
{
name: "Email",
selector: (row) => row.email
}
]);
return (
<div className="App">
<h1>react-data-table-component</h1>
<p>with remote pagination + pre/selected rows</p>
{JSON.stringify(selectedRows, null, 2)}
<DataTable
title="Users"
columns={columns}
data={data}
progressPending={loading}
pagination
paginationServer
paginationTotalRows={totalRows}
onChangeRowsPerPage={handlePerRowsChange}
onChangePage={handlePageChange}
selectableRows
onSelectedRowsChange={handleRowSelected}
/>
</div>
);
}