reactjs - 使用 React Hook 获取最新状态值?
问题描述
尝试将 React Hook 与功能组件一起使用,但遇到了需要获取最新值的这种情况,我认为使用类组件,您可以依靠它this.state.foo
来获得最新值,但不确定 React Hook 是否可能。
用例
UI 有一个切换开关,有两种状态 - A 和 B,当用户切换到 A 时,我们进行 ajax 调用以获取 A 的数据并在 UI 中显示,对于 B 也是如此。
我的 useEffect 代码
function (props) {
const [myState, setMyState] = useState('A')
const [myText, setMyText] = useState()
useEffect(()=>{
ajaxCall(myState).then((data)=>{
setMyText(data)
})
}, [myState])
return <div>{myText}</div>
}
这通常是有效的,但并非总是如此,ajax 调用需要几秒钟才能完成,用户可以快速切换开关,我们遇到如下问题:
用户切换到 A,ajax 调用尝试获取 A 的数据。
对 A 的 Ajax 调用没有返回,用户切换到 B,新的 Ajax 调用已进行并很快取回数据并myText
为 B更新。
10 秒后,A 的 ajax 调用终于返回并更新了myText
A。
myText
现在您看到了问题 - 用户选择了 B,但 UI 正在为 A呈现。
解决方案
一旦ajax调用返回,在设置之前
myText
,检查最新的值myState
,如果已经改变,那么我们不更新myText
添加一个清理方法来
useEffect
中止之前的 ajax 调用,如果它还没有完成。
我不知道 React Hook 是否可以使用解决方案 1,所以似乎首选方法是解决方案 2?
解决方案
您可以添加一个不会中止 ajax 调用的清理方法,而只是告诉您的useEffect
钩子该值不再是当前值,然后忽略setText
返回值:
useEffect(() => {
let isCurrent = true;
ajaxCall(myState).then(data => {
if (isCurrent) {
setText(data);
}
})
return () => {
isCurrent = false;
}
}, [myState]);
推荐阅读
- android - 如何在 Activity 中使用 navGraphViewModels(不在 Fragment 中)
- elasticsearch - 如何在 Kibana 的可用字段列中获取 json 数据
- javascript - 为什么我得到:TypeError:无法解构“对象(...)(...)”的属性“患者”,因为它是未定义的?
- python - 如何从var获取框架名称
- vb.net - 如何在运行时删除/删除形状?
- nativescript - nativescript-ui-listview 分组时不显示数据
- excel - 嵌套 IF 帮助
- azure-storage - 如何在日期范围内搜索 blob 文件
- java - 验证地图
对象匹配 json 模式 - snowflake-cloud-data-platform - 001015 (22023):SQL 编译错误:函数 SYSTEM$PIPE_STATUS 的参数 0 需要保持不变