Удалите первого дочернего элемента и замените новым дочерним элементом при разбиении на страницы reactjs

#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 … Надеюсь, это поможет прояснить