如何延迟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
相关产品推荐
相关产品推荐

