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

React Context状态更新后useEffect未触发问题求助

问题根源:直接修改原数组导致React状态未触发更新

你的问题出在表单提交时修改状态的逻辑里——你用了splice直接修改了原数组的内容,然后把同一个数组引用返回给setDestinations。

React的状态更新(包括useState和Context)是通过引用对比来判断状态是否变化的:如果前后状态的引用没有改变,React会认为状态没更新,不会触发组件重渲染,也不会执行依赖该状态的useEffect。

修复方法:执行不可变的数组更新操作

不要直接修改原数组,而是创建一个新的数组返回给setDestinations。可以用扩展运算符(...)或者slice+concat来实现:

修改后的submitHandler代码:

const { destinations, setDestinations } = useContext(DestinationsContext);
const submitHandler = (event) => {
  event.preventDefault();
  setDestinations(previousDestinations => {
    // 用扩展运算符拆分原数组,插入新元素后生成新数组
    return [
      ...previousDestinations.slice(0, index),
      new Destination(...),
      ...previousDestinations.slice(index)
    ];
  })
}

额外优化:避免冗余状态

你的Menu组件里额外维护了menuItems状态其实没必要,直接在渲染时映射destinations即可,这样能避免状态同步的潜在问题:

function Menu() {
  const { destinations } = useContext(DestinationsContext);

  return (
    <ul>
      {destinations.map((destination, idx) => (
        <DestinationItem key={idx} /> {/* 建议用数据的唯一id作为key,不要用索引 */}
      ))}
    </ul>
  )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:10:49