You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React更新state做标签筛选时如何保留原始数据解决二次筛选失效问题

问题原因和修复方案
  • 核心问题:你的筛选逻辑始终基于当前渲染的cardInfo数据,而非全量原始数据。首次筛选后cardInfo已经被替换为对应分类的子集,后续再筛选其他分类时,只能在这个子集里查找,自然找不到匹配内容,只有点击「全部」重置回全量数据才能恢复。

修复步骤

1. 修改筛选逻辑的数据源

你已经在Context中存储了全量原始数据permanentData,直接把筛选的基准改为permanentData即可,同时补充「全部」分类的判断逻辑:

const handleFiltering = (category) => {
    // 点击「全部」直接返回全量数据
    if (category === '全部') {
        setCardInfo(permanentData);
        return;
    }
    // 始终从全量原始数据中筛选,而非当前已过滤的cardInfo
    const filteredData = permanentData?.filter((item: feedbackTypes) => item.categories === category);
    setCardInfo(filteredData);
};

2. 补全Context Provider的传值

确保你用到的所有数据和方法都已经注入到Context中,避免取值报错:

return <DataContext.Provider value={{ 
    cardInfo, 
    setCardInfo,
    permanentData, // 保证全量原始数据可在Context中正常获取
    handleFiltering 
}}>{children}</DataContext.Provider>

3. 可选优化(标签选中逻辑)

当前标签是单选逻辑,无需用数组存储选中值,直接存字符串即可简化判断:

// 标签选中状态定义
const [selectedTag, setSelectedTag] = useState('全部')
const handleBtnStyle = (tag) => {
    setSelectedTag(tag)
}
// 标签类名判断简化为
className={selectedTag === values ? styles.tagSelected : styles.tagUnselected}

内容的提问来源于stack exchange,提问作者0pablot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:54:01