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

为什么Context更新时我的React组件没有触发重新渲染?

问题根因

你的组件实际已经被Context更新触发了重渲染,第二个监听data的useEffect能正常打印就可以证明这一点,你误以为没重渲染是数据结构错误导致渲染逻辑执行异常,没有输出预期的表格内容,具体问题出在两个地方:

  • 第一个useEffect存在闭包陷阱:你给useEffect传的依赖数组是空值,回调里捕获的data永远是组件首次渲染时的初始值(一般是空数组)
  • 追加数据时没有正确摊平数组:res.results本身就是返回的用户对象数组,你直接把它作为单个元素塞到了data里,最终data的结构是[[用户1, 用户2...]]二维数组,不是你预期的一维用户数组

你在遍历data时拿到的每一项是整个用户数组,调用user.dob.date会直接抛出类型错误,渲染逻辑中断,自然看不到表格行。

修复方案

修改第一个useEffect的写法,用函数式更新拿到最新的状态,同时正确展开返回的用户数组:

useEffect(() => {
  fetchUsers(`https://randomuser.me/api/?results=50`).then(
    (res) => {
      // 函数式更新避免闭包问题,同时展开res.results把用户摊平为一维数组
      setData(prevData => [...prevData, ...res.results]);
      // 如果你不需要追加、只是首次加载全量覆盖,直接写 setData(res.results) 即可
    }
  )
// 依赖数组只需要放引用稳定的setData,不需要放data
}, [setData])

额外验证点:确认你的dataContext.Provider已经正确包裹了Table组件,且Provider的value属性传递的setData是useState返回的原生更新函数(引用稳定,不会反复触发不必要的重渲染)。

内容的提问来源于stack exchange,提问作者João Pedro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:36:03