React: ๋ฒ„๊ทธ : onKeyDown์˜ ๊ด€๋ จ์—†๋Š” ์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ onChange๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ์ œ์–ด ๋œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2020๋…„ 07์›” 09์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react

์•ˆ๋…•ํ•˜์„ธ์š”, ์ž…๋ ฅ ์ œ์–ด ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  onKeyDown ๋ฐ onChange ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ณต๊ฐ„์— ๋“ค์–ด๊ฐˆ ๋•Œ ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณต๊ฐ„์€ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ React์˜ ๋ฒ„๊ทธ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋‚˜ onKeyUp ๊ตฌ๋…์€ ์ •์ƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

React ๋ฒ„์ „ : 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 ์˜ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ ์ „๋ฌธ์„ฑ

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ์—ฌ๊ธฐ ์ƒˆ๋กœ ์™”์œผ๋ฉฐ React ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋ฐฐ์šฐ๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

@bvaughn ์—ฌ๊ธฐ์— ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ฐพ์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

onKeyDown ์ด๋ฒคํŠธ๋Š” ์ž…๋ ฅ์ด ์ˆ˜์ •๋˜๊ธฐ ์ „์— ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ onChange ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ onKeyDown ๋Š” onChange ๋ณด๋‹ค onKeyUp ์—์„œ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ ๋ฌธ์ œ๋Š” keyDown ์—์„œ setCode ํ˜ธ์ถœ์‹œ ์ฒซ dispatchAction _Fiber_์— ์ƒˆ ๋ฌธ์ž์—†์ด memoizedState ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (๋ถ„๋ช…ํžˆ) ๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€ ๋  e . ๊ฒฐ๊ตญ ์ƒˆ ๋ฌธ์ž๋ฅผ ์ž…๋ ฅ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ useEffect() _same queue_ ๋‚ด์—์„œ dispatchAction ๋‹ค์‹œ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€๋งŒ (ํ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ) ์—…๋ฐ์ดํŠธ ๋œ prop์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, ๊ทธ ๋•Œ 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])

์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ง์ด ๋˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ keydown ํ•ธ๋“ค๋Ÿฌ์˜ setTimeout์—์„œ setState ํ˜ธ์ถœ์„ ๋ž˜ํ•‘ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด React์˜ ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ธ์ง€ ์•„๋‹ˆ๋ฉด์ด ์˜ค๋ฅ˜๊ฐ€ ๊ฐœ๋ฐœ์ž ์ธก์—์„œ ๋” ํฐ ์‹ค์ˆ˜ ๋‚˜ ๋‚˜์œ ํŒจํ„ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰