good morning, how are you? I'm having a problem with pagination, when I click to change the page it appears the page results and goes back to the first one right away, would you know how to help me?
For example, if I click on page 2, its results appear but it immediately goes back to page 1, I don't know if it can be route or something like that
import Table from "react-bootstrap/Table";
import axios from "axios";
import { Link } from "react-router-dom";
import { useState, useEffect } from "react";
import Form from "react-bootstrap/Form";
import Search from "../components/Search";
import Pagination from "../components/Pagination";
const endpoint = "http://localhost:8000/api";
const AccountShow = () => {
const [accounts, setAccounts] = useState([]);
const keys = [
"nome",
"razaoSocial",
"statusConta",
"setor",
"segmentoAtuacao",
"naturezaJuridica",
];
const [query, setQuery] = useState("");
const [currentPage, setCurrentPage] = useState(1);
const [accountsPerPage] = useState(5);
const indexOfLastAccount = currentPage * accountsPerPage;
const indexOFirstAccount = indexOfLastAccount - accountsPerPage;
const currentAccounts = accounts.slice(
indexOFirstAccount,
indexOfLastAccount
);
const paginate = (pageNumber) => setCurrentPage(pageNumber);
useEffect(() => {
getAllAccounts();
}, []);
const getAllAccounts = async () => {
const response = await axios.get(`${endpoint}/accounts`);
setAccounts(response.data);
};
const deleteAccount = async (id) => {
await axios.delete(`${endpoint}/account/${id}`);
getAllAccounts();
};
return (
<div className="d-grid gap-2">
<div className="row">
<div className="col-8">
<Form className="d-flex m-1">
<Form.Control
type="text"
placeholder="Filtro"
className="me-2"
aria-label="Search"
onChange={(e) => setQuery(e.target.value)}
/>
</Form>
</div>
<div className="col-4">
<Link
to="/account/create"
className="col-11 btn btn-outline-primary m-1 "
>
Create
</Link>
</div>
</div>
<Table hover className="">
<thead>
<tr>
<th scope="col">#</th>
<th className="col-2" scope="col">
Nome
</th>
<th className="col-2" scope="col">
Razão Social
</th>
<th scope="col">Status da Conta</th>
<th scope="col">Setor</th>
<th scope="col">Segmento Atuacao</th>
<th scope="col">Natureza Juridica</th>
<th scope="col">Capital</th>
<th scope="col">Funcionarios</th>
<th className="text-center" scope="col">
Ações
</th>
</tr>
</thead>
<tbody>
{Search(currentAccounts, query, keys).map((account) => (
<tr key={account.id}>
<th>{account.id}</th>
<td>{account.nome}</td>
<td>{account.razaoSocial}</td>
<td>{account.statusConta}</td>
<td>{account.setor}</td>
<td>{account.segmentoAtuacao}</td>
<td>{account.naturezaJuridica}</td>
<td>{account.capital}</td>
<td>{account.funcionarios}</td>
<td className="text-center">
<Link
to={`edit/${account.id}`}
className="btn btn-outline-warning"
>
Editar
</Link>
<button
onClick={() => deleteAccount(account.id)}
className="btn btn-outline-danger m-1"
>
Deletar
</button>
</td>
</tr>
))}
</tbody>
</Table>
<Pagination
dadosPorPagina={accountsPerPage}
totalDados={accounts.length}
paginate={paginate}
/>
</div>
);
};
export default AccountShow;
I will leave my paginator component next
import React from "react";
const Pagination = ({ dadosPorPagina, totalDados, paginate }) => {
const pageNumbers = [];
for (
let index = 1;
index <= Math.ceil(totalDados / dadosPorPagina);
index
) {
pageNumbers.push(index);
}
return (
<div>
<nav>
<ul className="pagination">
{pageNumbers.map((number) => (
<li key={number} className="page-item">
<a onClick={() => paginate(number)} href="" className="page-link">
{number}
</a>
</li>
))}
</ul>
</nav>
</div>
);
};
export default Pagination;
CodePudding user response:
since you are mapping this empty const pageNumbers = [] array, and if you click a tag, are you expecting something to receive in your paginate function.
CodePudding user response:
In your paginator, your index is being reset back to 1 in your for loop every time it loops through. Try moving the following outside your loop.
import React from "react";
const Pagination = ({ dadosPorPagina, totalDados, paginate }) => {
const pageNumbers = [];
let index = 1;
for (
index <= Math.ceil(totalDados / dadosPorPagina);
index
) {
pageNumbers.push(index);
}
return (
<div>
<nav>
<ul className="pagination">
{pageNumbers.map((number) => (
<li key={number} className="page-item">
<a onClick={() => paginate(number)} href="" className="page-link">
{number}
</a>
</li>
))}
</ul>
</nav>
</div>
);
};
export default Pagination;
CodePudding user response:
Just add one more parameter to pagination component for active page to set current page. You can pass as below
AccontShow component
<Pagination
dadosPorPagina={accountsPerPage}
totalDados={accounts.length}
paginate={paginate}
activePage={currentPage}
/>
Now in Pagination component take activePage parameter
const Pagination = ({ dadosPorPagina, totalDados, paginate activePage }) => {//code}
Now in pageNumbers map check for current page and add css class and css styling to that 'li' item to display as active
<ul className="pagination">
{pageNumbers.map((number) => (
<li key={number} className=`page-item ${number == activePage ? 'page-item-active': ''}`>
<a onClick={() => paginate(number)} href="" className="page-link">
{number}
</a>
</li>
))}
</ul>
Here I've added 'page-item-active' class conditionally, you can change it and dd styling to that class
Thanks and voteup if useful :)