reactjs - 第一次取数据成功,第二次取数据不成功
问题描述
我想用 useEffect 获取数据。使用第一个函数,我得到事件详细信息,使用第二个函数,我得到与事件相关的问题(按 ID)。获取事件数据成功,但第二次获取问题数据不成功(有时成功)。为什么一次取数据成功,第二次不成功?
控制台日志的输出:
Quiz.js:23 {active: true, _id: "6012eafe7813901034e77fb3", nameOfEvent: "Udalost 3", creatorId: "5fd23fb7b1a3a005cc82225d", participants: Array(0), …}
Quiz.js:45 {}
Quiz.js:23 {active: true, _id: "6012eafe7813901034e77fb3", nameOfEvent: "Udalost 3", creatorId: "5fd23fb7b1a3a005cc82225d", participants: Array(0), …}active: truecodeEvent: "udalost1"createdAt: "2021-01-28T16:49:02.374Z"creatorId: "5fd23fb7b1a3a005cc82225d"nameOfEvent: "Udalost 3"participants: []updatedAt: "2021-02-01T16:52:45.471Z"__v: 0_id: "6012eafe7813901034e77fb3"__proto__: Object
Quiz.js:45 {}
文件 Quiz.js
const Quiz = () => {
const dataForQuiz = getUserDataToQuiz();
const [eventValues, setEventValues] = useState({});
const [questionBankOfEvent, setQuestionBankOfEvent] = useState({});
const initDataToEvent = () => {
getEventByEventCode(dataForQuiz.codeEvent).then(data => {
if (!data.error) {
setEventValues(data);
}
else {
console.log(data.error);
}
})
}
console.log(eventValues);
const initQuestionsForQuiz = () => {
if (eventValues) {
getQuestionsToEvent(eventValues._id).then((data) => {
if (!data.error) {
setQuestionBankOfEvent(data);
}
else {
console.log(data.error);
}
})
}
}
useEffect(() => {
initDataToEvent();
if(eventValues){
initQuestionsForQuiz();
}
}, []);
console.log(questionBankOfEvent);
const formQuiz = () => {
return(
<>
<h1>Quiz</h1>
</>
);
}
return (
<>
{formQuiz()}
</>
);
}
export default Quiz;
解决方案
在组件的第一次渲染中,您执行
initDataToEvent();
if(eventValues){
initQuestionsForQuiz();
}
initDataToEvent
应该更新 eventValues。所以你期望initQuestionsForQuiz
被处决。
但是,到了if(eventValues)
被评估的时候,setEventValues
已经被解雇了,但是eventValues
状态还没有被修改过。
因此,如果您将代码修改为:
useEffect(() => {
initDataToEvent();
console.log(eventValues);
if(eventValues){
initQuestionsForQuiz();
}
}, []);
你会观察eventValues
到是空的。
在 React 中,最好的做法是拆分事件和逻辑。在您的情况下,您希望initQuestionsForQuiz
在eventValues
已更新且不为空时运行。将您的代码修改为:
useEffect(() => {
initDataToEvent();
}, []);
useEffect(() => {
if(eventValues){
initQuestionsForQuiz();
}
}, [eventValues]);
应该让它工作。useEffect
这段代码的作用是每次修改时都会运行作为参数提供给 seconde 的函数eventValues
。
推荐阅读
- python-3.x - 当我打印时(nxtlines)为什么打印从 rhrhrhr PM-HR-PC(在字符 111)开始而不是在 PM-HR-PC(在字符 128)之后
- r - 根据列的顺序匹配数据框
- c++ - 获取exe文件夹路径的最佳方法?
- javascript - 如何将项目添加到列表中?仅使用 onsubmit
- coq - 推理已在定理中提取的类型类实例?
- android - 查找自定义图标的 componentInfo 名称
- spring - Microservice synchronous communication - service to service or message broker
- visual-studio-code - 在 Windows 资源管理器中右键单击 VSCode 打开,没有重新打开以前的文件
- wordpress - 从 wordpress 中的图像添加链接
- kubernetes - 如何使用 kubernetes rest api (jsonpath) 获取 pod 名称列表