【发布时间】:2025-12-28 19:30:16
【问题描述】:
我正在尝试从 Firestore 数据库中获取一组问题,然后将它们存储在本地数组中,以便稍后在测验中使用。当我正在努力获取数据时,它是异步运行的。我之前处理过这个问题,解决方案是 useEffect() 钩子和条件渲染组件。
我的代码目前如下所示:
var questions = [];
var collection = useRef('Planning');
var [loading, setLoading] = useState(true);
useEffect(() => {
if (props.track === 'Testing & Deployment') {
collection.current = 'Test_Deploy';
} else {
collection.current = props.track;
}
if(questions.length !== 0){
setLoading(false)
} else {
var questionSet = db.collection('Quizzes').doc(collection.current).collection('Questions')
questionSet.withConverter(questionConverter).get().then(function(response) {
response.forEach(document => {
var question = document.data();
// running asynch - need to address
console.log('Question in')
questions.push(question)
})
})
setLoading(false)
}
}, [props.track, questions])}
根据setLoading() 所在的位置,组件要么根本不会重新渲染,要么会从 Firestore 中双重获取数据。我尝试使用 useCallback() 无济于事,并且还发现这可能是 React StrictMode 的问题。
关于如何修复我的代码以便在提取所有问题后重新呈现页面而不重复提取它们的任何建议?
【问题讨论】:
-
仅供参考,
questions将在每个渲染周期重置为空数组[]。它应该是组件状态的一部分。您的问题真的是关于在组件挂载上一次获取数据吗? -
是的,这可能是问题的核心。在此之前我尝试使用类组件,但发现很难更新状态数组。
标签: reactjs google-cloud-firestore react-hooks