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

React使用useState更新状态时filteredData仅第二次点击生效问题求助

问题根因

React的状态更新是批量异步执行的,你在handleCategory中调用setCategory(res.data)后,当前函数作用域内的category变量还是更新前的旧值,筛选逻辑实际用的是上一次选中的分类,所以才会出现点击第二次才生效的滞后问题。

修复方案

方案1:直接用传入的新分类值筛选(最简修改)

不需要依赖刚更新的category状态,直接用拿到的新值做筛选:

const handleCategory = (res) => {
  const newCategory = res.data;
  setCategory(newCategory);
  const filter = projectData.filter((data) => data.category === newCategory);
  setFilteredData(filter);
};

方案2:用useEffect监听状态自动筛选(逻辑更解耦)

把筛选逻辑和分类更新拆分开,只要分类或者源数据变化就自动重新筛选,后续维护更灵活:

const langs = ["react", "next js", "material-ui", "tailwind css", "firebase"];

const [projectData, setProjectData] = useState([]);
const [filteredData, setFilteredData] = useState([]);
const [category, setCategory] = useState("");

// 注意:原依赖数组为空,若props.projs后续会更新,需把projs加入依赖
useEffect(() => {
  setProjectData(projs);
}, [projs]);

// 新增监听逻辑,category或projectData变化时自动重新筛选
useEffect(() => {
  const filter = projectData.filter((data) => data.category === category);
  setFilteredData(filter);
}, [projectData, category]);

const handleCategory = (res) => {
  setCategory(res.data);
};

其他注意点

React的JSX语法中不识别class属性,你按钮代码里的class="px-2..."需要改成className="px-2...",样式才会正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:57:01