javascript - React hooks - 由于关闭而异步 setState 更新旧状态

标签 javascript reactjs closures react-hooks

以下组件应该:

  1. 从 API 调用中获取单个字母
  2. 将其附加到字符串并显示

问题:当我快速按下按钮几次时,字符串仅更新了 1 个字母 预期结果:无论点击的频率如何,字符串都会更新为与按钮点击相同数量的字母

我知道问题在于闭包保留了对旧 letters 的引用。处于状态的变量。 但是如何用钩子(Hook)解决这个问题呢?我将其重写为一个类组件并且它在那里工作,但那是因为 this.state.letters没有处于关闭状态。

按“运行代码片段”进行测试。

function getRandomLetter() {
  return 'abcdefghijklmnopqrstuvwxyz'[new Date() % 26]
}

function apiCreateNextLetter() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(getRandomLetter())
    }, 1000)
  })
}

function Alphabet() {
  const [letters, setLetters] = React.useState('')

  function getNextLetter() {
    apiCreateNextLetter().then(nextLetter => {
      setLetters(letters + nextLetter)
    })
  }

  return (
    <div>
      <button onClick={getNextLetter}>
        Get next letter
      </button>
      <span>
        Letters: {letters}
      </span>
    </div>
  )
}

ReactDOM.render(<Alphabet />, document.querySelector("#app"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script><div id="app"></div>

最佳答案

使用updater form ...

setLetters(prevLetters => prevLetters + nextLetter)

关于javascript - React hooks - 由于关闭而异步 setState 更新旧状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60083794/

相关文章:

javascript - Summernote 文本编辑器无法在生成 html 的简单 Bootstrap 页面中工作

javascript - 在Javascript中,为什么 "this"运算符不一致?

javascript - Jest 无法加载 svg 文件

reactjs - 如何从mapDispatchToProps内部访问状态

javascript - 为什么异步数组映射返回 promise ,而不是值

.net - Docker中的.Net核心+ React + PostgreSQL

javascript - 在 redux 函数中重构变量

objective-c - 将 Swift block 转换为 Objective-C block

javascript - 闭包中的值会发生什么? JavaScript

javascript - JavaScript 中的一个参数强制使用两个值?