Como aplico o filtro em todos os itens paginados e exibo apenas os itens filtrados?

ChuChu

Quando aplico filtros, funciona apenas na primeira página dos itens. À medida que carrego mais itens, o filtro desaparece e tenho que clicar em filtro novamente, o que obviamente não é bom. Desejo clicar em Filtrar apenas uma vez e ele retornará todos os itens que correspondem aos critérios.

No momento, a API em que estou trabalhando tem apenas pouco mais de 200 itens. Devo apenas fazer três chamadas de API paginadas para baixar todos os itens na API e juntá-los em uma matriz mestre e, em seguida, filtrar dessa matriz mestre local? Dessa forma, ele exibirá todos os itens filtrados na página.

Mas digamos que eu tenha uma API com um banco de dados muito maior com alguns milhares de pontos de dados, então não quero carregar tudo no array local. Eu gostaria de saber como filtrar todos os itens paginados de uma vez e exibir apenas os itens filtrados.

Este é meu código:

import React, {Component} from 'react';
import axios from 'axios';
import BookList from './BookList';
import LoadingButton from './LoadingButton';
import FilterButton from './FilterButton';

    const root_api = "...";
    const books_per_page = 15;

    class HomePage extends Component{
      constructor(props){
        super(props);
        this.state ={
        books:[],
        pageNum: 1,
        isLoading: false,
        isDataFetched: false,
        isListComplete: false,
        error:''};
    }
    //get 15 items at a time
    getBooks(){
      const requestUrl = `${root_api}books?page=${
        this.state.pageNum
      }&per_page=${book_per_page}`;  
      this.setState({
        isLoading: true
      });
      axios.get(requestUrl)
      .then(res=>{
            res.data.length > 0
              ? this.setState({
                  books: [...this.state.books, ...res.data],
                  isLoading: false,
                  isDataFetched: true,
                  pageNum: this.state.pageNum + 1
                })
              : this.setState({
                  isLoading: false,
                  isDataFetched: true,
                  isListComplete: true
                });
      })

      .catch(err => {
        console.log(err);
        this.setState({

          isLoading: false,
          isDataFetched: false,
          error: err.message
        });
      });

    }

    filterBooks(){
      let newList =[];
      let currentList = [];
      currentList = this.state.books;
      newList = currentList.filter(function(book){
        return book.pages > 1200; 
      });
      this.setState({books: newList});
    }

    render(){

       return(
         <div>
         <FilterButton 
             isLoading={this.state.isLoading}
             isListComplete={this.state.isListComplete}
             clickHandler={()=>this.filterBooks()}
              />
           {this.state.books.length > 0 &&(
             <BookList books={this.state.books} />)}
           <LoadingButton
              isLoading={this.state.isLoading}
              isListComplete={this.state.isListComplete}
              clickHandler={()=>this.getBooks()}
           />
           }
         </div>
       )

}}
James_F

Você não precisa criar uma matriz local mestre, apenas outra statevariável para controlar se o usuário deseja ou não que os livros sejam filtrados:

constructor(props){
    super(props);
    this.state ={
        books:[],
        pageNum: 1,
        isLoading: false,
        isDataFetched: false,
        isListComplete: false,
        error:'',
        filtered: false // this is the new variable
    };
}

Além de alterar algumas funções:

getBooks(){
    const requestUrl = `${root_api}books?page=${
        this.state.pageNum
    }&per_page=${book_per_page}`;  
    this.setState({
        isLoading: true
    });
    axios.get(requestUrl)
    .then(res=>{
        let newState = {
            isDataFetched: true,
            isLoading: false
        }
        if (res.data.length > 0) {
            newState.pageNum = this.state.pageNum + 1
            newState.books = [
            ...this.state.books, 
            ...res.data
            ]
        } else {
            newState.isListComplete = true
        }
        this.setState(newState);
    }).catch(err => {
        console.log(err);
        this.setState({
            isLoading: false,
            isDataFetched: false,
            error: err.message
        });
    });
}

filterBooks(){
    this.setState(prevState => ({
        filtered: !prevState.filtered
    }));
}

EDIT: E mude o método de renderização:

render() {
    let bookListView
    if (this.state.books.length > 0) {
        let bookArr = this.state.books
        if (this.state.filtered) {
            bookArr = bookArr.filter(item => item.pages > 1200)
        }
        bookListView = <BookList books={bookArr} />
    }

    return(
        <div>
            <FilterButton 
                isLoading={this.state.isLoading}
                isListComplete={this.state.isListComplete}
                clickHandler={()=>this.filterBooks()}
            />
            {bookListView}
            <LoadingButton
                isLoading={this.state.isLoading}
                isListComplete={this.state.isListComplete}
                clickHandler={()=>this.getBooks()}
            />
        </div>
    )
}

EDIT: Mudei a parte de filtragem para o rendermétodo, se o seu usuário quiser filtrar seus resultados.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Como aplico uma função a todos os itens em uma lista em um arquivo de texto ou csv com Python?

Filtre a matriz na matriz e obtenha apenas os itens filtrados

Como definir a margem apenas em todos os itens, exceto o primeiro e o último na embalagem do Flexbox

Como forçar o Scrapy a mostrar todos os itens em vez de apenas o último?

Como forçar o Scrapy a mostrar todos os itens em vez de apenas o último?

Como unir todos os itens em AngularJS

Como unir todos os itens em AngularJS

Como faço para iterar em uma grade wpf e selecionar apenas os itens marcados?

Dimensionar todos os itens em um RecyclerView de apenas TextViews?

como usar o filtro json_query para extrair todos os itens iguais a um valor

como usar o filtro json_query para extrair todos os itens iguais a um valor

Como adicionar todos os itens se não corresponder ao filtro?

Como mostrar todos os itens na tabela de dados Vuetify em vez de apenas 10 linhas?

SQLAlchemy exclui todos os itens e não apenas o primeiro

Como desmarcar apenas o botão `Selecionar tudo` nem todos os itens?

Como desmarcar apenas o botão `Selecionar tudo` nem todos os itens?

Cursor recuperando apenas um item, não todos os itens

O componente React FAQ expande todos os itens em vez de apenas um

Como randomizar todos os itens em uma matriz em python

Listview exibe o título e o endereço dos últimos itens, em todos os itens da lista

Selecione todos os itens em QListView e desmarque todos quando o diretório for alterado

Como obter todos os itens não possuídos em uma matriz de itens do jogador em JSON

Como faço para exibir meus itens em uma linha (usando php e bootstrap para exibir todos os itens de um banco de dados)

Como atualizar todos os itens em ArrayList devido ao deslocamento de arrastar e soltar da visualização de reciclagem

Como imprimir apenas os itens de escopo e política em Get-ExecutionPolicy?

Remova os itens duplicados em ArrayList usando apenas o loop for

Como deletar todos os itens da mesa em um Dynamodb

Como clicar em todos os itens com uma classe no jquery

Como remover todos os itens de ArrayList em kotlin

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  3. 3

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  4. 4

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  5. 5

    Gerenciar recurso shake de Windows Aero com barra de título personalizado

  6. 6

    Como obter dados API adequados para o aplicativo angular?

  7. 7

    UITextView não está exibindo texto longo

  8. 8

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  9. 9

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  10. 10

    Usando o plug-in Platform.js do Google

  11. 11

    Como posso modificar esse algoritmo de linha de visada para aceitar raios que passam pelos cantos?

  12. 12

    Dependência circular de diálogo personalizado

  13. 13

    Coloque uma caixa de texto HTML em uma imagem em uma posição fixa para site para desktop e celular

  14. 14

    iOS: como adicionar sombra projetada e sombra de traço no UIView?

  15. 15

    Como usar a caixa de diálogo de seleção de nomes com VBA para enviar e-mail para mais de um destinatário?

  16. 16

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  17. 17

    How to create dynamic navigation menu select from database using Codeigniter?

  18. 18

    Converter valores de linha SQL em colunas

  19. 19

    ChartJS, várias linhas no rótulo do gráfico de barras

  20. 20

    用@StyleableRes注释的getStyledAttributes。禁止警告

  21. 21

    não é possível adicionar dependência para com.google.android.gms.tasks.OnSuccessListener

quentelabel

Arquivo