2 回答
TA贡献1856条经验 获得超5个赞
onDeviceIdChange 应该是这样的:
const onDeviceIdChange = async (e, { value }) => {
// code for validating value etc
setDeviceId(value);
}
其余的代码应该进入useEffect依赖于的钩子deviceId:
useEffect(fetchId, [deviceId]);
TA贡献1951条经验 获得超3个赞
setDeviceId(value);
console.log(deviceId); //this won't update immediately because setDeviceId is asynchronous!
setState() 不会立即改变 this.state 而是创建一个挂起的状态转换。调用此方法后访问 this.state 可能会返回现有值。无法保证对 setState 调用的同步操作,并且可能会批量调用以提高性能。
React 不会更新状态,当您使用 console.log 时,您会获得先前的值
在您的情况下,您可以使用valuefor all 同步操作,因为它是您正在设置的新值,或者您可以将 setState 下面的所有代码移动到 auseEffect
更新
从下面的代码和文档
onChange={onDeviceIdChange}
第二个参数将是形状的对象,{data: value} 因此您的参数value将始终未定义!
const onDeviceIdChange = async (e, {value}) => {
console.log("device id value --> ", value);
console.log("device value from event --> ", e.target.value);
setDeviceId(value);
};
useEffect(() => {
if (!deviceId) {
handleClear();
return;
}
try {
console.log("calling versionUrl");
const response = fetch(versionUrl, {
method: "POST",
body: JSON.stringify({
deviceId: deviceId
}),
headers: {
"Content-Type": "application/json"
}
});
if (!response.ok) {
setError(response.statusText);
}
const data = response.json();
console.log(data);
setVersionNum(data.version_num);
setIsLoading(false);
} catch (error) {
console.log("error catch", error);
console.log("Handle networking errors", error.message);
}
}
},[deviceId])
添加回答
举报