React中用Set管理批量更新列表缓存的核心是利用其去重特性与不可变更新模式,通过ref暂存、防抖提交、key归一化及useReducer封装实现高效同步。
在 React 中用 Set 管理批量更新的列表缓存,核心是利用其天然去重特性 + 不可变更新模式,避免重复渲染和冗余数据。关键不在“存”,而在“怎么安全地合并、更新、同步到状态”。
不要每次拿到新项就立刻 setState,而是先累积到一个临时 Set,等批量操作完成(比如 API 响应返回、用户连续点击结束)再一次性同步到 React state:
const pendingItems = useRef(new Set())
pendingItems.current.add(item)(自动去重)setList(Array.from(pendingItems.current))
pendingItems.current.clear()
Set 对对象按引用判重,两个结构相同但不同引用的对象会被视为不同项。所以实际使用中必须提取唯一标识(如 id)来归一化:
pendingItems.current.add(item.id)
setList([...pendingItems.current].map(id => itemMap[id])),其中 itemMap 是 id → 完整对象的 Map 缓存JSON.stringify(item) 当 key(仅限简单扁平对象,且注意顺序和 undefined 处理)当更新来自高频事件(如搜索输入、滚动加载),可用 useEffect + 定时器聚合多次变更:
clearTimeout(timerRef.current); timerRef.current = setTimeout(submit, 300)
Array.from(Set) 同步,确保 300ms 内所有变更只触发一次 re-render把 Set 缓存逻辑封装进 reducer,让状态更新可追溯、易测试:
items: Set 和 list: [](用于渲染)ADD_ITEMS action:payload 是数组,reducer 用 new Set([...state.items, ...payload.map(x => x.id)]) 合并COMMIT action:将 state.items 转成 list 并覆盖 state.list,再清空 items Set不复杂但容易忽略:Set 本身不是响应式,它只是工具;真正驱动 UI 更新的仍是最终赋给 state 的那个数组。把 Set 当“草稿本”,把数组当“快照”,边界清晰,就不容易出错。