React: рдмрдЧ: OnKeyDown рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рдЕрд╕рдВрдмрдВрдзрд┐рдд рд░рд╛рдЬреНрдп рдЕрджреНрдпрддрди onChange рдФрд░ рдирд┐рдпрдВрддреНрд░рд┐рдд рдШрдЯрдХ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 9 рдЬреБрд▓ре░ 2020  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/react

рдирдорд╕реНрддреЗ, рдореИрдВ рдЗрдирдкреБрдЯ рдирд┐рдпрдВрддреНрд░рд┐рдд рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ onKeyDown рдФрд░ onChange рдЗрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реВрдВред рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдЧрд╛ рддреЛ рдпрд╣ рдПрдХ рдкреНрд░рднрд╛рд╡ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдВрддрд░рд┐рдХреНрд╖ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рдПрдХ рдмрдЧ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рдЗрд╕рдХреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИред рд▓реЗрдХрд┐рди onKeyUp рд╕рджрд╕реНрдпрддрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдпрд╣ рдЙрд▓рдЭрди рд╣реИред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг: 16.13.1 рдФрд░ рдкреБрд░рд╛рдирд╛

рдкреНрд░рдЬрдирди рдХрд░рдиреЗ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛

  1. рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдВ
  2. рдЗрдирдкреБрдЯ рддрддреНрд╡ рд╕реНрдХреНрд░реАрди рдкрд░ рд╕реНрдерд╛рди рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ

рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ:

import React, { useState,useEffect } from 'react'

const App = () => {
  const [count, setCount] = useState(0)
  const [value, setValue] = useState('')
  const [code, setCode] = useState('add')

  useEffect(() => {
    if (code === 'add') {
      setCount(c => c + 1)
    } else {
      setCount(c => c - 1)
    }
  }, [code, setCount])

  const keyDown = e => {
    if (e.keyCode === 32) {
      console.log('space~')
      if (code === 'add') {
        setCode('minus')
      } else {
        setCode('add')
      }
    }
  }

  const handleChange = e => {
    setValue(e.target.value)
  }

  return (
    <div>
      <div>{count}</div>
      <br />
      <input onKeyDown={keyDown} value={value} onChange={handleChange} />
    </div>
  )
}

export default App

рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░

рдЗрдирдкреБрдЯ рддрддреНрд╡ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░

рдЗрдирдкреБрдЯ рддрддреНрд╡ рдЕрдВрддрд░рд┐рдХреНрд╖ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ

DOM Unconfirmed Bug

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ onKeyDown рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд░рд╛рдЬреНрдп рдХреЗ рдЕрджреНрдпрддрди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ onChange рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдирд┐рдпрдВрддреНрд░рд┐рдд рдШрдЯрдХ рдХреЗрд╡рд▓ рд╡рд╣реА рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдмрддрд╛рддреЗ рд╣реИрдВ (рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ value рд░рд╛рдЬреНрдп), рдЗрд╕рд╕реЗ рдЕрдВрддрд░рд┐рдХреНрд╖ рд╡рд░реНрдг рдХрднреА рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдмрдЧ рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдпреЗ рджреЛрдиреЛрдВ рдШрдЯрдирд╛рдПрдВ рдкрд░рд╕реНрдкрд░ рдЬреБрдбрд╝реА рд╣реИрдВред

cc @trueadm @gaearon рдЙрдирдХреЗ рдЗрд╡реЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП

рдирдорд╕реНрддреЗ, рдореИрдВ рдпрд╣рд╛рдБ рдирдпрд╛ рд╣реВрдБ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╕реАрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

@bvaughn рдпрд╣рд╛рдВ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдорд┐рд▓рд╛ред

onKeyDown рдШрдЯрдирд╛ onChange рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рдХрд┐ рдЗрдирдкреБрдЯ рдХреЗ рд╕рдВрд╢реЛрдзрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддрд╛ рд╣реИред рдЕрд╕рд▓ рдореЗрдВ, onKeyDown onChange рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЯреЗрдХреНрд╕реНрдЯ рдЗрдирдкреБрдЯ onKeyUp ред

рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ keyDown , рдЬрдм setCode рдХреЙрд▓, рдкрд╣рд▓реЗ dispatchAction _Fiber_ рдкрд░ memoizedState рдирдП рдЪрд░рд┐рддреНрд░ рдХреЗ рдмрд┐рдирд╛ (рдЬрд╛рд╣рд┐рд░ рд╣реИ) рдФрд░ e рдЬреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдЗрдирдкреБрдЯ рдореЗрдВ рдирдП рдЪрд░рд┐рддреНрд░ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рддрдм useEffect() dispatchAction рдлрд┐рд░ рд╕реЗ _same queue_ рдХреЗ рднреАрддрд░ (рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдХрддрд╛рд░ рд╣реИ), рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдкреНрд░реЙрдкрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдЬрдм рдпрд╣ commitRoot , рддреЛ рдпрд╣ pendingProps рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ memoizedState ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЪрд░рд┐рддреНрд░ (рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕реНрдерд╛рди) рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдирдП рдЪрд░рд┐рддреНрд░ (рд╕реНрдерд╛рди) рдХреЗ рдмрд┐рдирд╛ рддреБрд░рдВрдд рдкреБрд░рд╛рдиреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

_Same queue_ (?) рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг:

useEffect(() => {
    if (code === 'add') {
      setCount(c => c + 1)
    } else {
      setCount(c => c - 1)
    }
  }, [code, setCount])

рдЗрд╕рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

useEffect(() => {
    if (code === 'add') {
      setTimeout(() => setCount(c => c + 1), 0)
    } else {
      setTimeout(() => setCount(c => c - 1), 0)
    }
  }, [code, setCount])

рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдЗрд╕реА рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧрддреЗ рд╣реБрдП, рдХреАрдбрд╛рдЙрди рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдЖ рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рдореЗрдВ рдореЗрд░реЗ рд╕реЗрдЯрд╕реНрдЯреИрдЯ рдХреЙрд▓ рдХреЛ рд▓рдкреЗрдЯрдХрд░ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ред

рдореИрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдпрджрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рдбреЗрд╡рд▓рдкрд░ рдХреА рддрд░рдл рдПрдХ рдмрдбрд╝реА рдЧрд▓рддреА рдпрд╛ рдЦрд░рд╛рдм рдкреИрдЯрд░реНрди рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреА рд╣реИ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jimfb picture jimfb  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zpao picture zpao  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jvorcak picture jvorcak  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

trusktr picture trusktr  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MoOx picture MoOx  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ