【问题标题】:Getting latest state value with React Hook?使用 React Hook 获取最新状态值?
【发布时间】: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

解决方案

  1. 一旦ajax调用返回,在设置myText之前,检查myState的最新值,如果有变化,则不更新myText

  2. 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


【解决方案1】:

您可以添加一个不会中止 ajax 调用的清理方法,而只是告诉您的 useEffect 钩子该值不再是当前值,然后如果返回值则忽略 setText

useEffect(() => {
  let isCurrent = true;
  ajaxCall(myState).then(data => {
    if (isCurrent) {
      setText(data);
    }
  })
  return () => {
    isCurrent = false;
  }
}, [myState]);

【讨论】:

  • 哇!这很有趣,我会在这里放一段时间,看看是否每个人都认为这是最好的方法。
  • 非常漂亮的模式。没想到
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2020-07-21
  • 1970-01-01
  • 2020-03-03
  • 2021-08-24
  • 1970-01-01
相关资源
最近更新 更多