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

如何延迟useContext返回数据,等待currentUser加载完成后再执行useEffect

问题原因

你的useEffect当前依赖数组为空,只会在组件首次挂载时触发执行一次,此时CurrentUserContext还未完成currentUser的加载,所以拿到的是null。后续currentUser加载完成更新后,因为没有被加入依赖数组,useEffect不会重新触发,自然不会执行后续的查询赋值逻辑。

修复方案
  • 把currentUser添加到useEffect的依赖数组中,保证currentUser更新时会重新触发effect逻辑
  • 可以补充异步请求的中断逻辑,避免组件卸载后状态更新引发的内存泄漏警告

修正后的代码示例:

const [boarditems, setboarditems] = useState([]); 
const currentUser = useContext(CurrentUserContext); 

useEffect(() => {
  // 初始化AbortController用来中断请求,属于可选优化项
  const controller = new AbortController();
  const signal = controller.signal;

  if (currentUser) {
    const items = []; 
    db.collection("boarditems")
      .where("userID", "==", currentUser.id)
      .get({ signal }) // 传入中断信号
      .then(query => {
        query.forEach(doc => {
          items.push({
            id: doc.id, 
            ...doc.data()
          })
        })
        setboarditems(items);
      })
      .catch(err => {
        // 忽略请求中断引发的报错
        if (err.name !== 'AbortError') {
          console.error('获取boarditems失败:', err)
        }
      })
  }

  // 组件卸载时中断未完成的请求
  return () => controller.abort();
}, [currentUser]) // 把currentUser加入依赖数组
补充说明

如果不需要处理请求中断的逻辑,仅修改useEffect的依赖数组即可实现需求。修改后也不会触发ESLint react-hooks规则的依赖缺失警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 15:24:04