7-1.À̺¥Æ®

¸®¾×Æ®ÀÇ À̺¥Æ®

À¥ ÆäÀÌÁö´Â ½ÇÇàÁß¿¡ »ç¿ëÀÚ¿Í »óÈ£ÀÛ¿ëÇϴµ¥ ¸¶¿ì½º µ¿ÀÛÀÌ ¾ÐµµÀûÀ¸·Î ¸¹°í °¡²û Űº¸µå·Î ÀԷµµ ÇÑ´Ù. ¶Ç ½ÇÇàÁß¿¡ Æ÷Ä¿½º°¡ À̵¿Çϰųª ¾Ö´Ï¸ÞÀÌ¼Ç ½ÃÀ۵Ǵ º¯È­µµ ¹ß»ýÇÑ´Ù. ÆäÀÌÁö»ó¿¡¼­ º¯È­°¡ ¹ß»ýÇÒ ¶§¸¶´Ù ºê¶ó¿ìÀú´Â À̺¥Æ®¸¦ ¹ß»ý½ÃÄÑ ¹ÝÀÀÇÒ ±âȸ¸¦ Á¦°øÇϸç À¥¾ÛÀº À̺¥Æ®¸¦ ÅëÇØ »ç¿ëÀÚÀÇ µ¿ÀÛÀ» ¾Ë¾Æ³»°í ó¸®ÇÑ´Ù.

¸®¾×Æ®µµ ÀÚ¹Ù½ºÅ©¸³Æ®·Î µ¿ÀÛÇÏ´Â ¶óÀ̺귯¸®¿©¼­ À̺¥Æ®¿¡ °ü·ÃµÈ 󸮴 ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ °æ¿ì¿Í º°¹Ý ´Ù¸£Áö ¾Ê´Ù. ±×·¯³ª ¸®¾×Æ®´Â °í¼öÁØÀÇ ¶óÀ̺귯¸®Àθ¸Å­ À̺¥Æ®¸¦ ´õ Áö´ÉÀûÀ¸·Î ó¸®ÇÏ´Â ÀåÄ¡°¡ ¸¶·ÃµÇ¾î ÀÖ´Ù. ¶Ç ÁÖ·Î JSX ¾È¿¡¼­ À̺¥Æ®¸¦ ¹Þ±â ¶§¹®¿¡ À̸§ ±ÔÄ¢°ú È£Ãâ ¹æ¹ý¿¡µµ ¾à°£ÀÇ Â÷À̰¡ ÀÖ´Ù.

 

¢ºÀ̺¥Æ®ÀÇ À̸§Àº ij¸ÖijÀ̽º·Î ÀÛ¼ºÇÑ´Ù. ÀÚ¹Ù½ºÅ©¸³Æ®¿¡¼­´Â ¸ðµÎ ¼Ò¹®ÀÚ·Î ½á onclickÀ¸·Î ÀûÁö¸¸ ¸®¾×Æ®¿¡¼­´Â onClickÀ¸·Î Àû´Â´Ù.

¢ºÀ̺¥Æ®¿¡´Â Çڵ鷯 ÇÔ¼ö¸¦ ÁöÁ¤Çϸç Äڵ带 Á÷Á¢ ÀÛ¼ºÇÏÁö ¾Ê´Â´Ù. onClick = { handleClick } ½ÄÀ¸·Î À̸§¸¸ Àû´Â´Ù.

¢ºÀ̺¥Æ®¸¦ °³º° ¿¤¸®¸ÕÆ®¿¡ µî·ÏÇÏÁö ¾Ê°í ÃÖ»óÀ§ÀÇ ·çÆ®¿¡ µî·ÏÇÑ´Ù. °³º° ¿¤¸®¸ÕÆ®´Â Á÷Á¢ À̺¥Æ®¸¦ ó¸®ÇÏÁö ¾Ê°í ·çÆ®¿¡°Ô À§ÀÓÇÑ´Ù.

¢º°¢ À̺¥Æ®´Â Ŭ¸¯ÇÑ ¹öư, ÀÔ·ÂÇÑ Å° µî ¹ß»ýÇÑ »ç°Ç¿¡ ´ëÇÑ Ãß°¡ Á¤º¸¸¦ Àμö·Î º¸³»ÁØ´Ù. ¸®¾×Æ®´Â ÀÌ ¸ðµç Á¤º¸¸¦ Æ÷ÇÔÇÏ´Â ÇÕ¼º À̺¥Æ® °´Ã¼¸¦ »ý¼ºÇÏ¿© Àü´ÞÇÑ´Ù.

 

¹ß»ý °¡´ÉÇÑ À̺¥Æ®ÀÇ Á¾·ùµµ ÀÚ¹Ù½ºÅ©¸³Æ®¿Í °ÅÀÇ ºñ½ÁÇÏ´Ù. À̺¥Æ®¸¦ º¸³»´Â ÁÖü°¡ ºê¶ó¿ìÀúÀÌ´Ù º¸´Ï ¶óÀ̺귯¸®¶ó°í ÇØ¼­ ÀÌ ¸ñ·ÏÀÌ ´Þ¶óÁú ÀÌÀ¯´Â µüÈ÷ ¾ø´Ù.

 

À̺¥Æ® Á¾·ù

À̺¥Æ®

¸¶¿ì½º

onMouseDown, onMouseUp, onClick, onWheel

onMouseEnter, onMouseLeave, onMouseOver, onMouseOut

Űº¸µå

onKeyDown, onKeyUp

Æ÷Ä¿½º

onFocus, onBlur

½ºÅ©·Ñ

onScroll

Ŭ¸³º¸µå

onCopy, onCut, onPaste

µå·¡±× & µå·Ó

onDragStart, onDragEnter, onDragLeave, onDragEnd

onDragOver, onDrop

 

°¢ À̺¥Æ®ÀÇ ¹ß»ý ½ÃÁ¡Àº À̸§¿¡ Àß µå·¯³ª ÀÖ¾î »ó¼¼ÇÑ ¼³¸íÀº »ý·«ÇÑ´Ù. »ç½Ç À̺¥Æ®ÀÇ ÀÇ¹Ì¿Í »ç¿ë ¹æ¹ýÀº ÀÚ¹Ù½ºÅ©¸³Æ®¿¡¼­ ÀÌ¹Ì ¹è¿ì°í ¿Ô¾î¾ß ÇнÀ ¼ø¼­¿¡ ¸Â´Ù. À̺¥Æ® ó¸® ¼ø¼­¸¦ ÁöÁ¤ÇÏ´Â ¹öºí¸µ/ĸó¸µ, stopPropagation, preventDefault µîÀÇ ÇÔ¼ö´Â ÀÚ¹Ù½ºÅ©¸³Æ® ¼­ÀûÀ» Âü°íÇÏÀÚ.

À̺¥Æ® °´Ã¼

À̺¥Æ® ¹ß»ý½Ã Àü´ÞµÇ´Â Ãß°¡ Á¤º¸´Â ºê¶ó¿ìÀú¸¶´Ù ¹Ì¼¼ÇÏ°Ô ´Þ¶ó ¿¹ÀüºÎÅÍ È£È¯¼ºÀ» È®º¸Çϱ⠾î·Á¿ü´Ù. ½ÉÁö¾î °°Àº ºê¶ó¿ìÀú¶óµµ ¹öÀü¿¡ µû¶ó ´Þ¶óÁö´Ï °ñÄ¡ ¾ÆÇÁ°í ¿À¸¸ ²Ä¼ö¸¦ µ¿¿øÇØ¾ß Çß´Ù.

¸®¾×Æ®´Â ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ ¸ðµç Á¤º¸¸¦ Æ÷ÇÔÇÏ´Â ÇÕ¼º À̺¥Æ®(SyntheticEvent) °´Ã¼¸¦ Àü´ÞÇÑ´Ù. »õ·Î ¼³°èÇÑ °ÍÀÌÁö¸¸ ȣȯ¼ºÀÌ ¾î´À Á¤µµ´Â ÀÖ¾î ±âÁ¸ÀÇ ¾Ë°í ÀÖ´ø Áö½Ä´ë·Î »ç¿ëÇÏ¸é µÈ´Ù. ¸ÕÀú À̺¥Æ®¿¡ »ó°ü¾øÀÌ Àü´ÞµÇ´Â °øÅë ¸â¹öºÎÅÍ Á¤¸®ÇØ º¸ÀÚ.

 

¸â¹ö

¼³¸í

target

À̺¥Æ®°¡ ¹ß»ýÇÑ ¿¤¸®¸ÕÆ®

currentTarget

À̺¥Æ®°¡ µî·ÏµÈ ¿¤¸®¸ÕÆ®

timeStamp

À̺¥Æ® ¹ß»ý ½ÃÁ¡

nativeEvent

ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ À̺¥Æ® °´Ã¼¿¡ ´ëÇÑ ·¡ÇÎ °´Ã¼. ¸®¾×Æ®°¡ Á¦°øÇÏÁö ¾Ê´Â Àμö´Â ÀÌ ¸â¹ö¸¦ ÅëÇØ Á¶»çÇÑ´Ù.

bubbles

À̺¥Æ®°¡ ¹öºí¸µµÇ´ÂÁö ¿©ºÎ. trueÀ̸é ÀÚ½ÄÀÌ À̺¥Æ®¸¦ ¸ÕÀú ¹Þ´Â´Ù.

eventPhase

À̺¥Æ® ó¸® ´Ü°è. 0ÀÌ¸é ¹Ìó¸®À̰í 1À̸é ĸó, 2¸é Ÿ°Ù, 3ÀÌ¸é ¹öºí¸µÁßÀÌ´Ù.

cancelable

preventDefault ¸Þ¼­µå·Î 󸮸¦ Áß´ÜÇÒ ¼ö ÀÖ´ÂÁö Á¶»çÇÑ´Ù.

defaultPrevented

preventDefault·Î 󸮸¦ Áß´ÜÇß´ÂÁö Á¶»çÇÑ´Ù.

isTrusted

À̺¥Æ®°¡ »ç¿ëÀÚ¿¡ ÀÇÇØ ¹ß»ýÇß´ÂÁö Á¶»çÇÑ´Ù.

type

¹ß»ýÇÑ À̺¥Æ®ÀÇ Á¾·ù. click, change µî

 

ÀÌ Á¤º¸Áß °¡Àå ÈçÇÏ°Ô »ç¿ëµÇ´Â ¸â¹ö´Â targetÀÌ´Ù. À̺¥Æ®°¡ ¹ß»ýÇÑ ¿¤¸®¸ÕÆ®, Áï ű׿¡ ´ëÇÑ ÂüÁ¶Àε¥ À̷κÎÅÍ Å±×ÀÇ id³ª ÇöÀç°ªÀ» Á¶»çÇÑ´Ù. ´ÙÀ½Àº Űº¸µå °ü·Ã À̺¥Æ®ÀÇ ¸â¹öÀÌ´Ù. ´©¸¥ Ű¿Í Á¶ÇÕŰÀÇ »óŸ¦ º¸¿©ÁØ´Ù.

 

¸â¹ö

¼³¸í

key

´©¸¥ ŰÀÇ °ª

ctrlKey

Ctrl ۸¦ ´©¸£°í ÀÖÀ¸¸é true

altKey

Alt ۸¦ ´©¸£°í ÀÖÀ¸¸é true

shiftKey

Shift ۸¦ ´©¸£°í ÀÖÀ¸¸é true

metaKey

Win(¸ÆÀº Command) ۸¦ ´©¸£°í ÀÖÀ¸¸é true

 

´ÙÀ½Àº ¸¶¿ì½º °ü·Ã À̺¥Æ®ÀÇ ¸â¹öÀÌ´Ù. Űº¸µå Á¶ÇÕŰÀÇ »óŸ¦ ¾Ë·ÁÁÖ´Â ¸â¹ö´Â ¸¶¿ì½º À̺¥Æ®¿¡¼­µµ À¯È¿ÇÏ´Ù.

 

¸â¹ö

¼³¸í

button

¾î¶² ¹öưÀ» ´­·¶´ÂÁö ¾Ë·Á ÁØ´Ù. 0Àº ¿ÞÂÊ, 1Àº Áß¾Ó, 2´Â ¿À¸¥ÂÊ ¹öưÀÌ´Ù.

buttons

µÎ °³ ÀÌ»óÀÇ ¹öưÀ» ´­·¶À» ¶§ÀÇ ÇÕÀ» Á¶»çÇÑ´Ù. 1Àº ¿ÞÂÊ, 2´Â ¿À¸¥ÂÊ, 4´Â °¡¿îµ¥ ¹öưÀÌ´Ù.

screenX, Y

È­¸é»óÀÇ ÁÂÇ¥

clientX, Y

ºê¶ó¿ìÀú»óÀÇ ÁÂÇ¥

pageX, Y

ÆäÀÌÁö»óÀÇ ÁÂÇ¥

movementX, Y

Á÷Àü À̺¥Æ®¿ÍÀÇ À̵¿°Å¸®

 

À̺¥Æ®¸¦ Àß È°¿ëÇÏ·Á¸é ¾ðÁ¦ ¾î¶² À̺¥Æ®°¡ ¹ß»ýÇÏ´ÂÁö, À̺¥Æ®¿¡¼­ ÂüÁ¶ÇÒ ¼ö ÀÖ´Â Àμö¿¡´Â ¾î¶² °ÍÀÌ ÀÖ´ÂÁö¸¦ Àß ¾Ë¾Æ¾ß ÇÑ´Ù. ÀÌ·± Á¤º¸´Â ·¹ÆÛ·±½º¿¡ Á¤¸®µÇ¾î ÀÖÁö¸¸ È®½ÇÇÑ °ÍÀº ¿¹Á¦¸¦ ¸¸µé¾î Á÷Á¢ Âï¾î º¸´Â °ÍÀÌ´Ù.

´ÙÀ½ ¿¹Á¦´Â h2 ¿¤¸®¸ÕÆ®¿¡ ´ëÇØ ¸¶¿ì½º À̺¥Æ®¸¦ ¹Þ°í input ¿¤¸®¸ÕÆ®¿¡ ´ëÇØ Űº¸µå À̺¥Æ®¸¦ ¹Þ¾Æ ¾î¶² Á¤º¸°¡ Àü´ÞµÇ´ÂÁö ·Î±×â¿¡ ´ýÇÁÇÑ´Ù. °¡Àå ±âº»ÀûÀÎ µÎ °³ÀÇ À̺¥Æ®¸¦ ¿¬±¸ÇØ º¸´Âµ¥ °°Àº ¹æ½ÄÀ¸·Î ´Ù¸¥ À̺¥Æ®µµ ¿¬±¸ÇØ º¼ ¼ö ÀÖ´Ù.

 

function App() {

  function h2Click(e) {

    console.log(`Ŭ¸¯ : ID=${e.target.id}, ¹öºí=${e.bubbles}`)

  }

 

  function h2Down(e) {

    console.log(`´Ù¿î : ºê¶ó¿ìÀú=(${e.clientX}, ${e.clientY}), È­¸é=(${e.screenX}, ${e.screenY})`)

  }

 

  function h2Up(e) {

    console.log(`¾÷ : ÅÂ±× ÁÂÇ¥ = (${e.nativeEvent.offsetX}, ${e.nativeEvent.offsetY})`)

  }

 

  function inKeyDown(e) {

    console.log(`Ű ´©¸§ : Ű =${e.key}, ½Ã°£=${e.timeStamp}`)

  }

 

  function inKeyUp(e) {

    console.log(`Ű ³õÀ½ : Ctrl = ${e.ctrlKey}, Alt = ${e.altKey}, Shift = ${e.shiftKey}`)

  }

 

  return (

    <>

      <h2 id ="head" onClick={h2Click} onMouseDown={h2Down} onMouseUp={h2Up}>

        Ŭ¸¯Çϼ¼¿ä.

      </h2>

      <input id ="name" onKeyDown={inKeyDown} onKeyUp={inKeyUp} />

    </>

  )

}

 

½ÇÇàÇØ ³õ°í ¸¶¿ì½º·Î h2¸¦ Ŭ¸¯ÇØ º¸°í input¿¡ ۸¦ ´­·¯ º¸ÀÚ. ¸¶¿ì½º¸¦ ´­·¶À» ¶§ÀÇ ÁÂÇ¥, ۸¦ ´­·¶À» ¶§ ´­·¯Áø Ű¿¡ ´ëÇÑ Á¤º¸ µîÀ» º¼ ¼ö ÀÖ´Ù.

À¥ ¾ÛÀº ÀÌ Á¤º¸¸¦ ÅëÇØ Ŭ¸¯ÇÑ ÁÂÇ¥³ª ÀÔ·ÂÇÑ Å°¿¡ µû¶ó ÇÊ¿äÇÑ Ã³¸®¸¦ ¼öÇàÇÑ´Ù. ÀÌ·± ½ÄÀ¸·Î ¿¹Á¦¸¦ ÀÛ¼ºÇØ °´Ã¼¸¦ ´ýÇÁÇØ º¸¸é 󸮰¡ ÇÊ¿äÇÑ ½ÃÁ¡°ú À̶§ »ç¿ëÇÒ ¼ö ÀÖ´Â Á¤º¸¸¦ Á¤È®È÷ ÆÄ¾ÇÇÒ ¼ö ÀÖ´Ù.

¾Õ ½Ç½À¿¡¼­ ÀÌ¹Ì ¸¶¿ì½º Ŭ¸¯ À̺¥Æ®ÀÎ onClick¿¡ ¹ÝÀÀÇÏ¿© Ä«¿îÆ®¸¦ Áõ°¡½ÃŰ°Å³ª ŸÀ̸Ӹ¦ ½ÃÀÛ/ÁßÁöÇÏ´Â ¿¹Á¦¸¦ ¸¸µé¾î º¸¾Ò´Ù. Ä«¿îÆ®¸¦ 1 Áõ°¡½ÃŰ´Â Äڵ带 ´Ù½Ã º¸ÀÚ.

 

function increase() { setCount(count + 1) }

<button onClick={increase}>Áõ°¡</button>

 

À̺¥Æ® À̸§ÀÌ onclickÀÌ ¾Æ´Ñ onClickÀÌ´Ù. ¶Ç Çڵ鷯ÀÇ À̸§¸¸ ÁöÁ¤Çϸç {increase()} ½ÄÀ¸·Î È£ÃâÇÏÁö ¾Ê´Â´Ù´Â Á¡À» ºÐ¸íÈ÷ ¾Ë ¼ö ÀÖ´Ù. Ŭ¸¯Àº ´­·¶´Ù ¶¼´Â ´Ü¼øÇÑ µ¿ÀÛÀ̾ Çڵ鷯·Î Ŭ¸¯ »ç½Ç¸¸ ÅëÁö ¹ÞÀ¸¸é µÈ´Ù. ¹öưÀÇ °¡¿îµ¥¸¦ ´©¸£³ª °¡ÀåÀÚ¸®¸¦ ´©¸£³ª ¶È°°Àº Ŭ¸¯À̾ ±¸ºÐÇÒ Çʿ䰡 ¾ø´Ù.

±×·¯³ª ¶È°°Àº µ¿ÀÛÀÌ¶óµµ »ç¿ëÀÚÀÇ ±¸Ã¼ÀûÀÎ µ¿ÀÛÀ̳ª ½Ã½ºÅÛÀÇ ÇöÀç »óȲ µîÀÇ Ãß°¡ Á¤º¸°¡ ÇÊ¿äÇϸé À̺¥Æ® °´Ã¼¸¦ ¹Þ¾Æ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î À̹ÌÁöÀÇ ¾î´À ºÎºÐÀ» ´­·¶´ÂÁö, Ŭ¸¯ÇßÀ» ¶§ Űº¸µå Á¶ÇÕŰÀÇ »óÅ´ ¾î¶®´ÂÁö¿¡ µû¶ó 󸮸¦ ´Þ¸® ÇÏ°í ½ÍÀ» ¶§ÀÌ´Ù. ´ÙÀ½ ¿¹Á¦´Â h2 ¿¤¸®¸ÕÆ®¸¦ Ŭ¸¯ÇÒ ¶§ Shift ŰÀÇ »óÅ¿¡ µû¶ó ´Ù¸¥ µ¿ÀÛÀ» ÇÑ´Ù.

 

function App() {

 

  function handleClick(e) {

    if (e.shiftKey) {

      alert('Shift Ŭ¸¯');

    } else {

      alert('±×³É Ŭ¸¯');

    }

  }

 

  return (

    <>

      <h2 onClick = {handleClick}>Ŭ¸¯Çϼ¼¿ä</h2>

    </>

  );

}

 

Çڵ鷯´Â À̺¥Æ® °´Ã¼ e¸¦ Àμö·Î ¹ÞÀ¸¸ç e.shiftKeyÀÇ °ªÀ» Àоî Ŭ¸¯ ¹ß»ý ½ÃÁ¡ÀÇ ShiftŰ »óŸ¦ ¾Ë¾Æ³½´Ù. À̺¥Æ® °´Ã¼¿¡´Â ½Ç¿ëÀûÀ¸·Î Âü°íÇÒ¸¸ÇÑ ¸ðµç Á¤º¸°¡ ´Ù Æ÷ÇԵǾî ÀÖ¾î »óȲ¿¡ µû¶ó À̺¥Æ®¸¦ ´Ù¸£°Ô ó¸®ÇÒ ¼ö ÀÖ´Ù.

ÇÕ¼º À̺¥Æ® °´Ã¼¶ó°í ÇØ¼­ ¸ðµç Á¤º¸°¡ ´Ù Æ÷ÇԵǾî ÀÖ´Â °ÍÀº ¾Æ´Ï¸ç ÁÖ·Î ¸¹ÀÌ »ç¿ëÇÏ´Â Á¤º¸¸¸ Àü´ÞÇÑ´Ù. ÀÚ¹Ù½ºÅ©¸³Æ®¿¡´Â Ŭ¸¯ÇÑ Å±׳»ÀÇ ÁÂÇ¥¸¦ Á¶»çÇÏ´Â offsetX, offsetY °ªÀÌ ÀÖ´Ù. ´ÙÀ½ ½ºÅ©¸³Æ® ¿¹Á¦´Â Çì´õÀÇ Á»ó´Ü ±âÁØÀ¸·Î ¾îµðÂëÀ» ´­·¶´ÂÁö ´ëÈ­»óÀÚ·Î Ãâ·ÂÇÑ´Ù.

 

¿¹Á¦ : offsetxy.html

<!DOCTYPE html>

<html>

<head>

  <meta charset="UTF-8">

  <title>onlyscript</title>

</head>

 

<body>

  <h1 id="header">Ŭ¸¯Çϼ¼¿ä</h1>

  <script>

    let header = document.getElementById("header");

    header.onclick = function(e) {

      alert(`ű׳» ÁÂÇ¥ = (${e.offsetX}, ${e.offsetY})`);

    }

</script>

</html>

 

±×·¯³ª ¸®¾×Æ®ÀÇ À̺¥Æ® °´Ã¼¿¡´Â ÀÌ Á¤º¸°¡ ºüÁ® ÀÖ´Ù. ´ë½Å ¿ø·¡ ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ À̺¥Æ® °´Ã¼¸¦ nativeEvent·Î Á¦°øÇϹǷΠÀÌ °´Ã¼ÀÇ ¼Ó¼ºÀ» ÀÐÀ¸¸é µÈ´Ù. ¹» ÁÁ¾ÆÇÒÁö ¸ô¶ó ÀÌ°Í Àú°Í ´Ù ³Ö¾î ³õÀº °ÍÀÌ´Ù. »ç½Ç ÀÌ Á¤º¸¸¦ »ç¿ëÇÒ ÀÏÀº °ÅÀÇ ¾ø´Âµ¥ ²À ÇÊ¿äÇÏ´Ù¸é ¾µ ¼ö´Â ÀÖ´Ù. °°Àº µ¿ÀÛÀ» ÇÏ´Â ¸®¾×Æ® ¿¹Á¦¸¦ ¸¸µé¾î º¸°í Â÷ÀÌÁ¡À» ¿¬±¸ÇØ º¸ÀÚ.

 

function App() {

 

  function handleClick(e) {

    alert(`ű׳» ÁÂÇ¥ = (${e.nativeEvent.offsetX}, ${e.nativeEvent.offsetY})`);

  }

 

  return (

    <>

      <h1 id="header" onClick = {handleClick}>Ŭ¸¯Çϼ¼¿ä</h1>

    </>

  );

}

 

e.offsetX°¡ ¾Æ´Ñ e.nativeEvent.offsetX¸¦ Àд´ٴ Á¡À» À¯ÀÇÇÏÀÚ. ÀÚ¹Ù½ºÅ©¸³Æ®°¡ Á¦°øÇÏ´Â ¿ø·¡ °´Ã¼µµ Àü´ÞÇØ ÁֹǷΠ¿¹Àü¿¡ °¡´ÉÇß´ø Äڵ带 ¸®¾×Æ®¿¡¼­µµ Ȱ¿ëÇÒ ¼ö ÀÖ´Ù.

À̺¥Æ® À§ÀÓ

Shift °ËÃâ ¿¹Á¦¸¦ ´Ù½Ã Á¡°ËÇØ º¸ÀÚ. À̺¥Æ®¸¦ ÁöÁ¤ÇÒ ¶§´Â onClick = {handleClick}À¸·Î À̸§¸¸ ÁöÁ¤Çߴµ¥ Çڵ鷯´Â handleClick(e)·Î µÇ¾î ÀÖ¾î À̺¥Æ® °´Ã¼ e¸¦ Àü´Þ¹Þ´Â´Ù. È£ÃâÇÒ ¶§ ÁÖÁöµµ ¾ÊÀº Àμö¸¦ Çڵ鷯°¡ ¾î¶»°Ô ¹Þ´Â °ÍÀϱî? ÀÌ°Ô °¡´ÉÇÑ ÀÌÀ¯´Â ¸®¾×Æ®°¡ À̺¥Æ®¸¦ ÃÖ»óÀ§ ¿ä¼ÒÀÎ ·çÆ®¿¡°Ô À§ÀÓÇϱ⠶§¹®ÀÌ´Ù.

¸®¾×Æ®ÀÇ À̺¥Æ® ÁöÁ¤¹®Àº DOM ³ëµå¿¡ Çڵ鷯¸¦ Á÷Á¢ ºÙÀÌÁö ¾Ê´Â´Ù. ´ë½Å ÃÖ»óÀ§ ¿ä¼ÒÀÎ document¿¡ ¸®½º³Ê¸¦ ¼³Ä¡ÇØ ³õ°í ¸ðµç À̺¥Æ®¸¦ ¸ð¾Æ¼­ ó¸®ÇÑ´Ù. À̺¥Æ®°¡ ÀÚ½Ä ¿¤¸®¸ÕÆ®¿¡¼­ ¹ß»ýÇÏ´õ¶óµµ Á÷Á¢ ó¸®ÇÏÁö ¾Ê°í ¹öºí¸µµÇ¾î ¸®½º³Ê·Î Àü´ÞµÈ´Ù. Áï, ¸ðµç À̺¥Æ®´Â ¸®½º³Ê°¡ ¹Þµµ·Ï À§ÀÓÇÑ´Ù.

¸®½º³Ê´Â ³×ÀÌÆ¼ºê À̺¥Æ®¸¦ ¹Þ¾Æ Ÿ°Ù¿¡ ¸Â´Â À̺¥Æ® °´Ã¼¸¦ »õ·Î ÇÕ¼ºÇÏ¿© Çڵ鷯·Î Àü´ÞÇÑ´Ù. Çڵ鷯´Â ÇÕ¼º À̺¥Æ® °´Ã¼¿¡¼­ ¿øÇÏ´Â Á¤º¸¸¦ Á¶»çÇÏ¿© ¸¶Ä¡ Ÿ°ÙÀÌ Á÷Á¢ À̺¥Æ®¸¦ ¹ÞÀº °Íó·³ ó¸®ÇÑ´Ù. ÀÌ·± ±¸Á¶·Î µÇ¾î Àֱ⠶§¹®¿¡ Çڵ鷯´Â ¹«Á¶°Ç À̺¥Æ® °´Ã¼ e¸¦ ¹ÞÀ» ¼ö ÀÖ´Ù.

À̺¥Æ® °´Ã¼¿¡´Â ´©°¡ ¹ÞÀº À̺¥Æ®ÀÎÁö ¾Ë·Á ÁÖ´Â target Á¤º¸°¡ Æ÷ÇԵǾî ÀÖ´Ù. ÀÌ Á¤º¸¸¦ Ȱ¿ëÇÏ¸é ¿©·¯ ¿ä¼Ò°¡ Çڵ鷯 Çϳª¸¦ °øÀ¯Çϰí target¿¡ µû¶ó 󸮸¦ ´Ù¸£°Ô ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â ¼¼ °³ÀÇ h3 ¿¤¸®¸ÕÆ®°¡ Ŭ¸¯ Çڵ鷯¸¦ °øÀ¯ÇÑ´Ù.

 

function App() {

 

  function handleClick(e) {

    alert(`${e.target.innerText}¸¦ Ŭ¸¯Çß½À´Ï´Ù.`);

  }

 

  return (

    <>

      <h3 onClick = {handleClick}>ù°</h3>

      <h3 onClick = {handleClick}>µÑ°</h3>

      <h3 onClick = {handleClick}>¼Â°</h3>

    </>

  );

}

 

°°Àº Çڵ鷯¸¦ °øÀ¯ÇÏÁö¸¸ Çڵ鷯 ³»ºÎ¿¡¼­ Àд e.target.innerText°¡ ´Þ¶ó Ŭ¸¯ÇÑ ¿ä¼Ò¿¡ µû¶ó 󸮸¦ ´Þ¸®ÇÒ ¼ö ÀÖ´Ù. ´ëºÎºÐÀÇ Ã³¸®°¡ °°°í ÀϺθ¸ ´Ù¸¦ ¶§´Â ºñ½ÁÇÑ Çڵ鷯¸¦ µû·Î ¸¸µé ÇÊ¿ä¾øÀÌ ÅëÇÕÇÏ´Â °ÍÀÌ °£ÆíÇÏ´Ù.

À̺¥Æ® À§ÀÓ ¹æ½ÄÀº À̺¥Æ® °´Ã¼¸¦ ¾Ë¾Æ¼­ Àü´ÞÇØ ÁֹǷΠÆí¸®ÇÏ´Ù. ±×·¯³ª Çڵ鷯¿¡ Ãß°¡ÀûÀÎ Àμö¸¦ Àü´ÞÇÏ´Â °ÍÀº Á» º¹ÀâÇÏ´Ù. ÀÌ·± ±â¹ýÀÌ ÇÊ¿äÇÑ °æ¿ì´Â ¸¹Áö ¾ÊÀ¸¹Ç·Î °£´ÜÇÏ°Ô ¿¹Á¦¸¸ º¸ÀδÙ.

 

function App() {

 

  function handleClick(e, fruit) {

    alert(`${e.target.innerText}´Â ${fruit}¸¦ ÁÁ¾ÆÇÕ´Ï´Ù.`);

  }

 

  return (

    <>

      <h3 onClick = {(e) => handleClick(e, '»ç°ú')}>ù°</h3>

      <h3 onClick = {(e) => handleClick(e, 'µþ±â')}>µÑ°</h3>

      <h3 onClick = {(e) => handleClick(e, 'Æ÷µµ')}>¼Â°</h3>

    </>

  );

}

 

À̺¥Æ® °´Ã¼ ¿ÜÀÇ Àμö¸¦ ´õ Ãß°¡ÇÏ·Á¸é Çڵ鷯¸¦ È£ÃâÇϸ鼭 Àμö¸¦ Àü´ÞÇÏ´Â ±¸¹®À» »ç¿ëÇØ¾ß ÇÑ´Ù. ±×·¯³ª ¸®¾×Æ®ÀÇ À̺¥Æ®´Â Çڵ鷯¸¦ ÁöÁ¤ÇÏ´Â Çü½ÄÀ̸ç È£ÃâÇÏ´Â Çü½ÄÀÌ ¾Æ´Ï¾î¼­ ´ÙÀ½ ÄÚµå´Â ¾ÈµÈ´Ù.

 

<h3 onClick = {handleClick(e, '»ç°ú')}>ù°</h3>

 

´ë½Å ÀÌ Çڵ鷯¸¦ È£ÃâÇÏ´Â À͸í ÇÔ¼ö¸¦ ÀÛ¼ºÇØ¾ß ÇÑ´Ù. À̸§ÀÌ ¾ø¾îµµ ¾î·°Å³ª Çڵ鷯¸¦ È£ÃâÇÑ°Ô ¾Æ´Ï¶ó À͸í Çڵ鷯¸¦ ÁöÁ¤ÇÏ´Â °ÍÀ̹ǷΠÀÌ°Ç ±¦Âú´Ù. À͸í Çڵ鷯´Â À̺¥Æ® °´Ã¼¸¦ Àμö·Î ¹Þ¾Æ Çڵ鷯·Î Àü´ÞÇϸ鼭 ±× ¿ÜÀÇ Àμö¸¦ Ãß°¡·Î ´õ Àü´ÞÇÑ´Ù.

¸®¾×Æ®°¡ À̺¥Æ® °´Ã¼ Çϳª´Â ÀÚµ¿À¸·Î Àü´ÞÇØ ÁÖÁö¸¸ »ç¿ëÀÚ°¡ Á¤ÀÇÇÑ Àμö±îÁö Àü´ÞÇÒ ¼ö´Â ¾ø´Ù. À̺¥Æ® °´Ã¼ ¿ÜÀÇ Ãß°¡ Àμö´Â °³¼ö¿¡ »ó°ü¾øÀÌ ¼öµ¿À¸·Î Á÷Á¢ Àü´ÞÇÒ ¼ö ÀÖ´Ù. Ÿ°Ù¸¶´Ù ´Þ¶óÁö´Â ³»¿ëÀº Àμöº¸´Ù ÄÄÆ÷³ÍÆ®ÀÇ ¼Ó¼º¿¡ Æ÷ÇÔ½ÃÄÑ µÎ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù.

Űº¸µå ÀÔ·Â

Űº¸µå ÀÔ·ÂÀº Æ÷Ä¿½º¸¦ °¡Áø ÄÁÆ®·Ñ¿¡°Ô ¹ß»ýÇϴµ¥ ÁÖ·Î input ÄÁÆ®·ÑÀÌ´Ù. ¸Å ۸¦ ´©¸¦ ¶§¸¶´Ù onKeyUp, onKeyDown À̺¥Æ®°¡ ¹ß»ýÇÏ¸ç ¿©±â¼­ À̺¥Æ® °´Ã¼ÀÇ key ¸â¹ö¸¦ ÀÐÀ¸¸é ¾î¶² ۸¦ ´­·¶´ÂÁö ¾Ë ¼ö ÀÖ´Ù. ÀÔ·ÂÇÑ Å° Á¤º¸´Â À¯È¿¼º °Ë»ç¿¡ ÁÖ·Î »ç¿ëÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â ¼ýÀÚ¸¸ ÀԷ¹ÞÀ¸¸ç ±× ¿ÜÀÇ ¹®ÀÚ´Â °æ°í ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù. Á¡¼ö³ª ³ªÀ̶ó¸é ¼ýÀÚ¸¸ ÀÔ·Â¹Þ¾Æ¾ß ÇÑ´Ù.

 

function App() {

  function inKeyDown(e) {

    if (Number.isInteger(Number(e.key)) == false) {

      alert('¼ýÀÚ¸¸ ÀÔ·ÂÇϼ¼¿ä.');

      e.preventDefault();

    }

  }

 

  return (

    <>

      <input id ="score" onKeyDown={inKeyDown} />

    </>

  )

}

 

e.key·Î Àü´ÞµÈ ¹®ÀÚ¸¦ ¼ýÀÚ·Î ¹Ù²ã º¸°í Á¤¼ö°¡ ¸Â´ÂÁö Á¡°ËÇÑ´Ù. ¸ÂÀ¸¸é ¾Æ¹« Àϵµ ÀϾÁö ¾Ê°í Ʋ¸®¸é ¿¡·¯ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇϰí preventDefault ¸Þ¼­µå¸¦ È£ÃâÇÏ¿© À̺¥Æ® 󸮸¦ ÁßÁöÇØ ¹ö¸°´Ù. ÀÌ·¯¸é ¸¶Áö¸· ÀÔ·ÂÇÑ ¹®ÀÚ´Â °ÅºÎµÈ´Ù.

inputÀº ÀÔ·ÂÀ» ¹Þ´Â °¡Àå ±âº»ÀûÀÎ ¿¤¸®¸ÕÆ®ÀÌ¸ç ³»¿ëÀÌ ¹Ù²ð ¶§¸¦ ó¸®ÇØ¾ß ÇÒ °æ¿ì°¡ ¸¹´Ù. ÀÚ¹Ù½ºÅ©¸³Æ®´Â input ű׿¡ ´ëÇØ 2°³ÀÇ À̺¥Æ®¸¦ Á¦°øÇϴµ¥ ¹ß»ý ½ÃÁ¡À» Àß ±¸ºÐÇØ¾ß ÇÑ´Ù.

 

¢ºoninput : ³»¿ëÀÌ ¹Ù²ð ¶§¸¶´Ù Àü´ÞµÈ´Ù.

¢ºonchange : ÆíÁýÀ» ¿Ï·áÇÏ°í Æ÷Ä¿½º¸¦ ÀÒÀ» ¶§ Àü´ÞµÈ´Ù.

 

´ÙÀ½ ¿¹Á¦·Î È®ÀÎÇØ º¸ÀÚ. ÀÔ·ÂÇÒ ¶§¸¶´Ù input À̺¥Æ®°¡ ¹ß»ýÇϰí tab۸¦ ´­·¯ Æ÷Ä¿½º¸¦ ÀÒÀ» ¶§¸¸ change À̺¥Æ®°¡ ¹ß»ýÇÑ´Ù.

 

¿¹Á¦ : editevent.html

<!DOCTYPE html>

<html>

<head>

  <meta charset="UTF-8">

  <title>onlyscript</title>

</head>

<body>

<input id ="score" />

  <script>

    let score = document.getElementById("score");

      score.onchange = function(e) {

      console.log("change : " + e.target.value);

    }

    score.oninput = function(e) {

      console.log("input : " + e.target.value);

    }

  </script>

</body>

</html>

 

¸®¾×Æ®ÀÇ input ÄÄÆ÷³ÍÆ®¿¡¼­ onChange´Â ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ onchange¿Í Àǹ̰¡ ¾à°£ ´Ù¸£´Ù. ¸Å ÀԷ½ø¶´Ù ¹ß»ýÇϸç ÇѱÛÀÚ¶óµµ ¹Ù²î¸é À̺¥Æ®¸¦ º¸³» ÁÖ´Â ½ÄÀ̶ó ¹ß»ý ºóµµ°¡ ³ô´Ù. ÀÚ¹Ù½ºÅ©¸³Æ®¿Í ´ëºÎºÐ ºñ½ÁÇÏÁö¸¸ ¾à°£ ´Ù¸£°Ô µ¿ÀÛÇÏ´Â °æ¿ìµµ ÀÖ´Ù.

¸Å ±ÛÀÚ¸¦ ÀÔ·ÂÇÒ ¶§¸¶´Ù À̺¥Æ®¸¦ ¹Þ°í ½ÍÁö´Â ¾Ê°í ÀÔ·Â ¿Ï·á ÈÄ¿¡ Çѹø¸¸ ÀÐ°í ½Í´Ù¸é Æ÷Ä¿½º¸¦ ÀÒÀ» ¶§ ¹ß»ýÇÏ´Â onBlur À̺¥Æ®¸¦ Ȱ¿ëÇÑ´Ù. À§ ¿¹Á¦¿Í ºñ½ÁÇÏ°Ô µ¿ÀÛÇÏ´Â ¸®¾×Æ® ¿¹Á¦´Â ´ÙÀ½°ú °°´Ù.

 

function App() {

  function inChange(e) {

    console.log("change : " + e.target.value)

  }

 

  function inBlur(e) {

    console.log("blur : " + e.target.value)

  }

 

  return (

    <>

      <input id ="score" onChange={inChange} onBlur={inBlur} />

    </>

  )

}

 

ÀÌ ÁöÁ¡¿¡¼­ ¸®¾×Æ®°¡ ¿Ö Ç¥ÁØ ÀÚ¹Ù½ºÅ©¸³Æ®¿Í À̺¥Æ®ÀÇ ¹ß»ý ½ÃÁ¡À» ±»ÀÌ ´Ù¸£°Ô ó¸®Çϰí ÀÖ´ÂÁö, ¾î¶² ¼Ó»çÁ¤ÀÌ ÀÖ´ÂÁö ¿¬±¸ÇØ º¸ÀÚ. onChange°¡ ÆíÁý³¡ÀÌ ¾Æ´Ñ ¼öÁ¤½Ã¸¶´Ù ¹ß»ýÇϵµ·Ï Àǹ̸¦ ¹Ù²Û ÀÌÀ¯´Â ¿©·¯ °¡Áö°¡ ÀÖ´Ù.

 

¢º¸®¾×Æ®´Â »óŰ¡ ¹Ù²î¸é UIµµ ½Ç½Ã°£À¸·Î ¹Ù²îµµ·Ï ÇÏ°í ½Í¾ú´Ù.

¢º¸Å ÆíÁý¸¶´Ù À¯È¿¼º °Ë»ç¸¦ ¼öÇàÇÏ¿© Á¤È®ÇÑ Á¤º¸¸¦ ÀÔ·ÂÇϵµ·Ï À¯µµÇÑ´Ù.

¢ºÀÚµ¿ ¿Ï¼º ±â´ÉÀ» ±¸ÇöÇϱ⠽±´Ù.

¢º°ú°Å¿¡ ºñÇØ ÄÄÇ»ÅÍ ¼º´ÉÀÌ Çâ»óµÇ¾î ¸Å¹ø À̺¥Æ®¸¦ º¸³»µµ ¹«¸®°¡ ¾ø´Ù.

 

ÀÌÀ¯¸¦ µé¾î º¸¸é ÇÕ´çÇÑ ±Ù°Å´Â ºÐ¸íÈ÷ ÀÖ´Ù. ±×·¯³ª ±×·¸´Ù Ä¡´õ¶óµµ Ç¥ÁØ¿¡ ¸Å ¼öÁ¤½Ã¸¶´Ù ¹ß»ýÇÏ´Â onInput À̺¥Æ®°¡ ÀÌ¹Ì Àִµ¥ ±»ÀÌ onChangeÀÇ Àǹ̸¦ ¹«¸®ÇÏ°Ô ¹Ù²Ü ÇÊ¿ä±îÁö´Â ¾øÁö ¾Ê¾ÒÀ»±î? ¿©±â¿¡´Â ¶Ç ´Ù¸¥ º¹ÀâÇÑ »çÁ¤ÀÌ ÀÖ´Ù.

onInput À̺¥Æ®°¡ Ç¥ÁØ¿¡ ºÐ¸íÈ÷ ÀÖÁö¸¸ °ú°ÅÀÇ ´À¸° ÄÄÇ»ÅÍ¿¡¼­´Â ¾öû³­ ºÎÇϸ¦ ÀÏÀ¸ÄÑ Áö¿øÇÏÁö ¾Ê´Â ºê¶ó¿ìÀú°¡ ¸¹¾Ò´Ù. ¼³»ç Áö¿øÇÏ´õ¶óµµ ÄÁÆ®·Ñ¿¡ µû¶ó µ¿ÀÛ ¹æ½ÄÀÌ ¹Ì¼¼ÇÏ°Ô ´Þ¶ú´Ù. ÀÌ·± ½ÄÀÌ´Ï ±× ´ç½ÃÀÇ °³¹ßÀÚ°¡ ¸Å ÆíÁý½ÃÁ¡À» Àâ¾Æ ³»´À¶ó ¾ó¸¶³ª °³°í»ýÀ» ÇßÀ»Áö ÁüÀÛÀÌ µÈ´Ù.

¸®¾×Æ® ÆÀÀº ÀÌ·± »óȲÀ» Àϰſ¡ ÇØ¼ÒÇϱâ À§ÇØ onChangeÀÇ Àǹ̸¦ ¹Ù²Ù´Â ÇÑÀÌ ÀÖ´õ¶óµµ ÀϰüµÈ µ¿ÀÛÀ» ±¸ÇöÇÏ°í ½Í¾ú°í ±× °á°ú Ç¥Áذú´Â ¾à°£ ´Þ¶óÁø °ÍÀÌ´Ù. »ç½Ç ¸®¾×Æ®´Â ÀÚ¹Ù½ºÅ©¸³Æ®¿Í´Â ´Ù¸¥ °³¹ß ȯ°æÀ̹ǷΠÀ̺¥Æ®ÀÇ Àǹ̰¡ ²À °°À» ÇÊ¿ä´Â ¾ø´Ù. ÇÕ¸®ÀûÀÎ ÀÌÀ¯°¡ ÀÖ´Â º¯È­¶ó¸é ¹Þ¾ÆµéÀ̰í Àͼ÷ÇØÁö´Â ¼ö¹Û¿¡ ¾ø´Ù.

¸¶¿ì½º ÁÂÇ¥ Á¡°Ë

¸¶¿ì½º°¡ ÄÄÆ÷³ÍÆ® À§·Î ¿Ã¶ó¿À¸é onMouseOver À̺¥Æ®°¡ ¹ß»ýÇÏ¸ç ¹þ¾î³ª¸é onMouseOut À̺¥Æ®°¡ ¹ß»ýÇÑ´Ù. ¿äÁòÀº Ŭ¸¯À» ÃÖ¼ÒÈ­Çϱâ À§ÇØ ¸¶¿ì½º¸¦ ¿Ã¸®±â¸¸ ÇØµµ ¹ÝÀÀÇÏ´Â ±â¹ýÀÌ À¯ÇàÀÌ´Ù. µÎ À̺¥Æ®¸¦ Ȱ¿ëÇÏ¿© »ç¿ëÀÚ°¡ °ü½ÉÀ» º¸ÀÌ´Â ÄÄÆ÷³ÍÆ®¸¦ °­Á¶ÇÑ´Ù.

 

function App() {

  function mouseOver(e) {

    e.target.innerText = "ºñÄÑ! ¾È º¸¿©"

  }

 

  function mouseOut(e) {

    e.target.innerText = "Àß º¸À̴±º"

  }

 

  return (

    <>

      <h2 id ="head" onMouseOver={mouseOver} onMouseOut={mouseOut}>

        ¸¶¿ì½º¸¦ ¿Ã·Á º¸¼¼¿ä.

      </h2>

 

    </>

  )

}

 

º¯È­¸¦ ¸íÈ®È÷ È®ÀÎÇÒ ¼ö ÀÖµµ·Ï ű×ÀÇ ³»¿ëÀ» ¹Ù²å´Ù. Ä¿¼­¸¦ ÄÄÆ÷³ÍÆ® ÂÊÀ¸·Î ³Ö¾ú´Ù »°´Ù ÇØ º¸ÀÚ.

½ºÅ¸ÀÏ·Î ¹è°æ »ö»ó¸¸ »ì¦ ¹Ù²Ù¾î Ȱ¼º »óÅ·Πǥ½ÃÇÒ ¼öµµ ÀÖ°í À̹ÌÁö¸¦ Åë°·Î ±³Ã¼ÇÏ¿© ¾Æ¿¹ ´Ù¸¥ ¸ð¾çÀ» º¸¿©ÁÙ ¼öµµ ÀÖ´Ù. ¼îÇθôÀ̳ª °Ô½ÃÆÇ¿¡¼­ ±¤¹üÀ§¿¡ »ç¿ëÇÏ´Â ±â¹ýÀÌ´Ù.

onMouseEnter, onMouseLeave À̺¥Æ®µµ Àִµ¥ ÁßøµÇ¾î ÀÖÀ» ¶§ ÀÚ½Ä ¿ä¼Ò À§¿¡¼­´Â À̺¥Æ®°¡ ¹ß»ýÇÏÁö ¾Ê´Â´Ù´Â ¹Ì¼¼ÇÑ Â÷À̰¡ ÀÖ´Ù. ÀÌ·± Â÷À̸¦ Àß ±¸ºÐÇϰí Á¤È®ÇÑ À̺¥Æ®¸¦ ¹Þ¾Æ¾ß ¸Å²ô·¯¿î ÇÁ·Î±×·¥ÀÌ µÈ´Ù.

 

7-2.¼ºÀû 󸮾Û

¹®ÀÚ¿­ ÀÔ·Â

¿©±â±îÁö ¸®¾×Æ®ÀÇ ÇÙ½ÉÀûÀÎ ±â´ÉÀº ´ëºÎºÐ ¿¬±¸ÇØ º¸¾Ò´Ù. ¾ÆÁ÷ ´õ ¹è¿ö¾ß ÇÒ°Ô ³²¾Æ ÀÖÁö¸¸ ¹è¿î°Í¸¸ Ȱ¿ëÇØ¼­¶óµµ ½Ç¿ëÀûÀÎ ¾ÛÀ» Á¦ÀÛÇØ º¸¸ç ½Ç¹«¿¡¼­ Àû¿ëµÇ´Â ¹®¹ýÀ» ½Ç½ÀÇØ º¸ÀÚ. ±×·¸´Ù°í ¾ÆÁÖ °Å´ëÇÑ ÁÖÁ¦´Â ¾Æ´Ï¸ç ´Ü¼øÈ÷ ¼ºÀû°ª¸¦ ÀÔ·Â¹Þ¾Æ ÀúÀåÇÏ´Â °£´ÜÇÑ ¿¹Á¦ÀÌ´Ù.

ÀÌ Á¤µµ ¿¹Á¦´Â ½¬¿î ÆíÀÌÁö¸¸ ¸®¾×Æ®½º·´°Ô ¸¸µå´Â°Ç »ý°¢º¸´Ù ³­ÇØÇÏ´Ù. ¸®¾×Æ®ÀÇ Æ¯¼ºÀ» ÀÌÇØÇÏ°í ¸®¾×Æ®ÀÇ ÀåÁ¡À» ÃÖ´ëÇÑ È°¿ëÇÒ ¼ö ÀÖ´Â ±¸Á¶¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ¿¹Á¦¸¸ º¸Áö ¸»°í Á÷Á¢ ¸¸µé¸é¼­ ¸®¾×Æ®ÀÇ ¾î¶² ±â´ÉÀ» Ȱ¿ëÇÒ °ÍÀÎÁö Àß »ý°¢ÇØ¾ß ÇÑ´Ù. ÀÏ´Ü Çлý À̸§À» ÀÔ·Â¹Þ¾Æ ¾Æ·¡ÂÊ¿¡ Ç¥½Ã´Â °£´ÜÇÑ ¾ÛºÎÅÍ ¸¸µé¾î º¸ÀÚ.

 

function ScoreBoard() {

  const [newStudent, setNewStudent] = useState('');

  const [student, setStudent] = useState('');

 

  function updateNewStudent(e) {

    setNewStudent(e.target.value)

    console.log(newStudent)

  }

 

  function displayStudent() {

    setStudent(newStudent)

  }

 

  return (

    <>

      <input type = "text" value = {newStudent} onChange = {updateNewStudent} />

      <input type = "button" value = "Ç¥½Ã" onClick={displayStudent} />

      <p>{student}</p>

    </>

  )

}

 

function App() {

  return (

    <>

      <ScoreBoard />

    </>

  );

}

 

ÀÔ·ÂÀ» ¹Þ¾Æ¾ß ÇÏ´Ï input ÄÁÆ®·ÑÀÌ ÇÊ¿äÇϰí ÀÔ·Â ¿Ï·á¸¦ ¸í·ÉÇÒ button°ú ÀÔ·ÂÇÑ ³»¿ëÀ» Ç¥½ÃÇÒ ¹®´ÜÀÌ ÇÊ¿äÇÏ´Ù. ÀÔ·ÂÁßÀÎ À̸§°ú ÀÌ¹Ì ÀÔ·ÂÇÑ À̸§Àº ·£´õ¸µÁß¿¡ ÀúÀåµÇ¾î¾ß ÇϹǷΠµÑ ´Ù »óÅ·ΠÁ¤ÀÇÇß´Ù. ÃÖÃÊ °ªÀÌ ¾øÀ¸¹Ç·Î ÃʱⰪÀº µÑ ´Ù ºó ¹®ÀÚ¿­ÀÌ´Ù.

»ç¿ëÀÚ°¡ ÀÎDz¿¡ ŸÀÌÇÎÀ» ÇÒ ¶§¸¶´Ù onChange À̺¥Æ®¸¦ ¹Þ¾Æ newStudent »óŸ¦ °»½ÅÇÑ´Ù. Ç¥½Ã ¹öưÀ» ´©¸£¸é onClick¿¡¼­ student »óŸ¦ newStudent·Î ´ëÀÔÇÑ´Ù. ¹öư ¾Æ·¡ÂÊÀÇ <p> ¹®´ÜÀº ÀԷ¹ÞÀº student »óŸ¦ Ãâ·ÂÇÑ´Ù. óÀ½¿¡´Â ºñ¾î ÀÖÁö¸¸ ÀÔ·Â ÈÄ Ç¥½Ã ¹öưÀ» ´©¸£¸é ³»¿ëÀÌ º¸ÀδÙ.

ÀÎDz¿¡ ÀÔ·ÂÇÑ °ªÀ» ¾Æ·¡ ¹®´ÜÀ¸·Î º¸³» È®ÀÎÇÏ´Â °Í »ÓÀÌ´Ù. ¼öÁ¤Çؼ­ ¹öưÀ» ´Ù½Ã ´©¸£¸é ¼öÁ¤ÇÑ °ªÀ¸·Î ´Ù½Ã ¹Ù²ï´Ù. »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ¹Þ°í ±× °ªÀ» »ç¿ëÇÑ´Ù´Â ¸é¿¡¼­ °¡Àå ±âº»ÀûÀÎ »óÈ£ÀÛ¿ë ¿¹Á¦ÀÎ ¼ÀÀÌ´Ù.

ÀÎDz¿¡ ÀÔ·ÂµÈ ³»¿ëÀ» »óÅ·ΠÁ¤ÀÇÇϰí onChange À̺¥Æ®¿¡¼­ Ç×»ó ¾÷µ¥ÀÌÆ®Çϰí ÀÖ¾î »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ °ª°ú newStudentÀÇ »óŰªÀº ¾ðÁ¦³ª °°´Ù. ÀÌó·³ ¸®¾×Æ®°¡ ÀÔ·ÂÆûÀ» Á÷Á¢ °ü¸®ÇÏ´Â ¹æ½ÄÀ» Á¦¾î ÄÄÆ÷³ÍÆ®(Controlled Component)¶ó°í ÇÑ´Ù. ÀԷ°ª°ú »óŰªÀÌ µ¿±âÈ­µÇ¹Ç·Î ¿©·¯ °¡Áö ÀÌÁ¡ÀÌ ÀÖ´Ù.

 

¢º ½Ç½Ã°£ À¯È¿¼º °Ë»ç¸¦ ÇÒ ¼ö ÀÖ´Ù. »ç¿ëÀÚ°¡ ÇÑ ±ÛÀÚ Ä¥¶§¸¶´Ù onChange À̺¥Æ®°¡ ¹ß»ýÇϹǷΠ±ÔÄ¢¿¡ ¸Â´ÂÁö ¹Ù·Î È®ÀÎ °¡´ÉÇÏ´Ù.

¢º »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ÅëÁ¦ÇÒ ¼ö ÀÖ´Ù. »ç¶÷ À̸§¿¡ ¼ýÀÚ¸¦ ÃÄ ³ÖÀ¸¸é ¾ÈµÇ¸ç À̸§ÀÌ ¾ø¾î¼­µµ ¾ÈµÈ´Ù. »ç¿ëÀÚ°¡ ½Ç¼ö¸¦ ÇÏ´Â Áï½Ã ¾Ë·Á ÁÖ°í ¼öÁ¤À» ¿ä±¸ÇÒ ¼ö ÀÖ´Ù.

¢º ÁÖº¯ UI¸¦ ÅëÁ¦Çϱ⠽±´Ù. À̸§À» ÀÔ·ÂÇÏÁö ¾ÊÀº »óÅ¿¡¼­´Â Ç¥½Ã ¹öưÀ» ´­·¯ ºÁ¾ß ÀÇ¹Ì ¾ø´Ù. ¹º°¡ ÀÔ·ÂÇØ¾ß Ç¥½Ã ¹öưÀ» Ȱ¼ºÈ­ÇÏ´Â °ÍÀÌ ¸Â´Ù.

 

°ªÀÌ Ç×»ó Á¤È®ÇÏ´Ï ¿©·¯ ¸ð·Î Ȱ¿ëÇÒ µ¥°¡ ¸¹´Ù. ±×·¯³ª ÀÌ ¹æ½ÄÀÌ Ç×»ó ¹Ù¶÷Á÷ÇÑ °ÍÀº ¾Æ´Ï´Ù. ¸Å ÀԷ½ø¶´Ù »óŰ¡ ¹Ù²î¹Ç·Î ·£´õ¸µÀÌ ´Ù½Ã ¹ß»ýÇÏ¿© ¼Óµµ´Â ¶³¾îÁø´Ù. Ç¥½Ã ¹öưÀ» ´©¸£±â Àü¿¡´Â º¸¿© ÁÖÁöµµ ¾ÊÀ»°Çµ¥ ¤·, ÀÌ, ÀÕ, À̼ø ½ÄÀ¸·Î ÇÑ À½¼Ò¸¦ Ä¥ ¶§¸¶´Ù ´Ù½Ã ±×¸°´Ù´Â °ÍÀº ³¶ºñÀÌ´Ù.

ºñÁ¦¾î ÄÄÆ÷³ÍÆ®

Á¦¾î ÄÄÆ÷³ÍÆ®ÀÇ ¹Ý´ë °³³äÀº ºñÁ¦¾î ÄÄÆ÷³ÍÆ®(Uncontrolled Component)ÀÌ´Ù. ¸®¾×Æ®´Â ÀÔ·Â Æû¿¡ ´ëÇØ ¾Æ¹«°Íµµ ÇÏÁö ¾Ê°í DOMÀÌ ¾Ë¾Æ¼­ °ü¸®Çϵµ·Ï ³»¹ö·Á µÐ´Ù. »ç¿ëÀÚ°¡ ŸÀÌÇÎÀ» ÇÏ´Â Áß¿¡´Â ÀÎDz ÄÁÆ®·ÑÀÌ ¾Ë¾Æ¼­ ÀÚ½ÅÀ» ´Ù½Ã ±×¸± »Ó ³ª¸ÓÁö È­¸éÀº °¡¸¸È÷ µÐ´Ù. ±×¸®°í Ç¥½Ã ¹öưÀ» ´©¸¦ ¶§Ã³·³ ÀÌ °ªÀÌ ÇÊ¿äÇÒ ¶§ °ªÀ» Àд´Ù.

ºñÁ¦¾î´Â ÀԷ°ªÀ» µ¿±âÈ­ÇÏÁö ¾ÊÀ¸¹Ç·Î »óŸ¦ À¯ÁöÇÒ ÇÊ¿ä´Â ¾ø°í ´ë½Å ÇÊ¿äÇÒ ¶§ ÀԷ°ªÀ» ÀÐÀ» ¼ö ÀÖ´Â ÂüÁ¶¸¸ °¡Áö¸é µÈ´Ù. ¾Õ ¿¹Á¦¿¡¼­ newStudent »óŸ¦ ¾ø¾Ö°í ÀÎDz¸¸ ÂüÁ¶·Î Á¤ÀÇÇÑ´Ù. ÀÌ·² ¶§ »ç¿ëÇÏ´Â ÈÅÀÌ useRefÀÌ´Ù.

 

function ScoreBoard() {

  const newStudent = useRef(null);

  const [student, setStudent] = useState('');

 

  function displayStudent() {

    setStudent(newStudent.current.value)

  }

 

  return (

    <>

      <input type = "text" ref={newStudent} defaultValue = '' />

      <input type = "button" value = "Ç¥½Ã" onClick={displayStudent} />

      <p>{student}</p>

    </>

  )

}

 

function App() {

  return (

    <>

      <ScoreBoard />

    </>

  );

}

 

³»ºÎÀûÀÎ ½ÇÇà °úÁ¤Àº ´Ù¸£Áö¸¸ ¹Û¿¡¼­ º¸±â¿¡´Â ¿ÏÀüÈ÷ °°Àº µ¿ÀÛÀ» ÇÏ¸ç ³»ºÎÀûÀ¸·Î´Â ´õ È¿À²ÀûÀÌ´Ù. ¾î¶² ºÎºÐÀÌ ¹Ù²î¾ú´ÂÁö º¸ÀÚ.

 

¨ç newStudent´Â »óŰ¡ ¾Æ´Ñ ÂüÁ¶ÀÌ´Ù. useRef·Î ÂüÁ¶ÇÑ´Ù´Â °ÍÀ» Ç¥½ÃÇ쵂 ÃʱⰪÀ» null·Î ÁöÁ¤ÇÑ´Ù.

¨è ½ÇÁ¦ ÂüÁ¶ÇÒ ÄÁÆ®·ÑÀÇ ref ¼Ó¼º¿¡ ÂüÁ¶¸íÀ» ÁöÁ¤ÇÑ´Ù. input¿¡ newStudentÂüÁ¶¸¦ ÁöÁ¤Çß´Ù.

¨é ÀÎDzÀÇ ÃʱⰪÀº value ¼Ó¼ºÀÌ ¾Æ´Ñ defaultValue  ¼Ó¼ºÀ¸·Î ÁöÁ¤ÇÑ´Ù. value·Î ÁöÁ¤ÇÏ¸é °ªÀÌ °íÁ¤µÇ¾î ¹ö·Á »ç¿ëÀÚ°¡ ÀÔ·ÂÇØµµ ¹Ù²îÁö ¾Ê´Â´Ù.

¨ê ÂüÁ¶ÇÏ´Â °´Ã¼´Â current ¼Ó¼ºÀ¸·Î Àаí ÀԷ°ªÀº value ¼Ó¼ºÀ¸·Î Àд´Ù. Ç¥½Ã ¹öưÀ» ´©¸£¸é ÀÌ °ªÀ» Àоî student »óÅ¿¡ ´ëÀÔÇÑ´Ù. »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ °ªÀÌ ¾Æ·¡ÂÊ ¹®´Ü¿¡ ³ªÅ¸³­´Ù.

¨ë ÇÊ¿äÇÒ ¶§ °ªÀ» Àд ¹æ½ÄÀ¸·Î ¹Ù²Ù¾úÀ¸¹Ç·Î onChange À̺¥Æ®´Â ÇÊ¿äÄ¡ ¾Ê´Ù.

 

Äڵ尡 ´Ü¼øÇØÁö°í ÀÔ·ÂÁß¿¡ ·£´õ¸µÀÌ ¹ß»ýÇÏÁö ¾Ê¾Æ È¿À²ÀûÀÌÁö¸¸ ½Ç½Ã°£À¸·Î º¯È­¸¦ °¨½ÃÇÒ ¼ö ¾ø´Ù´Â ¾àÁ¡ÀÌ ÀÖ´Ù. Çʿ信 µû¶ó µÎ ¹æ½Ä Áß Çϳª¸¦ ¼±ÅÃÇ쵂 ÀÌ ¿¹Á¦ÀÇ °æ¿ì ±â·Ï ¹öưÀ» ´©¸£±â Àü¿¡´Â ±»ÀÌ ÀÐÀ» Çʿ䰡 ¾øÀ¸¹Ç·Î »óÅ·ΠÁ¤ÀÇÇÏÁö ¾Ê¾Æµµ ¹«¹æÇÏ´Ù.

¸®¾×Æ®´Â °¡±ÞÀû Á¦¾î ÄÄÆ÷³ÍÆ®¸¦ »ç¿ëÇÏ¿© À¯È¿¼º Á¡°Ë, UI °»½Å µîÀ» Á¦´ë·Î ó¸®ÇÒ °ÍÀº ±ÇÀåÇÑ´Ù. ·£´õ¸µÀÌ ÀÚÁÖ ¹ß»ýÇØµµ °¡»ó DOM ´öºÐ¿¡ ±ô¹Ú°Å¸®Áö ¾ÊÀ¸¸ç ¾îÂ÷ÇÇ »ç¶÷ ÀÔ·Â ¼Óµµº¸´Ù ºü¸£¸é ¾Æ¹« ¹®Á¦°¡ ¾ø´Ù. ±×·¯³ª ±Ô¸ð°¡ Å©°í º¹ÀâÇϰųª ¸®¾×Æ®°¡ ¾Æ´Ñ ´Ù¸¥ ¶óÀ̺귯¸®¿Í ÇÔ²² µ¿ÀÛÇÒ ¶§´Â ºñÁ¦¾î ÄÄÆ÷³ÍÆ®°¡ À¯¸®ÇÏ´Ù.

°´Ã¼È­

ÀÔ·Â ½Ç½ÀÀ» À§ÇØ À̸§¸¸ ÀÔ·Â ¹Þ¾Ò´Âµ¥ À̸§¿¡ ÇØ´çÇÏ´Â ºÎ°¡ Á¤º¸°¡ ´õ ÇÊ¿äÇÏ´Ù. ¼ºÀû °ü¸® ¾ÛÀ» ¸¸µé°í ÀÖÀ¸´Ï ´ç¿¬È÷ ¼ºÀûµµ ÀÔ·Â ¹Þ¾Æ¾ß ÇÑ´Ù. µÎ °³ÀÇ ÄÁÆ®·ÑÀ» ¹èÄ¡ÇØ¾ß ÇÏ°í °¢ ÄÁÆ®·ÑÀÇ ÀԷ°ªÀ» À¯ÁöÇØ¾ß ÇÏ´Ï »óŵµ ±×¸¸Å­ ÀÖ¾î¾ß ÇÑ´Ù. ÇлýÀÇ À̸§»Ó¸¸ ¾Æ´Ï¶ó Á¡¼ö¸¦ ÀúÀåÇÒ score »óŸ¦ Çϳª ´õ Ãß°¡ÇÏ¸é µÉ °Å °°´Ù.

 

const [student, setStudent] = React.useState('');

const [score, setScore] = React.useState('');

 

ÀÌ·¸°Ô ÇØµµ À̸§°ú Á¡¼ö¸¦ ÀúÀåÇϴµ¥ ÀÌ»óÀº ¾ø´Ù. ±×·¯³ª Çлý°ú Á¡¼ö´Â ÇϳªÀÇ ¹­À½ÀÌ¶ó ¶¿ ¼ö ¾ø´Â °ü°èÀ̸ç ÀÌÈÄ Á¡¼ö ¿Ü¿¡ ´õ ¸¹Àº Á¤º¸°¡ Ãß°¡µÉ ¼öµµ ÀÖ´Ù. Çϳª·Î ¹­¾î¾ß Çϸç ÀÌ·² ¶§ ¾²´Â°Ô °´Ã¼ÀÌ´Ù. »óŸ¦ °´Ã¼·Î Á¤ÀÇÇÏ¸é °£ÆíÇϰí È®À强µµ ÁÁ¾ÆÁø´Ù. ¼Ó¼ºÀ» ¹«ÇÑ´ë·Î ´Ã¸± ¼ö´Â ¾øÀ¸´Ï Àû´çÇÑ ¶§¿¡ Á¶Á÷È­ÇØ¾ß ÇÑ´Ù.

ÀÔ·Â ÄÁÆ®·ÑÀÌ ¿©·¯ °³À̹ǷΠ¼³¸íÀ» À§ÇÑ ·¹À̺íÀ» ºÙÀÌ°í ·¹À̺í°ú ÄÁÆ®·ÑÀÇ Â¦À» Áþ±â À§ÇØ id ¼Ó¼ºµµ ÁöÁ¤ÇÑ´Ù. ÀÎDz¿¡ id¸¦ ÁöÁ¤ÇÏ°í ·¹ÀÌºí¿¡ htmlFor ¼Ó¼ºÀ» ÁöÁ¤ÇØ µÎ¸é ·¹À̺íÀ» Ŭ¸¯ÇÒ ¶§ ¿¬°áµÈ ÄÁÆ®·Ñ·Î Æ÷Ä¿½º°¡ À̵¿ÇÑ´Ù. HTML¿¡¼­´Â for ¼Ó¼ºÀ¸·Î ÁöÁ¤ÇÏÁö¸¸ JSX¿¡¼­´Â htmlForÀÓÀ» À¯ÀÇÇÏÀÚ.

 

function ScoreBoard() {

  const newStudent = useRef(null);

  const newScore = useRef(null);

  const [scoreItem, setScoreItem] = useState({

    student : 'À̸§',

    score : 100

  });

 

  function displayScoreItem(e) {

    setScoreItem({

      student : newStudent.current.value,

      score : newScore.current.value

    })

  }

 

  return (

    <>

      <label htmlFor="student">Çлý </label>

      <input type = "text" id = "student" ref={newStudent} defaultValue = '' />

      <label htmlFor="score">Á¡¼ö </label>

      <input type = "text" id = "score" ref={newScore} defaultValue = '' />

      <input type = "button" value = "Ç¥½Ã" onClick={displayScoreItem} />

      <p>{scoreItem.student} : {scoreItem.score} </p>

    </>

  )

}

 

function App() {

  return (

    <>

      <ScoreBoard />

    </>

  );

}

 

»óŰ¡ ÀÌÁ¦´Â ÇлýÀÌ ¾Æ´Ï¶ó Çлý, Á¡¼ö¸¦ ¹­Àº °´Ã¼À̹ǷΠscoreItemÀ¸·Î À̸§À» ºÙ¿´´Ù. ÃʱⰪÀ¸·Î student¿Í score ¸â¹ö¸¦ °¡ÁüÀ» ¸í½ÃÇϰí Ãâ·ÂÇÒ ¶§ ÄÁÆ®·Ñ¿¡ ÀÔ·ÂÇÑ °ªÀ» ÀÐ¾î »óŸ¦ ¾÷µ¥ÀÌÆ®ÇÑ´Ù. ¹®´ÜÀº ÇлýÀÇ À̸§°ú Á¡¼ö¸¦ Ç¥½ÃÇÑ´Ù.

¼ºÀûÀ» °´Ã¼·Î Á¤ÀÇÇßÀ¸¹Ç·Î °´Ã¼ÀÇ ¸â¹ö¸¸ ´Ã¸®¸é ¾ó¸¶µçÁö ´õ ¸¹Àº Á¤º¸¸¦ Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù. ¸â¹öÀÇ ¼ö°¡ ´çÀåÀº ¸¹Áö ¾Ê´õ¶óµµ ¾ÕÀ¸·Î ´Ã¾î³¯ °¡´É¼ºÀÌ ÀÖ´Ù¸é ¾Æ¿¹ °´Ã¼·Î Á¤ÀÇÇÏ´Â °ÍÀÌ È®Àå¿¡ À¯¸®ÇÏ´Ù.

°´Ã¼ÀÇ ¹è¿­

¼ºÀûÇ¥¶ó¸é ¿©·¯ ¸íÀÇ ¼ºÀûÀ» ÇÑ ´«¿¡ ¾Ë¾Æ º¸±â ½±µµ·Ï Ç¥½ÃÇØ¾ß ÇÑ´Ù. ÇÑ ¸íÀÇ ¼ºÀû µ¥ÀÌÅ͸¦ °´Ã¼·Î Á¤ÀÇÇßÀ¸¹Ç·Î ÀÌÁ¦ ÀÌ °´Ã¼ÀÇ ¹è¿­À» ¸¸µé¸é µÈ´Ù. ÀڷᱸÁ¶°¡ È®ÀåµÇ°í º¹¼ö °³ÀÇ µ¥ÀÌÅ͸¦ ÀÔ·Â ¹ÞÀ¸·Á¸é ¸¹Àº º¯È­°¡ ÇÊ¿äÇÏ´Ù.

 

function ScoreBoard() {

  const newStudent = React.useRef(null);

  const newScore = React.useRef(null);

  const [scoreItem, setScoreItem] = useState([])

 

  function addScoreItem(e) {

    setScoreItem([

      ...scoreItem,

      {

        student : newStudent.current.value,

        score : newScore.current.value

      }

    ])

    newStudent.current.value = ''

    newScore.current.value = ''

    newStudent.current.focus()

  }

 

  return (

    <>

      <label htmlFor="student">Çлý </label>

      <input type = "text" id = "student" ref={newStudent} defaultValue = ''  />

      <label htmlFor="score">Á¡¼ö </label>

      <input type = "text" id = "score" ref={newScore} defaultValue = '' />

      <input type = "button" value = "Ãß°¡" onClick={addScoreItem} />

      <ol>

        {scoreItem.map((s, index) => (

          <li key={index}>{s.student} Çлý : {s.score}Á¡ </li>

        ))} 

      </ol>

    </>

  )

}

 

function App() {

  return (

    <>

      <ScoreBoard />

    </>

  );

}

 

scoreItemÀº ÃʱⰪÀ» [] ºó ¹è¿­·Î Á¤ÀÇÇÑ´Ù. ¾î¶² ŸÀÔ¿¡ ´ëÇÑ ¹è¿­ÀÎÁö´Â Á¤ÀÇÇÏÁö ¾Ê¾Ò´Âµ¥ Ãß°¡ÇÒ ¶§ °áÁ¤µÈ´Ù. ÀÔ·ÂÇÑ Á¤º¸¸¦ °è¼Ó ´©ÀûÇϹǷΠ¹öưÀÇ Ä¸¼ÇÀ» 'Ç¥½Ã'°¡ ¾Æ´Ñ 'Ãß°¡'·Î ¹Ù²Ù¾ú´Ù. addScoreItem Çڵ鷯´Â »õ·Î ÀԷ¹ÞÀº Á¡¼ö Á¤º¸¸¦ ¹è¿­¿¡ Ãß°¡ÇÑ´Ù. »õ·Î ÀԷ¹ÞÀº Á¤º¸¸¦ Ãß°¡ÇÏ´Â °ÍÀÌÁö ¹Ù²Ù´Â°Ô ¾Æ´Ï¹Ç·Î ´ÙÀ½ Äڵ尡 ¾Æ´ÔÀ» À¯ÀÇÇÏÀÚ.

 

    setScoreItem([

      {

        student : newStudent.current.value,

        score : newScore.current.value

      }

    ])

 

ÀÌ ÄÚµå´Â »õ·Î ÀԷ¹ÞÀº Á¤º¸·Î ÇϳªÀÇ °´Ã¼¸¦ »ý¼ºÇÏ°í ¹è¿­¿¡ ÀÌ °´Ã¼ Çϳª¸¸ »ðÀÔÇÑ´Ù. ÀÌ·¸°Ô µÇ¸é ÀÌÀü¿¡ ÀÔ·ÂÇØ ³õÀº Á¤º¸´Â ¸ðµÎ »ç¶óÁö¹Ç·Î Ãß°¡°¡ ¾Æ´Ñ º¯°æÀÌ´Ù. Äڵ忡 ÀÖ´Â ...scoreItemÀº Áö±Ý±îÁö ÀÔ·ÂµÈ Á¤º¸¸¦ ¸ðµÎ ³ª¿­Ç϶ó´Â ¶æÀÌ¸ç ¿©±â¿¡ »õ·Î¿î Á¤º¸¸¦ ´õ Ãß°¡Ç϶ó´Â ¸í·ÉÀÌ µÈ´Ù.

¼ºÀû Á¤º¸¸¦ À̾ °è¼Ó ÀÔ·ÂÇÏ·Á¸é ÄÁÆ®·ÑÀ» ºñ¿ö ÁÖ°í Æ÷Ä¿½º¸¦ ¿Å±â´Â 󸮵µ ¹Ýµå½Ã ÇÊ¿äÇÏ´Ù. ÀÌ ±â´ÉÀÌ ¾øÀ¸¸é »ç¿ëÀÚ°¡ ÀÏÀÏÀÌ ¸¶¿ì½º·Î Æ÷Ä¿½º¸¦ ¿Å±â°í ±âÁ¸ ÀÔ·Â ³»¿ëÀ» Áö¿ö¾ß ÇÏ´Ï ±²ÀåÈ÷ ºÒÆíÇØÁø´Ù.

º»¹®¿¡´Â ¼ø¼­ÀÖ´Â ¸ñ·ÏÀ» ÀÛ¼ºÇÏ°í °¢ ¼ºÀû Á¤º¸¸¦ map ÇÔ¼ö·Î ¼øÈ¸Çϸç Çлý°ú Á¡¼ö¸¦ Ãâ·ÂÇÑ´Ù. key´Â ¼ø¼­°ªÀ¸·Î ÁöÁ¤ÇßÀ¸¸ç ÀÔ·Â ¼ø¼­´ë·Î ÇлýÀÇ ¹øÈ£µµ ¸Å°å´Ù. ±×·² µíÇÑ ¼ºÀûÇ¥°¡ È­¸é¿¡ ³ªÅ¸³­´Ù.

¼öµ¿À¸·Î ¾î¶² Á¤º¸¸¦ ¿¬¼Ó ÀԷ¹޴ ¿¹Á¦¸¦ ¸¸µé¾î ºÃ´Âµ¥ ¸®¾×Æ®ÀÇ ¿©·¯ ±â´ÉÀ» ½á º»´Ù´Â ÇмúÀûÀÎ Àǹ̴ ÀÖ´Ù. ½Ç¹«¿¡¼­´Â ÀÌ º¸´Ù ¾çÀÌ ¸¹À» ¶§ º¸Åë ±×¸®µå ÄÁÆ®·ÑÀ» »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù.

¼ºÀûÀÇ ¹è¿­

¼ºÀûÇ¥¿¡´Â °ú¸ñÀÌ Çϳª¸¸ ÀÖ´Â°Ô ¾Æ´Ï´Ù. ¹è¿­¾È¿¡ °´Ã¼°¡ µé¾î ÀÖ´Â ÇüÅÂÀε¥ ÀÌÁ¦ °´Ã¼¾È¿¡ ¶Ç ¹è¿­À» ³ÖÀ» ¼ö ÀÖ´Ù. ÀÌ°Í Àú°Í ¼ºÀûÀ» ¸¹ÀÌ ³Ö¾îº¸¸é ½Ç°¨³ªÁö¸¸ ½Ç½ÀÀÌ ¹ø°Å·Î¿ì´Ï ¿µ¾î, ¼öÇÐ µÎ °³ÀÇ °ú¸ñ¸¸ ³Ö¾î º¸ÀÚ. °ú¸ñÀÌ ´Ã¾î³ª¸é ÃÑÁ¡°ú Æò±Õ¿¡ ´ëÇÑ °è»êµµ ÇÊ¿äÇÏ´Ù.

 

function ScoreBoard() {

  const newStudent = useRef(null);

  const newEng = useRef(null);

  const newMat = useRef(null);

  const [scoreItem, setScoreItem] = useState([])

 

  function addScoreItem(e) {

    const eng = Number(newEng.current.value)

    const mat = Number(newMat.current.value)

 

    setScoreItem([

      ...scoreItem,

      {

        student : newStudent.current.value,

        score : [eng, mat],

        total : eng + mat,

        avg : (eng + mat) / 2

      }

    ])

    newStudent.current.value = ''

    newEng.current.value = ''

    newMat.current.value = ''

    newStudent.current.focus()

  }

 

  return (

    <>

      <label htmlFor="student">Çлý </label>

      <input type = "text" id = "student" ref={newStudent} defaultValue = ''  />

      <label htmlFor="eng">¿µ¾î </label>

      <input type = "text" id = "eng" ref={newEng} defaultValue = '' />

      <label htmlFor="mat">¼öÇÐ </label>

      <input type = "text" id = "mat" ref={newMat} defaultValue = '' />

      <input type = "button" value = "Ãß°¡" onClick={addScoreItem} />

      <ol>

        {scoreItem.map((s, index) => (

          <li key={index}>

            {s.student} Çлý : ¿µ¾î {s.score[0]}Á¡ ¼öÇÐ {s.score[1]}Á¡

            ÃÑÁ¡ : {s.total} Æò±Õ : { s.avg.toFixed(2)}           

          </li>

        ))} 

      </ol>

    </>

  )

}

 

function App() {

  return (

    <>

      <ScoreBoard />

    </>

  );

}

 

ÀÎDzÀ¸·Î ÀԷ¹ÞÀº °ªÀº ¹®ÀÚ¿­ÀÌÁö °è»êÇÒ ¼ö ÀÖ´Â ¼ýÀÚ°¡ ¾Æ´Ï¹Ç·Î Number ÇÔ¼ö·Î Á¤¼ö·Î ¹Ù²Û ÈÄ °è»êÇØ¾ß ÇÑ´Ù. À¯È¿¼º Á¡°ËÀº ÇÏÁö ¾Ê°í ÀÖ¾î Á¡¼ö¸¦ À߸ø ³Ö¾îµµ ¾ÆÁ÷ ó¸®ÇÏÁö ¸øÇÑ´Ù. ¿¡·¯´Â ¹ß»ýÇÏÁö ¾ÊÁö¸¸ NaNÀ¸·Î Ç¥½ÃµÈ´Ù. Æò±ÕÀº ¼Ò¼öÁ¡ ÀÌÇÏ 2ÀÚ¸®±îÁö¸¸ Ãâ·ÂÇÑ´Ù.

ÃÑÁ¡°ú Æò±ÕÀº »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ Á¤º¸°¡ ¾Æ´Ï¶ó ¼ºÀûÀ¸·ÎºÎÅÍ °è»êÇÑ °ªÀ̹ǷΠ±»ÀÌ »óÅ °´Ã¼¿¡ Æ÷ÇÔÇÏÁö ¾Ê¾Æµµ µÈ´Ù. Ãâ·Â ¼Óµµ Çâ»óÀ» À§ÇØ ¹Ì¸® °è»êÇØ µÎ¾úÁö¸¸ Ãâ·ÂÇÒ ¶§ °è»êÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù.

»èÁ¦

¼ºÀûÀ» À߸ø ÀÔ·ÂÇÒ ¼öµµ ÀÖÀ¸´Ï »èÁ¦ ±â´Éµµ ÇÊ¿äÇÏ´Ù. °³º° Ç׸ñ¿¡ »èÁ¦ ¹öưÀ» ¹èÄ¡Çϰí Ŭ¸¯½Ã ±× Ç׸ñÀ» »èÁ¦ÇÑ´Ù. ¸ðµç ¼ºÀûÀ» ´Ù Áö¿ì´Â ÃʱâÈ­ ±â´Éµµ ³Ö¾î º¸ÀÚ. ¸Å¹ø ¼ºÀûÀ» ÀÔ·ÂÇÑ ÈÄ Å×½ºÆ®Çϱ⠱ÍÂúÀ¸¹Ç·Î »óÅÂÀÇ ÃʱⰪÀ» ÀÛ¼ºÇÏ¿© 3¸íÀÇ ¼ºÀûÀ» »ùÇ÷Π¹Ì¸® ÀÔ·ÂÇØ ³õ¾Ò´Ù.

 

function ScoreBoard() {

  const newStudent = useRef(null);

  const newEng = useRef(null);

  const newMat = useRef(null);

  const [scoreItem, setScoreItem] = useState([

    {student : 'À̼ø½Å', score : [88, 92], total : 88 + 92, avg : (88 + 92) / 2},

    {student : '±èÀ¯½Å', score : [75, 68], total : 75 + 68, avg : (75 + 68) / 2},

    {student : '°­°¨Âù', score : [92, 95], total : 92 + 95, avg : (92 + 95) / 2},

  ])

 

  function addScoreItem(e) {

    const eng = Number(newEng.current.value)

    const mat = Number(newMat.current.value)

   

    setScoreItem([

      ...scoreItem,

      {

        student : newStudent.current.value,

        score : [eng, mat],

        total : eng + mat,

        avg : (eng + mat) / 2

      }

    ])

  }

 

  function delScoreItem(e) {

    setScoreItem(

      scoreItem.filter((s, index) =>

        index != Number(e.target.dataset.index))

    )

  }

 

  function resetScoreItem(e) {

    setScoreItem([])

  }

 

 

  return (

    <>

      <label htmlFor="student">Çлý </label>

      <input type = "text" id = "student" ref={newStudent} defaultValue = ''  />

      <label htmlFor="eng">¿µ¾î </label>

      <input type = "text" id = "eng" ref={newEng} defaultValue = '' />

      <label htmlFor="mat">¼öÇÐ </label>

      <input type = "text" id = "mat" ref={newMat} defaultValue = '' />

      <input type = "button" value = "Ãß°¡" onClick={addScoreItem} />

      <input type = "button" value = "ÃʱâÈ­" onClick={resetScoreItem} />

      <ol>

        {scoreItem.map((s, index) => (

          <li key={index}>

            {s.student} Çлý : ¿µ¾î {s.score[0]}Á¡ ¼öÇÐ {s.score[1]}Á¡

            ÃÑÁ¡ : {s.total} Æò±Õ : { s.avg.toFixed(2)}

            <input type = "button" value = "»èÁ¦" data-index = {index} onClick={delScoreItem} />

          </li>

        ))} 

      </ol>

    </>

  )

}

 

function App() {

  return (

    <>

      <ScoreBoard />

    </>

  );

}

 

»èÁ¦ÇÒ ´ë»óÀ» ÁöÁ¤ÇÏ·Á¸é °¢ Ç׸ñ¸¶´Ù üũ ¹Ú½º¸¦ ºÙÀÌ´Â ¹æ¹ýµµ ÀÖÁö¸¸ °³º° Ç׸ñ ¿·¿¡ »èÁ¦ ¹öưÀ» µû·Î ¹èÄ¡ÇÏ´Â ¹æ¹ýÀÌ °£ÆíÇÏ´Ù. ¹öưº°·Î »èÁ¦ÇÒ ´ë»óÀ» ±â¾ïÇØ¾ß Çϴµ¥ À̸¦ À§ÇØ data-index ¼Ó¼º¿¡ ¼ø¼­°ªÀ» ÀúÀåÇØ µÎ¾ú´Ù. ÀúÀåÇÑ ¼ø¼­°ªÀº e.target.dataset °´Ã¼·Î Àд´Ù. ÀÌ ±â´ÉÀº ¸®¾×Æ®¿Í´Â »ó°ü¾ø°í HTML5¿¡¼­ µµÀÔÇÑ °ÍÀ̸ç data- ´ÙÀ½¿¡ ¿øÇÏ´Â ¼Ó¼ºÀ» ÁöÁ¤Çϸé ÀÌ ¼Ó¼º°ú °ªÀÌ datasetÀÇ °´Ã¼·Î ÀúÀåµÇ¾î À̺¥Æ® Çڵ鷯·Î Àü´ÞÇÑ´Ù. ¿©·¯ °³ÀÇ ¼Ó¼ºÀ» ÇѲ¨¹ø¿¡ Àü´ÞÇÒ ¼ö ÀÖ´Ù.

¿¹¸¦ µé¾î data-name, data-addr µÎ °³ÀÇ ¼Ó¼ºÀ» ¹öư¿¡ ÁöÁ¤ÇØ ³õÀ¸¸é À̺¥Æ® Çڵ鷯·Î ÀÌ µÎ ¼Ó¼º¿¡¼­ data- ÀÌÈÄÀÇ À̸§À» ¸â¹ö·Î °¡Áö´Â dataset °´Ã¼°¡ Àü´ÞµÈ´Ù. ´Ü, À̸§ÀÌ ¿©·¯ ´Ü¾îÀÏ °æ¿ì´Â ij¸ÖÄÉÀ̽º·Î ÀüȯÇϴµ¥ data-user-nameÀ¸·Î À̸§À» ºÙÀ̸é Àü´ÞÇÒ ¶§´Â userNameÀÌ µÈ´Ù.

»èÁ¦ ¹öưÀ» ´©¸£¸é filter ¸Þ¼­µå·Î index°¡ ´Ù¸¥ °Í¸¸ °ñ¶ó³» »õ·Î¿î ¹è¿­À» ¸¸µé°í À̸¦ setScoreItemÀ¸·Î Àü´ÞÇÑ´Ù. ¹è¿­¿¡¼­ ÇÑ ¿ä¼Ò¸¸ Áö¿ï ¶§´Â splice ¸Þ¼­µå·Î index À§Ä¡¸¦ ÁöÁ¤ÇÏ´Â °£´ÜÇÑ ¹æ¹ýÀÌ ÀÖÁö¸¸ ÀÌ ¹æ¹ýÀ» ¾µ ¼ö´Â ¾ø´Ù.

 

  function delScoreItem(e) {

    scoreItem.splice(e.target.dataset.index, 1);

  }

 

ÀÌ Äڵ忡 ÀÇÇØ ¹è¿­¿¡¼­ »èÁ¦´Â µÇÁö¸¸ ·£´õ¸µÀÌ ¾ÈµÈ´Ù. ÀÌ Äڵ尡 ¿Ö ¾ÈµÇ´ÂÁö Çò°¥¸°´Ù¸é ÇÑÂü Àü¿¡ ¹è¿î Ä«¿îÅÍ ¿¹Á¦¿¡¼­ count++ÀÌ ¿Ö µ¿ÀÛÇÏÁö ¾Ê´ÂÁö »ó±âÇØ º¸ÀÚ. Á¤ ÀÌ ¹æ¹ýÀ» ¾²°í ½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.

 

  function delScoreItem(e) {

    const temp = [...scoreItem]

    temp.splice(e.target.dataset.index, 1);

    setScoreItem(temp);

  }

 

»çº»À» ¸ÕÀú ¶ß°í ±× »çº»¿¡¼­ ¿ä¼Ò¸¦ »èÁ¦ÇÑ ÈÄ setScoreItemÀ» ´Ù½Ã È£ÃâÇÑ´Ù. ¸®¾×Æ®´Â set~ ÇÔ¼ö·Î »óŸ¦ ¹Ù²ã¾ß ·£´õ¸µÀÌ ¹ß»ýÇÑ´Ù. »çº»À» ¶ã ¶§ const temp = scoreItem·Î ´ëÀÔÇÏ¸é ¾ÈµÈ´Ù. ÀÌ µÎ ÄÚµåÀÇ Â÷À̸¦ ¸ð¸¥´Ù¸é ÀÚ¹Ù½ºÅ©¸³Æ® °øºÎ¸¦ ´õ ÇØ¾ß ÇÑ´Ù.

ÃʱâÈ­´Â ¾ÆÁÖ ½¬¿ö¼­ ºó ¹è¿­À» ´øÁ® ÁÖ¸é ÀÔ·ÂÇØ ³õÀº ¸ðµç Á¤º¸°¡ ³¯¶ó°£´Ù. Á¤¸» Áö¿ï°ÇÁö Áú¹® ¸Þ½ÃÁö ¹Ú½º Á¤µµ´Â º¸¿© ÁÖ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù. À߸ø ÀÔ·ÂÇÑ °Ç »èÁ¦ ÈÄ ´Ù½Ã ÀÔ·ÂÇÏ¸é µÈ´Ù. ÆíÁý ±â´Éµµ ³ÖÀ» ¼ö ÀÖÁö¸¸ Ãß°¡ ¸ðµå¿Í´Â ±¸ºÐµÇ´Â ÆíÁý ¸ðµå¸¦ µû·Î µÎ¾î¾ß ÇÑ´Ù´Â ¸é¿¡¼­ ´Ù¼Ò ¹ø°Å·Ó´Ù.

Á¤·Ä

¼ºÀûÇ¥¶ó¸é ´ç¿¬È÷ ¼®Â÷¸¦ ³»´Â ±â´ÉÀÌ ÇÊ¿äÇÏ´Ù. ¼®Â÷ ¹öưÀ» Ãß°¡Çϰí À̺¥Æ® Çڵ鷯¿¡¼­ Àӽà ¹è¿­¿¡ »çº»À» ¶á ÈÄ ÃÑÁ¡À» ±âÁØÀ¸·Î ³»¸²Â÷¼ø Á¤·ÄÇÑ´Ù. sortÀÇ ºñ±³ ÇÔ¼ö¿¡¼­ µÎ ÇлýÀÇ ¼ºÀûÀ» ¹Þ¾Æ »« °á°ú¸¦ ¸®ÅÏÇÏ¸é ±× ºÎÈ£¿¡ µû¶ó ¹è¿­À» ÀçÁ¤·ÄÇÑ´Ù.

´Ù¸¥ ¸â¹ö¸¦ ±âÁØÀ¸·Î Á¤·ÄÇÏ·Á¸é totalÀÌ ¾Æ´Ñ ¿øÇÏ´Â ¸â¹ö·Î ºñ±³ÇÑ´Ù. ¿¹¸¦ µé¾î ¿µ¾î ¼ºÀû¸¸À¸·Î ºñ±³Çϰųª À̸§¼øÀ¸·Î Á¤·ÄÇÒ ¼öµµ ÀÖ´Ù. »óŰ¡ ¹Ù²î¹Ç·Î ¹®´Ü¿¡ ¸ðµç ¼ºÀûÀÌ Á¤·ÄµÈ ¼ø¼­´ë·Î ÀçÃâ·ÂµÈ´Ù.

 

  function sortScoreItem(e) {

    const temp = [...scoreItem]

    temp.sort((left, right) => right.total - left.total)

    setScoreItem(temp);   

  }

 

<input type = "button" value = "¼®Â÷" onClick={sortScoreItem} />

 

±âº»ÀûÀÎ ÀԷ°ú Ãâ·Â ±â´ÉÀº ¿Ï·áÇߴµ¥ µðÀÚÀÎÀÌ ³Ê¹« »ç¹«ÀûÀÌ°í ½ä··ÇÏ´Ù. CSS·Î ½ºÅ¸ÀÏÀ» ÀÔÇô º¸ÀÚ. ¼ºÀûÀÇ ÁÙ°£À» 200%·Î ÁöÁ¤Çϰí ÃÑÁ¡Àº ±½°Ô Ç¥½ÃÇß´Ù. ½ºÅ¸ÀÏÀº ÀζóÀÎÀ¸·Î ÀÛ¼ºÇÒ ¼öµµ ÀÖÁö¸¸ ¸®¾×Æ®´Â App.css¿¡ ½ºÅ¸ÀÏÀ» ÁöÁ¤Çϵµ·Ï µÇ¾î ÀÖ´Ù. ÀÌ ÆÄÀÏ ³¡¿¡ µÎ °³ÀÇ ½ºÅ¸ÀÏÀ» Ãß°¡ÇÑ´Ù.

 

.student {

  line-height:200%;

}

 

.total {

  font-weight:bold

}

 

ÀÌ ½ºÅ¸ÀÏÀ» Àû¿ëÇÒ °÷¿¡ classNameÀ» ÁöÁ¤ÇÑ´Ù. ÇлýÀº ¸ñ·ÏÀ̹ǷΠli¿¡ Ŭ·¡½º¸¦ ÁöÁ¤Çϰí ÃÑÁ¡Àº ±×³É ¹®ÀÚ¿­À̹ǷΠ<span> ű׷Π°¨½Î Ŭ·¡½º¸¦ ÁöÁ¤ÇÑ´Ù.

 

<li key={index} className="student">

  {s.student} Çлý : ¿µ¾î {s.score[0]}Á¡ ¼öÇÐ {s.score[1]}Á¡

  ÃÑÁ¡ : <span className="total">{s.total}</span> Æò±Õ : { s.avg.toFixed(2)}

  <input type = "button" value = "»èÁ¦" data-index = {index} onClick={delScoreItem} />

</li>

 

µðÀÚÀÎÀº ±â¼úÀÇ ¿µ¿ªÀÌ ¾Æ´Ñ ¿¹¼úÀÇ ¿µ¿ªÀÌ´Ù º¸´Ï ½ºÅ¸ÀÏÀ» Á൵ ¸ð¾çÀÌ ±×¸® ¿¹»ÚÁö´Â ¾Ê´Ù. ¿ª½Ã µðÀÚÀÎÀº Àü¹®°¡°¡ ÇØ¾ß ÇÑ´Ù.