首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用useContext在React.js中进行过滤后重新获取数据

如何使用useContext在React.js中进行过滤后重新获取数据
EN

Stack Overflow用户
提问于 2021-02-05 10:36:08
回答 2查看 313关注 0票数 0

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

代码语言:javascript
运行
复制
    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接口中获得的信息是我到目前为止写的:

代码语言:javascript
运行
复制
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 modelos时,我不知道如何从API重新获取数据,因为当我对filterSegment函数进行新的调用时,它会过滤过滤后的数据。我试着添加一个布尔状态,我正在考虑添加另一个包含所有数据的状态,但我真的不知道如何实现它,我仍然是React.js的新手。我已经搜索了堆栈溢出和谷歌,我没有得到答案,如果你能给我一个线索或某种指导,它将不胜感激。

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-05 11:52:21

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

代码语言:javascript
运行
复制
//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组件中:

代码语言:javascript
运行
复制
    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,然后在某个地方调用它。

票数 1
EN

Stack Overflow用户

发布于 2021-07-25 00:34:45

感谢代码正常工作

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

代码语言:javascript
运行
复制
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;

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66056819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档