【发布时间】:2019-05-02 11:10:29
【问题描述】:
尝试将 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 调用已进行并很快取回数据并为 B 更新 myText。
10 秒后,A 的 ajax 调用终于返回并更新了 A 的 myText。
现在您看到了问题 - 用户选择了 B,但 UI 正在为 A 呈现 myText。
解决方案
一旦ajax调用返回,在设置
myText之前,检查myState的最新值,如果有变化,则不更新myText向
useEffect添加一个清理方法,以在之前的ajax 调用未完成时中止它。
我不知道 React Hook 是否可以使用解决方案 1,所以似乎首选方法是解决方案 2?
【问题讨论】:
-
何时调用
setMyState? -
UI 是一个切换开关,所以用户手动点击它会在 A 和 B 之间切换并调用 setMyState()
-
你可以使用 axios (github.com/axios/axios) 和 allow 来取消一个承诺...卸载有一个 useEffect 格式,如果没有完成,它可以用来取消承诺。如果已完成,取消将无效。
-
@JoaozitoPolo 对,这是我的第二个解决方案,我只是好奇是否有可能在使用 useEffect 的回调中获得最新的
myState... -
在这种情况下,您可以使用 React.memo 恢复最后一个 myState 而无需 ajax 调用
标签: reactjs react-hooks