TIL 40: [React] ์ปดํฌ๋„ŒํŠธ ๋””์ž์ธ

์˜ค๋Š˜์€ ์–ด์ œ ๋งˆ์ € ๋‹คํ•˜์ง€ ๋ชปํ•œ Advanced ๋ถ€๋ถ„์„ ๋‹ค ํ’€์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๊ณ„์† ๋จธ๋ฆฟ์†์—์„œ ๋งด๋„๋Š” ๊ฑด {},,,

{} ๋•Œ๋ฌธ์— ์ ์–ด๋„ ๋‘ ์‹œ๊ฐ„์€ ์‚ฌ์šฉํ•œ ๊ฒƒ ๊ฐ™๋„ค์š”๐Ÿ˜‚ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ์ž˜๋ชป๋œ ์ค„ ์•Œ๊ณ  useState๋กœ clicked ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ๋„ ํ–ˆ๋Š”๋ฐ, ๋‚ด์šฉ์ด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ˜•์‹์˜ ๋ฌธ์ œ์˜€๋‹ค๋Š” ์ ์—์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์•”๊ธฐ๋„ ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜๋„ ํ•˜๋ฃจ์ข…์ผ Sprint๋ฅผ ํ’€์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•˜๊ณ  ์‹ถ์—ˆ๋˜ ๋ถ€๋ถ„๋“ค์„ ์ถ”๊ฐ€์ ์œผ๋กœ ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜

์ฒ˜์Œ์—๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ ํ‘œํ˜„์‹ ๋ถ€๋ถ„์„ {}๋กœ๋งŒ ๊ฐ์‹ธ์คฌ์—ˆ๋Š”๋ฐ ์ด๋ถ€๋ถ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ์—ˆ์Šต๋‹ˆ๋‹ค. ์•„์˜ˆ {}๋ฅผ ๊ฐ์‹ธ์ฃผ์ง€ ์•Š๊ฑฐ๋‚˜ ๊ทธ ์•ˆ์— return๋ฌธ์„ ๋„ฃ์–ด์คฌ์–ด์•ผ ํ–ˆ๋Š”๋ฐ ์ด๋„์ €๋„ ์•„๋‹ˆ๊ฒŒ ๋ฐ˜๋ฐ˜ ์„ž์–ด์ค˜์„œ ์•„๋ž˜ Dropdown์ด ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ํŽ˜์–ด๋ถ„์ด๋ž‘ ์ €๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์—์„œ ๊ณ„์† ์ฐพ์•„๋ดค์ง€๋งŒ ๋‚ด์šฉ์ƒ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์€ ์—†์–ด์„œ ํ˜•์‹๊นŒ์ง€ ๋น„๊ตํ•˜๋‹ค ๋ณด๋‹ˆ ๊ฒฐ๊ตญ ์˜ค๋ฅ˜๋ฅผ ๋ฐ”๋กœ์žก์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ํ‘œํ˜„์ด ์˜ฌ๋ฐ”๋ฅธ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

 

 

Focus Events

onFocus

์—˜๋ฆฌ๋จผํŠธ๊ฐ€ focus ์†์„ฑ์„ ๋ฐ›๊ฒŒ ๋˜๋ฉด onFocus ์ด๋ฒคํŠธ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ํ…์ŠคํŠธ ์ž…๋ ฅ์ฐฝ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ onFocus ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

onBlur

์—˜๋ฆฌ๋จผํŠธ๊ฐ€ focus ์†์„ฑ์„ ๋” ์ด์ƒ ๊ฐ–์ง€ ์•Š๊ฒŒ๋˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. onFocus์™€ ๋ฐ˜๋Œ€๋˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ focus๊ฐ€ ํ…์ŠคํŠธ ์ฐฝ์˜ ๋ฐ”๊นฅ ๋ถ€๋ถ„์„ ํด๋ฆญํ–ˆ์„ ๋•Œ onBlur ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<InputBox>
  {isEditMode ? (
    <InputEdit
      type='text'
      value={newValue}
      ref={inputEl}
      onBlur = {handleBlur} //ํฌ์ปค์Šค๋ฅผ ์žƒ์œผ๋ฉด ๋ฉ”์†Œ๋“œ ์‹คํ–‰
      onChange = {handleInputChange}
    />
  ) : (
    <span onClick = {handleClick}
    >{newValue}</span>
  )}
  </InputBox>

 

 

 

๋ฒ„๋ธ”๋ง๊ณผ ์บก์ฒ˜๋ง

๋ฒ„๋ธ”๋ง์€ ์ด๋ฒคํŠธ๊ฐ€ ์ œ์ผ ๊นŠ์€ ๊ณณ์— ์žˆ๋Š” ์š”์†Œ์—์„œ ์‹œ์ž‘ํ•ด ๋ถ€๋ชจ ์š”์†Œ๋ฅผ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ง๋กœ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์š”์†Œ๋ถ€ํ„ฐ window๊นŒ์ง€ ์ด๋ฒคํŠธ๋ฅผ ์ „ํŒŒํ•ฉ๋‹ˆ๋‹ค. (ํ•˜์œ„ → ์ƒ์œ„)

๋ฐœ์ƒํ•˜๋Š” ๋ชจ์–‘์ด ๋ฌผ์† ๊ฑฐํ’ˆ(bubble)๊ณผ ๋‹ฎ์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„๋ธ”๋ง์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜์˜ HTML ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด FORM > DIV > P ํ˜•ํƒœ๋กœ ์ค‘์ฒฉ๋œ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ

๋ฅผ ํด๋ฆญํ•˜๋ฉด <p>์— ํ• ๋‹น๋œ onclick ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ๋ฐ”๊นฅ์˜ <div>์— ํ• ๋‹น๋œ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์—๋Š” ๊ทธ ๋ฐ”๊นฅ์˜ <๋ž˜๊ทธ>์— ํ• ๋‹น๋œ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ document ๊ฐ์ฒด๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€, ๊ฐ ์š”์†Œ์— ํ• ๋‹น๋œ onclick ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

<form onclick="alert('form')">FORM 
  <div onclick="alert('div')">DIV 
    <p onclick="alert('p')">P</p> 
  </div> 
</form>

onclick๊ณผ ๊ฐ™์€ ๊ฑฐ์˜ ๋ชจ๋“  ์ด๋ฒคํŠธ๋Š” ๋ฒ„๋ธ”๋ง์ด ๋ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ focus ์ด๋ฒคํŠธ์™€ ๊ฐ™์ด ๋ฒ„๋ธ”๋ง์ด ๋˜์ง€ ์•Š๋Š” ์ด๋ฒคํŠธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„๋ธ”๋ง์„ ์ค‘๋‹จํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” stopPropagation() ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด <p>์— stopPropagation์„ ํ•˜๋ฉด <p>์˜ ๋ถ€๋ชจ ์š”์†Œ์ธ div์™€ form์˜ onclick์€ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

<form onclick="alert('form')">FORM 
  <div onclick="alert('div')">DIV 
    <p onclick="event.stopPropagation()">P</p> 
  </div> 
</form>

 

์บก์ฒ˜๋ง์€ ๋ฒ„๋ธ”๋ง๊ณผ ๋ฐ˜๋Œ€๋กœ ์ด๋ฒคํŠธ๊ฐ€ ํ•˜์œ„ ์š”์†Œ๋กœ ์ „ํŒŒ๋˜๋Š” ๋‹จ๊ณ„๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. 

๋‹ค๋ฅธ ๋ง๋กœ๋Š” window๋กœ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์š”์†Œ๊นŒ์ง€ ์ด๋ฒคํŠธ๋ฅผ ์ „ํŒŒํ•ฉ๋‹ˆ๋‹ค. (์ƒ์œ„ → ํ•˜์œ„)

 

 

 

๋ฆฌ์•กํŠธ ํŒŒํŠธ ๊ณต๋ถ€ํ•œ ์ง€ ์˜ค๋ž˜๋˜์–ด์„œ ๋งŽ์ด ๊นŒ๋จน์€ ๊ฒƒ ๊ฐ™์•„ ๊ฑฑ์ •์„ ๋งŽ์ด ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ข‹์€ ํŽ˜์–ด๋ถ„๋„ ๋งŒ๋‚˜๊ณ , Advanced ํŒŒํŠธ๊นŒ์ง€ ํ’€๋ฉด์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋‹ˆ ๋•๋ถ„์— ๋น ๋ฅด๊ฒŒ ๋ณต์Šตํ•  ์ˆ˜ ์žˆ์–ด ์ข‹์•˜์Šต๋‹ˆ๋‹ค๐Ÿ˜Š