【问题标题】:Multiple filters in ReactReact 中的多个过滤器
【发布时间】:2019-12-12 23:28:13
【问题描述】:

我正在构建一个显示来自 api 的一些数据的项目,现在我需要对其进行过滤。

我已经完成了类别过滤器,现在我必须做一个价格范围过滤器,以便这两个过滤器可以一起工作,但我正在努力如何正确地做到这一点。 对于价格范围过滤器,我使用 2 个输入和一个提交按钮。

我有一个对象数组,看起来像这样;

filterData = [
  { name: 'Aang', bender: 'yes', nation: 'Air', person: 'yes', show: 'ATLA', price: 132342 },
  { name: 'Appa', bender: 'yes', nation: 'Air', person: 'no', show: 'ATLA', price: 1322 },
  { name: 'Asami', bender: 'no', nation: 'Republic City', person: 'yes', show: 'LOK', price: 132342 },
  { name: 'Azula', bender: 'yes', nation: 'Fire', person: 'yes', show: 'ATLA', price: 12342 }, etc]

我有状态:

state = {
        data: [],
        nation: '',
        priceStart: '',
        priceEnd: ''
    }

如果我的弯管机状态发生变化,则设置状态的功能 开始和结束状态也有类似的功能 当我为价格设置状态时,我解析它,所以我有一个状态数字,顺便说一句,每次我输入一些数字然后删除它时都会收到警告,它说 Received a NaN for the 'value' 属性

 chFilter = (type, val) => {
        switch(type) {
            case 'nation':
                this.setState({ nation: val });
                break;
            case 'priceStart':
                this.setState({ priceStart: val });
                break;
            case 'priceEnd':
                this.setState({ priceEnd: val });
                break;
            default:
                break;
        }
    }
getBenders = () => {
        const { data, category, priceStart, priceEnd } = this.state;
        if( nation || priceStart || priceEnd ){
             return data.filter(this.filterBender);
        } else {
           return data;
        }
    }

    filterBender = data => {
        let { nation, priceStart, priceEnd } = this.state;

        if(data.nation !== nation) return false;
        if(data.price < priceStart) return false;
        return true;
    }

我认为我需要为所有状态执行一个通用函数,以便它可以观察状态的变化并返回过滤后的数据。 帮助如何正确地做到这一点

【问题讨论】:

    标签: javascript json reactjs object filter


    【解决方案1】:

    您应该编写一个新的过滤器函数,将这些过滤器合并在一起。并像这样使用它:

    filterBender = data => {
        const {bender, person, nation} = this.state;
        if(bender && data.bender !== bender) return false;
        if(person && data.person !== person) return false;
        if(nation && data.nation !== nation) return false;
        ...
        return true;
    }
    
    const visibelBenders = filterData.filter(filterBender);
    

    这样,您将只过滤一次数据,并且每个弯曲器都会针对每个约束进行一次评估。最后,只有对所有不同的 if 都返回 true 的弯曲器将被插入到 visibelBenders 数组中,您可以对其进行渲染。 此外,您可以将其包装到 memorization 函数中,以便仅在其中一个过滤器发生更改时才执行它。

    要显示所有弯曲器,如果没有设置过滤器,您可以将过滤器包装到一个新函数中以检查是否启用过滤。

    const getBenders = () => {
        const { bender, person, nation} = this.state;
        if( person || bender || nation ){
             return this.filterData.filter(filterBender);
        } else {
           return this.filterData;
        }
    }
    const benders = getBenders();
    

    【讨论】:

    • 谢谢。这种作品,但我如何在一开始就显示每个项目。如您所见,它最初设置为“全部”,所以我想从头看到它,然后过滤它
    • 很抱歉耽误了您的时间,但下一个问题是当我填写价格输入并且没有过滤器处于活动状态时,一切都消失了,但是当一个过滤器处于活动状态时,价格过滤器工作得很好
    • 你能更新你的代码如何过滤价格等吗?
    • 在您的过滤器函数中,您必须检查每个“if”,如果该值存在,如下所示: if(nation && data.nation !==nation) return false;,如果不是,第一个总是返回 false 因为 data.nation 总是 !== '' 如果国家 === '' 并且没有数据是可见的。我添加了一个 codepen 来向您展示它是如何工作的:codesandbox.io/s/elated-rosalind-td4tx
    【解决方案2】:

    我对marge过滤器有同样的问题我有两个过滤器,每个都可以正常工作,但不能一起工作,只有第一次工作我的代码是

    const [search, setSearch] = useState('');
    const [select, setSelect] = useState('All');
    
    
    const updateSearch = (e) => {
        setSearch(e.target.value);
        //console.log(search);
      }
    
    const updateSelect = (e) => {
        setSelect(e.target.value);
        //console.log(select);
    }
    
    const searchCountry = zemlje.filter((zemlja) => {
        if (zemlja.name.toLowerCase().search(new RegExp(`^${search}`)) === 0) return true;
    });
    
    const selectCountry = zemlje.filter((zemlja) => {
        if (select ==='All') return true;
        if (zemlja.region === select) return true;
    });
    

    我想根据搜索输入过滤这个并选择下拉菜单

            <div className="atlas">
                {searchCountry.map(zemlja => (
    
                    <JednaZemlja 
                    key={zemlja.alpha3Code}
                    name={zemlja.name}
                    flag={zemlja.flag}
                    population={zemlja.population}
                    region={zemlja.region}
                    capital={zemlja.capital}
                    />
    
                ))}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 2021-03-23
      • 2020-11-22
      • 1970-01-01
      • 2020-04-21
      • 2022-11-01
      相关资源
      最近更新 更多