๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/React

[React] React ์—์„œ state ์‚ฌ์šฉํ•ด๋ณด๊ธฐ_2

by Connecting-the-dots 2022. 3. 18.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ํฌ์ธํŠธ!

๐Ÿ’œ ์ฒซ๋ฒˆ์งธ ๊ธ€์ œ๋ชฉ ๋ฐ”๊พธ๊ธฐ ๋ฒ„ํŠผ  ๋ฐ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

๐Ÿ’œ ๊ฐ€๋‚˜๋‹ค์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ ๋ฒ„ํŠผ ๋ฐ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ


๐Ÿ’œ ์ฒซ๋ฒˆ์งธ ๊ธ€์ œ๋ชฉ ๋ฐ”๊พธ๊ธฐ ๋ฒ„ํŠผ  ๋ฐ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

  let [title, setTitle] = useState([
      '[React] React ์„ค์น˜์™€ ๊ฐœ๋ฐœํ™˜๊ฒฝ ์…‹ํŒ…ํ•˜๊ธฐ',
      '[React]  JSX ๋ฅผ ์ด์šฉํ•ด HTML ํŽ˜์ด์ง€ ์ œ์ž‘ํ•ด๋ณด๊ธฐ', 
      '[React] React ์—์„œ state ๋ณ€๊ฒฝํ•ด๋ณด๊ธฐ'
  ]);
  • ๋ณธ๊ฒฉ์ ์œผ๋กœ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด๋ณด๊ธฐ ์ „์— ๊ธฐ์กด์˜ useState() ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด์ž๋ฉด ์œ„์™€ ๊ฐ™๋‹ค.

๐Ÿค ์ฒซ๋ฒˆ์งธ ๊ธ€์ œ๋ชฉ ๋ฐ”๊พธ๊ธฐ ๋ฒ„ํŠผ ๋งŒ๋“ค๊ธฐ

<button onClick={ changeTitle0 }>์ฒซ๋ฒˆ์งธ ๊ธ€์ œ๋ชฉ ๋ฐ”๊พธ๊ธฐ</button>
  • ์ ๋‹นํ•œ ์œ„์น˜์— "์ฒซ๋ฒˆ์งธ ๊ธ€์ œ๋ชฉ ๋ฐ”๊พธ๊ธฐ" ๋ผ๋Š” ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.
  • onClick ๋‚ด์— ํ•จ์ˆ˜ ์ฝ”๋“œ๋ฅผ ์ ๊ธฐ์—๋Š” ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์„œ changeTitle0 ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ๋„ฃ์–ด์ฃผ๊ธฐ๋กœ ํ–ˆ๋‹ค.

๐Ÿค ์ฒซ๋ฒˆ์งธ ๊ธ€์ œ๋ชฉ ๋ฐ”๊พธ๊ธฐ ๋ฒ„ํŠผ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

function changeTitle0() {
	setTitle([
        '[React] React ์„ค์น˜ ๋ฐ ๊ฐœ๋ฐœํ™˜๊ฒฝ ์…‹ํŒ… ์™„๋ฃŒ', 
        '[React]  JSX ๋ฅผ ์ด์šฉํ•ด HTML ํŽ˜์ด์ง€ ์ œ์ž‘ํ•ด๋ณด๊ธฐ', 
        '[React] React ์—์„œ state ๋ณ€๊ฒฝํ•ด๋ณด๊ธฐ'
    ])
}
  • React ์—์„œ state ๋Š” ์ง์ ‘ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์„ ์ง€์–‘ํ•œ๋‹ค. (๊ทธ๋ž˜์„œ state ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋”ฐ๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ!)
  • ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ ํ•ด์„œ ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์‚ฌ์šฉ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ๋น„ํšจ์œจ์ ์ด๋‹ค.
function changeTitle0() {
    // title[0] = '[React] React ์„ค์น˜ ๋ฐ ๊ฐœ๋ฐœํ™˜๊ฒฝ ์…‹ํŒ… ์™„๋ฃŒ' ์™€ ๊ฐ™์ด state ๋ฅผ ์ง์ ‘ ์ˆ˜์ • ๋ถˆ๊ฐ€
    let newTitle = [...title]; // ! array, object deep copy ํ•˜๋Š” ๋ฐฉ๋ฒ•!
    newTitle[0] = '[React] React ์„ค์น˜ ๋ฐ ๊ฐœ๋ฐœํ™˜๊ฒฝ ์…‹ํŒ… ์™„๋ฃŒ'
    setTitle(newTitle);
}
  • ๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ์—ˆ๋‹ค.
    • ๋จผ์ €, title ์ด๋ผ๋Š” state ๋Š” ์œ„์—์„œ๋„ ์–ธ๊ธ‰ํ–ˆ๋‹ค์‹œํ”ผ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌ๋ณธ์ด ํ•„์š”ํ•˜๋‹ค.
    • ๊ทธ๋ž˜์„œ title ์ด๋ผ๋Š” state ๋ฅผ deep copy ํ•œ ๋ณต์‚ฌ๋ณธ์„ newTitle ์ด๋ผ๋Š” ๋ณ€์ˆ˜์— ์ €์žฅํ•ด์ฃผ์—ˆ๋‹ค.
    • ๋ณต์‚ฌ๋ณธ์ธ newTitle ์˜ 0๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ '[React] React ์„ค์น˜ ๋ฐ ๊ฐœ๋ฐœํ™˜๊ฒฝ ์…‹ํŒ… ์™„๋ฃŒ' ๋ผ๋Š” ๋‚ด์šฉ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค.
    • ๊ทธ๋ฆฌ๊ณ  ๋ณต์‚ฌ๋ณธ์ธ newTitle ์„ setTitle() ํ•จ์ˆ˜ ์•ˆ์— ๋„ฃ์–ด์„œ title state ๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€ ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ์ž๋ฃŒํ˜•์ด ์ฐธ์กฐ์ž๋ฃŒํ˜•(array, object)์ผ ๋•Œ ๋ณต์‚ฌ๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ ๊ฒƒ์ด๋‹ค.
// ๋ณต์‚ฌํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์›์‹œ์ž๋ฃŒํ˜•(array, object ๋ฅผ ์ œ์™ธํ•œ ์ž๋ฃŒํ˜•)์ผ ๋•Œ
// ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
let a = 10;
let b = a;
a = 20;

console.log(b); // b ๋Š” a ์˜ ๋ณต์‚ฌ๋ณธ์œผ๋กœ 10 ์ด ๋จ


// ๋ณต์‚ฌํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ฐธ์กฐ์ž๋ฃŒํ˜•(array, object)์ผ ๋•Œ
// ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. (์–•์€ ๋ณต์‚ฌ, ๊นŠ์€ ๋ณต์‚ฌ)
// ์–•์€ ๋ณต์‚ฌ์˜ ๊ฒฝ์šฐ ๊ฐ’์„ ๊ณต์œ ํ•˜๋ฏ€๋กœ ๋ณต์‚ฌ๋ณธ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์›๋ณธ์ด ๊ฐ™์ด ๋ณ€๊ฒฝ๋œ๋‹ค.
// ๊นŠ์€ ๋ณต์‚ฌ์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋Š” ํ˜•ํƒœ์˜ ์™„์ „ํ•œ ์ƒˆ๋กœ์šด ๋ณต์‚ฌ๋ณธ์ด ์ƒ์„ฑ๋œ๋‹ค.

let a = [1,2,3];
let b = a;
b[0] = 2;

console.log(b); // b ๋Š” [2,2,3] ์ด ๋จ
console.log(a); // ์›๋ณธ a ๋Š” b ์™€ ๊ฐ’์„ ๊ณต์œ ํ•˜๋ฏ€๋กœ b ์™€ ๋™์ผํ•˜๊ฒŒ [2,2,3] ์ด ๋จ


let a = [1,2,3];
let b = [...a]; // ... ์€ spread ์—ฐ์‚ฐ์ž!
a = [2,4,6];

console.log(b); // b ๋Š” a ์˜ ๊นŠ์€ ๋ณต์‚ฌ๋ณธ์— ํ•ด๋‹นํ•˜๋ฏ€๋กœ [1,2,3] ์ด ๋จ

 

 


๐Ÿ’œ ๊ฐ€๋‚˜๋‹ค์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ ๋ฒ„ํŠผ ๋ฐ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

  • ๊ฐ•์‚ฌ๋‹˜์ด React ์—์„œ state ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™œ์šฉํ•˜์—ฌ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๊ธ€์ œ๋ชฉ๋“ค์ด ๊ฐ€๋‚˜๋‹ค์ˆœ์œผ๋กœ ์ •๋ ฌ์ด ๋˜๋„๋ก ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด๋ณด๋ผ๊ณ  ํ•˜์…”์„œ ํ•ด๋ณด์•˜๋‹ค.

๐Ÿค ๊ฐ€๋‚˜๋‹ค์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ ๋ฒ„ํŠผ ๋งŒ๋“ค๊ธฐ

<button onClick={ orderTitle }>๊ฐ€๋‚˜๋‹ค์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ</button>
  • ์ ๋‹นํ•œ ์œ„์น˜์— "๊ฐ€๋‚˜๋‹ค์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ" ๋ผ๋Š” ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.
  • onClick ๋‚ด์— ํ•จ์ˆ˜ ์ฝ”๋“œ๋ฅผ ์ ๊ธฐ์—๋Š” ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์„œ orderTitle0 ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ๋„ฃ์–ด์ฃผ๊ธฐ๋กœ ํ–ˆ๋‹ค.

๐Ÿค ๊ฐ€๋‚˜๋‹ค์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ ๋ฒ„ํŠผ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

function orderTitle() {
    let newOrder = [...title].sort();
    setTitle(newOrder);
}
  • title state ๋ฅผ deep copy ํ•œ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด์„œ newOrder ๋ผ๋Š” ๋ณ€์ˆ˜์— ์ €์žฅํ•ด์ฃผ์—ˆ๋‹ค.
  • .sort() ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฌธ์ž์—ด ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋ณต์‚ฌ๋ณธ์ธ newOrder ๋ฅผ setTitle() ํ•จ์ˆ˜ ์•ˆ์— ๋„ฃ์–ด์„œ title state ๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค.

 

 

 

728x90
๋ฐ˜์‘ํ˜•