列表页和编辑弹窗各自用 useState 存同一批订单,弹窗改完状态列表还是旧值,刷新页面才一致,控制台没有任何报错。乍看像缓存或者权限的锅,追下去往往不是。
const [orders, setOrders] = useState([]);
<Edit orders={orders} onSave={setOrders} />
追下去是这么回事:同一份数据在两个组件里各复制一份,没有单一数据源,弹窗改的只是自己那份,列表那份从头到尾没动过,刷新才重新拉,这就是两份状态各说各话。
碰到「组件状态不同步」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
具体做法是,把状态提到共同父级或者状态库里统一管理,只留一份数据源;子组件只读 props,不要再自己复制一份,改动全部上交;保存之后通过回调把结果回写到父级,由父级统一更新。
验收就看一点,弹窗保存后列表立即显示新状态,不需要刷新页面,也不用二次确认。
