Reactjs 尝试在API响应上设置值字符串时,useState和useRecoilState返回undefined
我遇到了useState和useRecoilState的一个大问题。 特别是,我使用DELETE方法调用restapi,该调用返回一个jobId,以便将来能够轮询以了解该作业的状态。 调用成功,响应正确返回,但是当我尝试设置“ReturnJobId”状态时,它将变为未定义状态。不会返回控制台错误或警告。 我试过使用反应状态和反冲状态,它们都有相同的结果。 我希望状态设置正确,因为它是一个简单的字符串。下面是一段有问题的代码。 正如您从代码中看到的,有问题的变量“returnedJobId”被初始化为null,但在尝试设置它之后,它将变得未定义。 这甚至不是一个计时问题,我尝试在几秒钟后创建控制台日志,但状态仍然未定义。 提前感谢任何试图帮助我的人Reactjs 尝试在API响应上设置值字符串时,useState和useRecoilState返回undefined,reactjs,use-state,Reactjs,Use State,我遇到了useState和useRecoilState的一个大问题。 特别是,我使用DELETE方法调用restapi,该调用返回一个jobId,以便将来能够轮询以了解该作业的状态。 调用成功,响应正确返回,但是当我尝试设置“ReturnJobId”状态时,它将变为未定义状态。不会返回控制台错误或警告。 我试过使用反应状态和反冲状态,它们都有相同的结果。 我希望状态设置正确,因为它是一个简单的字符串。下面是一段有问题的代码。 正如您从代码中看到的,有问题的变量“returnedJobId”被初始
const [returnedJobId, setReturnedJobId] = useState(null);
fetch(basePath + "/digital/cpes/" + cpeToReset + "/redreset", {
method: 'DELETE',
headers: {
federationId: userFederationId
}
}).then(res => res.json())
.then(data => {
console.log("Dati ordine di reset: ", data);
if (data.code !== 200) {
setIsResetting(false);
console.log("Response code errato: ", data.code);
} else {
console.log("Ordine di reset OK");
setReturnedJobId(data.jobId); /*This is the problematic instruction */
console.warn('Setto il seguente job id: ', data.jobId);
setTimeout(() => {
console.log("Stato del job id: ", returnedJobId); /*Here is undefined*/
}, 1000);
}
})
我假设
returnedJobId
是与setReturnedJobId
状态更新程序对应的值。我还假设您在setTimeout
中记录状态,因为您知道状态更新不会立即发生。您仍然有问题的原因是由于过时的关闭
请注意,如果正确声明了状态,returnedJobId
是一个const
。常量不能更改。即使您延迟了变量的日志记录,它仍然是一个常量
,永远不会更新
useState
的工作方式是在下一次渲染时捕获新状态的值。在功能组件中,下一次渲染对应于React调用该功能组件的下一次渲染。当调用任何函数(组件或其他)时,所有局部变量都是全新的。先前渲染的局部变量将被销毁,并在其位置创建新的局部变量useState
非常有用,因为它将传递给updater函数的值分配给新的const
。它有更新常量的错觉,但实际上它是一个全新的变量
因此,无论发生什么情况,都无法在当前渲染期间获取状态的新值。你必须等到下一个。最常用的方法是使用useffect
useffect(()=>{
log(“Stato del作业id:”,returnedJobId);
},[returnedJobId]);
我假设returnedJobId
是与setReturnedJobId
状态更新程序对应的值。我还假设您在setTimeout
中记录状态,因为您知道状态更新不会立即发生。您仍然有问题的原因是由于过时的关闭
请注意,如果正确声明了状态,returnedJobId
是一个const
。常量不能更改。即使您延迟了变量的日志记录,它仍然是一个常量
,永远不会更新
useState
的工作方式是在下一次渲染时捕获新状态的值。在功能组件中,下一次渲染对应于React调用该功能组件的下一次渲染。当调用任何
函数(组件或其他)时,所有局部变量都是全新的。先前渲染的局部变量将被销毁,并在其位置创建新的局部变量useState
非常有用,因为它将传递给updater函数的值分配给新的const
。它有更新常量的错觉,但实际上它是一个全新的变量
因此,无论发生什么情况,都无法在当前渲染期间获取状态的新值。你必须等到下一个。最常用的方法是使用useffect
useffect(()=>{
log(“Stato del作业id:”,returnedJobId);
},[returnedJobId]);
更新后,我很好奇,控制台日志的结果是什么?我希望最后一个显示为null
而不是未定义的
,因为您已将其初始化为空。原因是我拥有所有未使用的逻辑,所有这些逻辑都必须通过单击按钮触发。在您的建议之后,我只移动了useEffect中的“轮询”逻辑,并且变量和变量在您的更新之后被正确更新,我很好奇,您的控制台日志的结果是什么?我希望最后一个显示为null
而不是未定义的
,因为您已将其初始化为空。原因是我拥有所有未使用的逻辑,所有这些逻辑都必须通过单击按钮触发。根据您的建议,我只移动了useEffect中的“轮询”逻辑,并且变量和变量被正确更新