【问题标题】:How to re-fetch data after doing a filter in React.js with useContext使用useContext在React.js中进行过滤后如何重新获取数据
【发布时间】:2021-05-09 09:56:25
【问题描述】:

我在 React.js 中得到了这个组件,当我点击一个按钮时,它会进行不同类型的过滤,这是我的代码:

    import React, { useContext } from 'react';
    import { ModelsContext } from "../context/ModelsContext";
    
    const FilterNav = () => {

        const { modelos, guardarModelo } = useContext(ModelsContext);
        
        const filterSegment = e => {
    
            const segment = modelos.filter(modelo => modelo.segment === e.target.name);
            
            guardarModelo(segment);

        }

       
        return (
            <nav className="filter-container"> 
                <div className="container">
                    <h3 className="filter-element-title">Filtrar por</h3>
                    <button type="button" className="filter-element">Todos</button>
                    <button type="button" className="filter-element" name="Autos" onClick={filterSegment}>Autos</button>
                    <button type="button" className="filter-element" name="Pickups y Comerciales" onClick={filterSegment}>Pickups y Comerciales</button>
                    <button type="button" className="filter-element" name="SUVs y Crossovers" onClick={filterSegment}>SUVs y Crossovers</button>
                </div>
                <p className="filter-element-last">Ordenar por &#x5e;</p>
            </nav>
         );
    }
     
    export default FilterNav;

我从 ModelsContext.jsx 中的 useContext 的 api 中得到的信息,这是我目前写的:

import React, { createContext, useState, useEffect } from 'react';

export const ModelsContext = createContext();

const ModelsProvider = (props) => {

        //State de modelos
        const [modelos, guardarModelo] = useState([]);

        const consultarAPI = async () => {
        const api = await fetch("https://challenge.agenciaego.tech/models");
        const modelos = await api.json();
        guardarModelo(modelos);
        }

        //Cargar un modelo
        useEffect(() => {
            consultarAPI()
        }, []);

    return (
        <ModelsContext.Provider
            value={{
                modelos,
                guardarModelo
            }}
        >
            {props.children}
        </ModelsContext.Provider>
    )
}

export default ModelsProvider;

我的问题是,当我通过 filterSegment 函数过滤 API 模型时,我不知道如何从 API 重新获取数据,因为当我对 filterSegment 函数进行新调用时,它会过滤过滤后的数据。我尝试添加一个布尔状态,并且我正在考虑使用所有数据添加另一个状态,但我真的迷失了实现它,我对 React.js 还是很陌生。 我已经通过堆栈溢出和谷歌搜索,我无法得到答案,如果你能给我一个线索或某种指导,将不胜感激。

非常感谢!

【问题讨论】:

    标签: javascript reactjs api filter fetch


    【解决方案1】:

    您可以在ModelsContext中添加另一个状态:

    //State de modelos
    const [modelos, guardarModelo] = useState([]);
    const [allModelos, guardarAllModelo] = useState([]);
    
    const consultarAPI = async () => {
        const api = await fetch("https://challenge.agenciaego.tech/models");
        const modelos = await api.json();
        guardarAllModelo(modelos);
        
        //uncomment if you want to have initial value for modelos state
        //guardarModelo(modelos);
    }
    
    // some codes ...
    
    <ModelsContext.Provider
            value={{
                allModelos,
                modelos,
                guardarModelo
            }}
     >
            {props.children}
     </ModelsContext.Provider>
    

    然后在FilterNav组件中:

        const {allModelos, modelos, guardarModelo } = useContext(ModelsContext);
        
        const filterSegment = e => {
    
            const segment = allModelos.filter(modelo => modelo.segment === e.target.name);
            
            guardarModelo(segment);
    
        }
    

    但这并不会真正从您的 Web api 重新获取数据。它只是重新过滤第一个获取的数据。如果你想从 web api 重新获取数据,你可以在你的上下文提供者中添加 consultarAPI 然后在某个地方调用它。

    【讨论】:

      【解决方案2】:

      感谢代码正在运行

      这是我的投资组合库代码第一次在点击类别时加载所有数据然后获取类别数据enter code here

      Thanks code is working 
      
      This is my Portfolio gallery code First time load all data when click category then get category data`enter code here`
      import React, { Component, useEffect, useState } from 'react'`enter code here`;
      import Thumnailport_list from './Thumnailport_list';
      import Portlightbox from './Portlightbox';
      import Functional from './Functional';
      import $ from 'jquery';
      
      const Portfolio = () => {
      
          const filterItem = async (categoryitem) => {
      
              const updateitmes = allModelos.filter((curElm) => {
                  return curElm.categories === categoryitem
              })
      
              getporfolioState(updateitmes)
      
      
          }
          const [getporfolio, getporfolioState] = useState([])
          const [allModelos, guardarAllModelo] = useState([]);
      
          $(document).ready(function () {
              $(".grid-wrap .grid li").unbind().click(function (e) {
                  console.log(this.className);
                  var newe = this.className;
                  $('.' + newe).addClass('current show');
                  $("#grid-gallery").addClass("slideshow-open");
              });
      
              $("#closeport").unbind().click(function (e) {
                  $("#grid-gallery").removeClass("slideshow-open");
                  $(".portfolio .grid li").removeClass('current show');
                  $(".portfolio .slideshow ul > li").removeClass('current show');
              });
          });
      
          const portadd = () => {
              document.body.classList.add('portfolio');
              document.body.classList.add('at-top');
      
              document.getElementById('port').classList.add('no-transform');
              document.getElementById('port').classList.add('revealator-within');
              document.getElementById('port2').classList.add('no-transform');
              document.getElementById('port2').classList.add('revealator-within');
              document.getElementById('navbar-collapse-toggle').classList.remove('biohidemenu');
          }
      
          const getalldata = async () => {
              try {
                  const res = await fetch("/getdata", {
                      method: 'Get',
                      headers: {
                          'Content-Type': 'application/json'
                      }
      
                  })
                  const data = await res.json()
                  // console.log("This is our data load")
                  // console.log(data.portfolio)
                  getporfolioState(data.portfolio)
                  guardarAllModelo(data.portfolio)
      
      
      
      
              } catch (error) {
                  console.log(error)
                  // history.push("/backoffice/login")
              }
          }
      
      
      
      
      
          useEffect(() => {
              getalldata()
              portadd()
      
      
      
      
          }, []);
          return (
              <>
      
                  <section id="port" class="title-section text-left text-sm-center revealator-slideup revealator-once revealator-delay1">
                      <h1 >my <span>portfolio</span></h1>
                      <span class="title-bg">works</span>
                  </section>
                  <section id="port2" className="main-content text-center revealator-slideup revealator-once revealator-delay1">
                      <div class="container">
                          <button className="btn btn-about " onClick={() => filterItem('mobileapp')}>Mobile</button>&nbsp;&nbsp;
                          <button className="btn btn-about " onClick={() => filterItem('frontend')}>Frontend</button>&nbsp;&nbsp;
                          <button className="btn btn-about " onClick={() => filterItem('gdesign')}>Graphics</button>
                      </div>
                      <div id="grid-gallery" className="container grid-gallery">
                          {/* Portfolio Grid Starts */}
                          <section className="grid-wrap">
                              <ul className="row grid">
                                  {
                                      getporfolio.map((getdata, index) => {
      
      
                                          return (
                                              <>
                                                  <Thumnailport_list
                                                      key={index}
                                                      portID={getdata._id}
                                                      imagetag={getdata.imguploadedFile}
                                                      figuertext={getdata.projectname}
      
                                                  />
                                              </>
                                          )
      
      
                                      })
                                  }
      
                              </ul>
                          </section>
                          {/* Portfolio Grid Ends */}
                          {/* Portfolio Details Starts */}
                          <section className="slideshow" id="sdfer">
                              <ul>
                                  {/* Portfolio Item Detail Starts */}
                                  {
                                      getporfolio.map((getdata, index) => {
                                          return (
                                              <>
                                                  <Portlightbox
                                                      idlight={getdata._id}
                                                      imagelight={getdata.imguploadedFile}
                                                      langport={getdata.language}
                                                      clientport={getdata.client}
                                                      projectnameport={getdata.projectname}
                                                      previewport={getdata.preview}
                                                  />
      
                                              </>
                                          )
      
      
                                      })
                                  }
      
      
      
      
      
      
      
                              </ul>
                              {/* Portfolio Navigation Starts */}
                              <nav>
                                  {/*<span className="icon nav-prev prev"><img src="images/left-arrow.png" alt="previous" /></span>
                              <span className="icon nav-next next"><img src="images/right-arrow.png" alt="next" /></span>*/}
                                  <span className="nav-close" id="closeport"><img src="images/close-button.png" alt="close" /> </span>
                              </nav>
                              {/* Portfolio Navigation Ends */}
                          </section>
                      </div>
                  </section>
      
      
      
      
              </>
          )
      }
      
      export default Portfolio;

      【讨论】:

        猜你喜欢
        • 2020-01-21
        • 1970-01-01
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 2019-12-28
        • 1970-01-01
        • 2011-08-28
        • 2018-01-24
        相关资源
        最近更新 更多