javascript - 如何使用 React Hooks 捕获最后一个输入字母

标签 javascript html reactjs react-hooks

我正在学习 React Hooks,我想构建一个打字比赛游戏:一个小游戏来跟踪你可以多快地输入一段文本。

逻辑很简单:当用户开始游戏时,设置开始时间,当输入的等于所选的snippet时>,显示结束时间

但是当我开始游戏并输入正确的单词时,它并没有显示我输入了相同的单词。

打开控制台,输入任意单词,发现react没有捕获我输入的最后一个字母,比如我输入abc,控制台只是显示ab

那么我怎样才能使用react hooks来完成游戏呢?

这是我的完整代码:

const App = () => {
  const SNIPPETS = [
    'Bears, beets, battlestar galactica',
    "What's Forrest Gump's password? 1Forrest1",
    'Where do programmers like to hangout? The Foo Bar'
  ]

  const INITIAL_GAME_STATE = { victory: false, startTime: null, endTime: null }

  const [snippet, setSnippet] = useState('')
  const [gameState, setGameState] = useState(INITIAL_GAME_STATE)
  const [userText, setUserText] = useState('')

  useEffect(() => {
    console.log('change')
    if (gameState.victory) {
      document.title = gameState.victory ? 'Victory!' : 'Playing...'
    }
  }, [gameState.victory])

  const updateUserText = e => {
    setUserText(e.target.value)
    console.log(snippet)
    console.log(userText)
    if (userText === snippet) {
      console.log('same')
      setGameState({
        ...gameState,
        victory: true,
        endTime: new Date().getTime() - gameState.startTime
      })
    }
  }

  const chooseSnippet = snippetIndex => () => {
    setSnippet(SNIPPETS[snippetIndex])
    setGameState({
      ...gameState,
      startTime: new Date().getTime()
    })
  } 

  return (
    <div className="game-wrapper">
      <h2>Type Race</h2>
      { snippet && (
        <>
          <h4>{ snippet }</h4>
          <input type="textarea" value={ userText } onChange={ updateUserText } />
          <br />
        </>
      ) }
      <br/>
      <button onClick={ chooseSnippet(0) }>Start a new race!</button>
      <br/>
      { gameState.victory && (
        <h4>`Done! <span>🎉</span>Time: ${ gameState.endTime }ms`</h4>
      ) }
      <br/>
      {
        SNIPPETS.map((SNIPPET, index) => (
          <button onClick={ chooseSnippet(index) } key={ index }>
            { SNIPPET.substring(0, 10) }...
          </button>
        ))
      }
    </div>
  )
}

最佳答案

因为 React setState 是异步的,所以在调用 setUserText 后,你的 userText 值不会更新。要获取更新的 userText,请等待组件的下一次渲染。

useEffect(() => {
  if (userText === snippet) {
    // do something ...    
  }
}, [userText]);

了解更多信息:useState set method not reflecting change immediately

关于javascript - 如何使用 React Hooks 捕获最后一个输入字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59334324/

相关文章:

javascript - 防止内容在位置更改时跳跃到固定

javascript - 如何将一棵树或多张 Canvas 叠放在一起?

javascript - 正则表达式:如何像 DOM 渲染器那样删除多余的空格/换行符(处理)

javascript - 与 react-select 一起使用的 Material UI 组件重置滚动位置

javascript - 如何在nodejs中获取ReferenceError的详细信息

javascript - html5/javascript乘以输入类型并显示在表格中

html - Safari 和 :after , 问题:之前 { box-sizing:border-box; }

html - CSS 样式无法在手机上正确隐藏图像

javascript - ExtReact 中的错误 : C2008: Requirement had no matching files (ExtReactModels. model.Item)

reactjs - 将 React-Window 添加到 Material-UI 增强表 : type is invalid -- expected a string or a class/function but got: array