๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
WEB/Front-End๐ŸŒ

[React] ์ด๋ฒคํŠธ, state ํŒŒ๊ณ ๋“ค๊ธฐ

by narang111 2021. 10. 7.

์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด๋ดค๋Š”๋ฐ, ์šฐ๋ฆฌ์˜ ํƒœ๊ทธ์— ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ทธ ํƒœ๊ทธ, ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฒคํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋ณธ ์ ์€ ์—†๋‹ค.

 

์ด๋ฒคํŠธ์˜ ์ƒ์‚ฐ์ž๊ฐ€ ๋˜์–ด๋ณผ ์ฐจ๋ก€!

 

<header>๋ผ๋Š” ์ฝ”๋“œ๋Š” ์›๋ž˜ subject.js ์•ˆ์— ์žˆ๋˜ ์ฝ”๋“œ์ด๋‹ค.

์ง€๊ธˆ์€ subject.js ํŒŒ์ผ์„ ์ฃผ์„์ฒ˜๋ฆฌํ•˜๊ณ  ๋‚ด์šฉ์„ ๋ฐ”๊นฅ์ชฝ์œผ๋กœ ์˜ฎ๊ฒจ๋†“์€ ์ƒํƒœ์ด๋‹ค.

์ด์ œ ์ด ์ฝ”๋“œ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  subject ์ปดํฌ๋„ŒํŠธ ์ฃผ์„์„ ํ’€์—ˆ๋‹ค.

 

 

subject๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์‚ฌ์šฉ์ž๊ฐ€ ๋งํฌ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ์˜ ์ด๋ฒคํŠธ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

onChangePage๋ผ๊ณ  ํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์“ฐ์„ธ์š”, ํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ํ•จ์ˆ˜๋ฅผ ์„ค์น˜ํ•ด๋†“๋Š”๋‹ค.

์‚ฌ์šฉ์„ค๋ช…์„œ์—๋Š”aํƒœ๊ทธ ํด๋ฆญ๋˜์—ˆ์„ ๋•Œ ์„ค์น˜ํ•œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด๋“œ๋ฆด๊ฒŒ์š” ๋ผ๊ณ  ์ ์–ด๋†“๋Š”๋‹ค.

 

์ •๋ฆฌ) ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“œ๋ ค๋Š” subject ์ปดํฌ๋„ŒํŠธ๋Š” onchangepage๋ผ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์žˆ์–ด์„œ ์ด ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ๋งํฌ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ์ด ์ด๋ฒคํŠธ์— ์„ค์น˜ํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋งŒ๋“ค๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ด๋‹ค

 

onChagePage๋ผ๋Š” ํ•จ์ˆ˜๋Š” ์–ด๋–ค ํ˜•ํƒœ๋กœ subject์— ์ „๋‹ฌ์ด ๋ ๊นŒ??

=> props

 

subject.js์—์„œ๋Š” props๋กœ ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

์ด๋ฒˆ์—๋Š” ๋ชฉ๋ก์—์„œ ํด๋ฆญํ•œ ๊ฒƒ์— ๋”ฐ๋ผ ๋ณธ๋ฌธ ๋‚ด์šฉ์„ ๋ฐ”๊พธ๋Š” ์ž‘์—…์„ ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.

TOC ์ปดํฌ๋„ŒํŠธ์—๋„ onChangePage๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์„ค์น˜ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  TOC.js ์•ˆ์—์„œ onChangePage๋ผ๋Š” props๋ฅผ ๋ฐ›์•„์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜ ์•ˆ์—์„œ๋„ ๋˜‘๊ฐ™์ด ํด๋ฆญํ–ˆ์„ ๋–„ ํŽ˜์ด์ง€๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š๋„๋ก ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„์„œ ๊ฐ์ฒด์˜ preventDefault ํ•จ์ˆ˜๋ฅผ ๋„ฃ์—ˆ๋‹ค. ๋‚˜๋จธ์ง€๋„ ๋˜‘๊ฐ™์ด props๋กœ ๋ฐ›์•„์„œ ํ•จ์ˆ˜ ์ด๋ฒคํŠธ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

์ง€๊ธˆ ์งœ๋†“์€ ์ฝ”๋“œ๋Š” ๋ชจ๋“  ๋ชฉ๋ก์ด ๋ˆŒ๋ €์„ ๋•Œ hi ์•Œ๋ฆผ์ฐฝ์ด ๋œจ๊ฒŒ ๋œ๋‹ค.

 

 

์—ฌ๊ธฐ์—๋Š” App ์ปดํฌ๋„ŒํŠธ์˜ state๊ฐ’์„ read๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์ž‘์—…์ด ๋“ค์–ด๊ฐ„๋‹ค.

์ด๋ ‡๊ฒŒ setState๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์›น ํŽ˜์ด์ง€์—์„œ ๋ชฉ๋ก์„ ๋ˆ„๋ฅด๋ฉด mode๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์„ ๊ฐœ๋ฐœ์ž ์ฝ˜์†”์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ WEB์„ ๋ˆ„๋ฅด๋ฉด ๋‹ค์‹œ welcome ๋ชจ๋“œ๋กœ ๋ฐ”๋€๋‹ค.

 

 

 

์ด์ œ ๋ชฉ๋ก์—์„œ ์„ ํƒํ•œ content๊ฐ€ ๋ณธ๋ฌธ์— ๋‚˜์˜ค๋„๋ก ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค

 

App์ปดํฌ๋„ŒํŠธ์˜ state์— selectedContentId ์™€ ๊ฐ™์€ ์ด๋ฆ„์„ ์ค˜์„œ ํ˜„์žฌ ์„ ํƒ๋œ content๋ฅผ ๊ตฌ๋ถ„ํ•  ๊ฒƒ์ด๋‹ค.

๊ธฐ๋ณธ๊ฐ’์œผ๋กœ 2๋ฅผ ์คฌ๋‹ค. ๊ทธ๋ฆฌ๊ณ  App์—์„œ render()๋ฅผ ์‹คํ–‰ํ•  ๋•Œ while๋ฌธ์œผ๋กœ ์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ๋Š˜๋ ค๊ฐ€๋ณด๋ฉด์„œ ํ•ด๋‹น id์˜ ๋‚ด์šฉ์„ ๋ณธ๋ฌธ์— ๋„์›Œ์ค€๋‹ค. ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •์œผ๋กœ๋งŒ ๋ณธ๋ฌธ ๋‚ด์šฉ์ด ๋ฐ”๋€Œ๊ธฐ ๋–„๋ฌธ์— ํด๋ฆญํ–ˆ์„ ๋•Œ ๋ฐ”๋€Œ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

 

์ค‘๊ฐ„์ •๋ฆฌ๋ฅผ ํ•ด๋ณด์ž๋ฉด onChagePage๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ถ€๋ถ„์€ TOC.js์—์„œ onClick ํ–ˆ์„ ๋•Œ props๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

TOC๊ฐ€ App.js์˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ!

์—ฌ๊ธฐ์„œ ์ธ์ž๋กœ ์šฐ๋ฆฌ๊ฐ€ ํด๋ฆญํ•œ ํ•ญ๋ชฉ์˜ id ๊ฐ’์„ ์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

onClick ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ e๋ผ๊ณ  ํ•˜๋Š” ์ด๋ฒคํŠธ ๊ฐ์ฒด์—๋Š” ์–ด๋–ค ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ์„๊นŒ?

TOC render() ํ•จ์ˆ˜์—์„œ debugger๋ฅผ ์“ฐ๊ณ  onclick ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋–„์˜ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ๊ฐœ๋ฐœ์ž ์ฝ˜์†”์—์„œ ํ™•์ธํ•ด๋ณด์•˜๋‹ค.

์ฝ”๋“œ๊ฐ€ ๋‚˜์˜ค๋ฉด esc๋ฅผ ๋ˆŒ๋Ÿฌ ๊ฐœ๋ฐœ์ž ์ฝ˜์†”์„ ์ผ ๋‹ค. ์ฝ˜์†”์—์„œ e๋ฅผ ๋ˆ„๋ฅด๋ฉด ์–ด๋–ค ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์†์„ฑ์€ target ์ธ๋ฐ ์ด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ํƒœ๊ทธ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์ด๋ฒคํŠธ ํ•จ์ˆ˜ ๋‚ด์—์„œ e.target์ด๋ผ๊ณ  ํ•˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํƒœ๊ทธ์ธ a ํƒœ๊ทธ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

aํƒœ๊ทธ๋ฅผ ์•Œ์•„๋‚ด๋ฉด ์—ฌ๊ธฐ์„œ ๋˜ data-id ๊ฐ’์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  data- ๋ผ๋Š” ์ ‘๋‘์‚ฌ ์‹œ์ž‘ํ•˜๋Š” ์†์„ฑ์€ target ์†์„ฑ ์•ˆ์˜ dataset ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์•Œ์•„๋‚ธ ๊ฐ’์„ onChangePage๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ธ์ž๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

App.js์—์„œ ๋ฐ›์€ ์ธ์ž๋Š” ๋ฌธ์ž๋กœ ๋ฐ›์•„์ง€๋Š”๋ฐ javascript์—์„œ ๋ฌธ์ž๋ฅผ ์ˆซ์ž๋กœ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜๋Š” Number๋ฅผ ์‚ฌ์šฉํ•ด์ค€๋‹ค.

 

 

 

์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ id๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

bind์— data[i].id ์ •๋ณด๋ฅผ onClick ์— ์—ฐ๊ฒฐ๋œ ํ•จ์ˆ˜์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค€๋‹ค. 

(์ธ์ž์˜ ์ˆœ์„œ๋Š” ํŠน์„ฑ์ด๋‹ค)