为什么删除SearchData中的元素时,useEffect没有触发state更新?
问题原因
- 你在
deleteEl删除逻辑中使用了splice方法,该方法是原地修改数组的API,修改后数组的引用地址和原searchData完全一致。 - React的state更新机制采用浅比较逻辑,当你把引用地址没有变化的数组传给
setSearchData时,React会判定state未发生更新,因此依赖searchData的useEffect不会被触发。 - 新增逻辑可以正常执行的原因是
concat方法会返回全新的数组,引用地址发生了变化,React可以正常检测到state更新。
修复方案
修改删除逻辑,先拷贝原数组生成新的引用,在新数组上执行删除操作后再传给setSearchData即可修正问题,同时建议反向遍历数组避免删除元素时出现索引错位:
const deleteEl = (itemKey, value) => { // 浅拷贝原数组生成新引用 const newSearchData = [...searchData]; // 反向遍历避免splice导致的索引错位漏判 for (let i = newSearchData.length - 1; i >= 0; i--) { // 可选链避免属性为null时的报错 if (newSearchData[i][itemKey]?.includes(value)) { newSearchData.splice(i, 1); } } setSearchData(newSearchData); };
内容的提问来源于stack exchange,提问作者Shota Donguzashvili
相关产品推荐
相关产品推荐

