Chakra UI RangeSlider价格过滤功能失效求助
Chakra UI RangeSlider价格过滤功能失效求助
嘿,我仔细看了你贴的代码,马上发现了价格过滤失效的核心问题——你完全搞错了RangeSlider返回值的用法!
先给你捋清楚:
- 你的Chakra RangeSlider在
onChangeEnd拿到的price是一个区间数组(比如[10000, 50000]),代表用户选择的价格最小值和最大值 - 但你在
dataFiltered里写的价格过滤逻辑,是在判断商品价格是否等于这个数组里的某一个值,这就导致只有价格刚好踩中滑块两端点的商品才会被筛选出来,完全不是你想要的「价格范围过滤」效果!
先改最关键的过滤逻辑
把dataFiltered里价格相关的判断代码,替换成区间判断:
(filter?.price?.length === 2 ? val?.price >= filter.price[0] && val?.price <= filter.price[1] : true)
完整的dataFiltered应该是这样:
const dataFiltered = item?.filter((val) => { const searchInput1 = `${val.description.toLowerCase()} ${val.location.toLowerCase()} ${val.suburb.toLowerCase()} ${val.price.toString()}`; return ( searchInput1.includes(filter.search.toLowerCase()) && (filter?.location?.length ? filter.location.map((v) => v.toLowerCase()).includes(val?.location?.toLowerCase()) || filter.location.length === 0 : true) && (filter?.description?.length ? filter.description.map((v) => v.toLowerCase()).includes(val?.description?.toLowerCase()) || filter.description.length === 0 : true) && (filter?.suburb?.length ? filter.suburb.map((v) => v.toLowerCase()).includes(val?.suburb?.toLowerCase()) || filter.suburb.length === 0 : true) && // 修复后的价格范围判断 (filter?.price?.length === 2 ? val?.price >= filter.price[0] && val?.price <= filter.price[1] : true) ); });
额外的几个小建议
- 处理空数据的边界情况:你的
getMinMax函数如果遇到item为空数组的话,Math.min(...prices)会报错,建议加个兜底:
const getMinMax = (item) => { if (!item?.length) return [0, 500000]; // 滑块的默认min和max const prices = item.map((item) => item.price); const min = Math.min(...prices); const max = Math.max(...prices); return [min, max]; };
- 滑块值的同步问题:如果你用的是
defaultValue,当item数据更新时,滑块不会自动同步新的min/max,建议改成value={getMinMax(item)},或者在item变化时手动更新filter.price的值,保证滑块和数据一致。 - 搜索输入的小问题:你原来的
searchInput1里用了||,这会把字符串变成"xxx || yyy || zzz",其实直接用空格拼接就行,不然搜索的时候用户输||才会匹配,完全没必要。
这样修改后,价格范围过滤应该就能正常工作了!
备注:内容来源于stack exchange,提问作者Spatial_TX
相关产品推荐
相关产品推荐

