#reactjs #pagination
Вопрос:
После запуска поиска отображаются результаты, в данном случае 5 рецептов. Когда я нажимаю «Далее», чтобы отобразить следующие 5, исходные результаты остаются на странице, а новые отображаются под ними. Хотелось бы, чтобы предыдущие были удалены и заменены только следующими результатами. Я подумываю об удалении первого ребенка, но не знаю, как это сделать в React. Ниже приведен код, который у меня есть в настоящее время.
import './App.css';
import React, {useState, useEffect, useRef} from "react";
import Recipe from './components/recipes/Recipe.jsx';
import { Row, Col } from 'react-bootstrap';
function App() {
const [recipes, setRecipes] = useState([]);
const [search, setSearch]= useState('');
const [query, setQuery] = useState('');
const [pagination, setPagination] = useState(0);
const prevSearchIdRef = useRef();
useEffect(()=>{
prevSearchIdRef.current = query;
});
const prevSearch = prevSearchIdRef.current
let currentPagination = pagination;
const fetchRecipes = async () => {
if(prevSearch !== query){
currentPagination = 0;
setPagination(0);
}
const response = await fetch(`https://api.edamam.com/search?q=${query}amp;app_id=8f7859bcamp;app_key=f7c43e28aea5bc242e86fe0f089dda3camp;from${currentPagination}amp;to=${pagination 5}`)
const data = await response.json();
setRecipes(data.hits);
}
const updateSearch = e => {
setSearch(e.target.value);
};
const getSearch = e => {
e.preventDefault();
setQuery(search);
setSearch('');
}
const prevClick = () => {
if(pagination === 0){
return;
}
setPagination(pagination-5);
}
const nextClick = () => {
setPagination(pagination 5);
}
useEffect(() => {
fetchRecipes();
}, [query, pagination])
return (
<div className="App">
<div className="Nav">NAV BAR COMPONENT HERE</div>
<div className="search-container">
<form onSubmit={getSearch} className="search-form">
<input className="search-bar" type="text" placeholder="Search recipes" value={search} onChange={updateSearch} />
<button className="search-button" type="submit">Search</button>
</form>
</div>
<br/>
<h2>Your search results for "{query}"</h2>
<div className="recipeList">
{recipes?.length ? (
<Row>
{recipes !== [] amp;amp; recipes.map((recipe, index) => <Col><Recipe recipe={recipe.recipe} key={index} /></Col>)}
</Row>
):(
<div>No recipes found. Please try another search.</div>
)
}
</div>
<div>
<button onClick={prevClick}>Prev</button>
<button onClick={nextClick}>Next</button>
</div>
</div>
);
}
export default App;
Комментарии:
1. вы не должны зацикливаться на рецептах непосредственно при рендеринге, вместо этого создайте массив, который является окном разбиения на страницы, а затем повторите его для рендеринга
2. Будучи довольно новичком в реагировании, для меня это имеет смысл. Как бы я поступил, если бы сделал то, что вы рекомендуете?
3. вам нужно определить количество строк, которые должны отображаться на каждой странице.
const rows = 20
. с помощью этого вы можете сделать что-то вродеconst paginatedRecipes = recipes.slice(pagination, rows)
, а затем просто использовать этот массив при переходе к визуализации. Я бы рекомендовал вамpagination
указать номер страницы, а не смещение . смещение-это простое вычисление строк страницы*. Но таким образом, у вас есть страница = 1, строки = 20, смещение = 1 * 20 === 20.4. ОК. для меня это имеет гораздо больше смысла. Я попробую это сделать. Буду ли я вызывать paginatedRecipes в возврате или где-то еще?
5. что ты имеешь в виду
call
? вы создаетеpaginatedRecipes
массив перед возвратом. Внутри возврата вы должны ссылатьсяpaginatedRecipes
вместоrecipes
… Надеюсь, это поможет прояснить