我正在构建一个项目,该项目显示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: ''
}
一个函数,如果我的弯曲器状态已更改,则设置状态 起始状态和结束状态也有类似的功能 当我为价格设置状态时,我会解析它,因此我有一个状态,顺便说一句,每次输入一些数字然后删除它时,都会收到警告,提示说'value'属性收到了NaN
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;
}
我认为我需要对所有状态执行通用功能,以便它可以监视状态变化并返回过滤后的数据。 帮助正确执行操作
答案 0 :(得分:3)
您应该编写一个新的过滤器功能,将这些过滤器合并在一起。并像这样使用它:
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();
答案 1 :(得分:0)
我对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}
/>
))}