08_Oct_2021 ๐Ÿฐ์—˜๋ฆฌ์Šค AI ํŠธ๋ž™ TIL: React II

์œ ํ™˜์ตยท2021๋…„ 10์›” 8์ผ
0

Props (Properties ?= Attribute)

๊ธฐ๋ณธ์ ์œผ๋กœ Component์— ์›ํ•˜๋Š” ๊ฐ’์„ ๋„˜๊ฒจ์ค„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ๊ฐ์ฒด, ๋ฐฐ์—ด ๋“ฑ JavaScript์˜ ์š”์†Œ๋ผ๋ฉด ์ œํ•œ์ด ์—†๋‹ค. ์ฃผ๋กœ Component์˜ '์žฌ์‚ฌ์šฉ'์„ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

{/*์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ*/}
const Welcome = (props) => {
	return <h1>Hello, {props.name}</h1>;
}
{/*์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ*/}
const App = () => {
	return (
    	<>
            <Welcome name='Alex'/>
            <Welcome name='Jason'/>
            <Welcome name='Justin'/>
            <Welcome name='Claire'/>
    )
}

props๋Š” ์ฝ๊ธฐ ์ „์šฉ(Read Only)

const Welcome = (props) => {
	const name = `{props.name} ๋‹˜`;
    	return <h1>Hello, {name}</h1>;
}

๋งŒ์•ฝ Props์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•ด์„œ ๊ฐ’์„ ๋ณต์ œํ•œ๋‹ค.

DOM Element์˜ Attributes

  • ๊ธฐ๋ณธ์ ์ธ DOM Element(div, span ๋“ฑ)๋“ค์˜ Attribute๋Š” camel case๋กœ ์ž‘์„ฑ. (tabIndex, className)

  • 'data-' ํ˜น์€ 'aria-'๋กœ ์‹œ์ž‘ํ•˜๋Š” Attribute๋Š” ์˜ˆ์™ธ์ด๋‹ค. (data-type, aria-label) p.s: 'aria-'๋Š” ์ ‘๊ทผ์„ฑ๊ณผ ๊ด€๋ จ๋œ ์„ค์ •.

  • HTML์˜ Attribute์™€ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๊ฐ€์ง€๋Š” Attribute๊ฐ€ ์žˆ๋‹ค. (class -> className, for -> htmlFor)

  • HTML์˜ Attribute์™€ ๋‹ค๋ฅธ ๋™์ž‘ ๋ฐฉ์‹์„ ๊ฐ€์ง„ Attribute๊ฐ€ ์žˆ๋‹ค. ( checked(defaultChecked), value(defaultValue), style )

  • React์—์„œ๋งŒ ์“ฐ์ด๋Š” ์ƒˆ๋กœ์šด Attribute๊ฐ€ ์žˆ๋‹ค. (key, dangerouslySetInnerHTML)

HTML๊ณผ ๋‹ค๋ฅธ ๋ฐฉ์‹์˜ React Attribute(checked,value)

(<input type='checkbox' checked={false}/>)

HTML์—์„œ checked ๋˜๋Š” value๋Š” ํ•ด๋‹น ๊ฐ’์ด '์ดˆ๊ธฐ๊ฐ’'์œผ๋กœ ์“ฐ์ด์ง€๋งŒ, React ๋‚ด์—์„œ๋Š” ํ˜„์žฌ ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, checked ๊ฐ’์ด false๋กœ ๊ณ ์ •๋˜์žˆ๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ์ž๊ฐ€ checked๋ฅผ ํด๋ฆญํ•ด๋„ ๊ฐ’์˜ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.
๋งŒ์•ฝ, '์ดˆ๊ธฐ๊ฐ’'์˜ ์˜๋ฏธ๋กœ checked ๋˜๋Š” value๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, defaultChecked, defaultValue Attribute๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

React์—์„œ๋งŒ ์“ฐ์ด๋Š” ์ƒˆ๋กœ์šด Attribute(key)

const Names = () => {
   const names = [
   	{key: '1', value: 'Alex'},
        {key: '2', value: 'Justin'},
        {key: '3' value: 'Claire'},
   ];
   return (
   	<div>
	   {names.map((item) => {
  		<li key={item.key}>{item.value}</li>
  	   ))};
	</div>
   )
};

Key๋Š” React๊ฐ€ ์–ด๋–ค ํ•ญ๋ชฉ์„ ๋ณ€๊ฒฝ, ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œํ•  ์ง€ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์„ ๋•๋Š”๋‹ค.
Key๋Š” Element์— ์•ˆ์ •์ ์ธ ๊ณ ์œ ์„ฑ์„ ๋ถ€์—ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ Element์— ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
Key๋Š” ๋ฐฐ์—ด ์•ˆ์—์„œ ํ˜•์ œ ์‚ฌ์ด์—์„œ ๊ณ ์œ ํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ „์ฒด ๋ฒ”์œ„์—์„œ ๊ณ ์œ ํ•  ํ•„์š”๋Š” ์—†๋‹ค.
๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ๋ฐฐ์—ด์„ ๋งŒ๋“ค ๋•Œ ๋™์ผํ•œ key๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

State

State๋Š” Component ๋‚ด์—์„œ ์œ ๋™์ ์œผ๋กœ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•œ ๋™์ž‘์ด๋‚˜ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์— ์˜ํ•ด ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋ณ€ํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.

State ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ณ  ์žฌ๋ Œ๋”๋ง์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— React๊ฐ€ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์„ ๋ Œ๋”๋งํ•œ๋‹ค.

import {useState} from 'react';

function Example() {
    const [count, setCount] = useState(0);
    return (
    	<div>
            <p>๋ฒ„ํŠผ์„ {count}๋ฒˆ ๋ˆŒ๋ €์Šต๋‹ˆ๋‹ค.</p>
            <button onClick={() => setCount(count +)}>
              ํด๋ฆญ
  	    </button>
  	</div>
    );
}

State ๊ฐ’์€ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

import {useState} from 'react';

function Example() {
    const [count, setCount] = useState(0);
    return (
    	<div>
            <p>๋ฒ„ํŠผ์„ {count}๋ฒˆ ๋ˆŒ๋ €์Šต๋‹ˆ๋‹ค.</p>
            <button onClick={() => {count = count + 1;}>
              ํด๋ฆญ
  	    </button>
  	</div>
    );
}

State๊ฐ’์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋ฉด React๊ฐ€ Component๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•  ํƒ€์ด๋ฐ์„ ์•Œ์•„์ฐจ๋ฆฌ์ง€ ๋ชปํ•œ๋‹ค.

๋ฐ˜๋“œ์‹œ setState ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.
setState ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์‹œ, React์—๊ฒŒ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋ผ๋Š” ๋ช…๋ น์ด ๋‚ด๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

State๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•

setState๋‚ด์— ๋ณ€๊ฒฝํ•  ๊ฐ’์„ ๋„ฃ๊ธฐ

const [count,setCount] = useState(0);
setCount(count+1);

setState์— ํ•จ์ˆ˜ ๋„ฃ๊ธฐ

const [count,setCount] = useState(0);
setCount((current) => {
    return current + 1
}

setState ํ•จ์ˆ˜์—๋Š” ๋ณ€๊ฒฝํ•  ๊ฐ’์„ ์ง์ ‘ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๊ณ , ํ•จ์ˆ˜๋ฅผ ๋„ฃ๋Š” ๋ฐฉ๋ฒ• ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
ํ•จ์ˆ˜๋ฅผ ๋„ฃ๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜(return)ํ•˜๋Š” ๊ฐ’์œผ๋กœ State๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.
ํ˜„์žฌ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ State๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ์—๋Š” ํ•จ์ˆ˜๋ฅผ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•์ด ๊ถŒ์žฅ๋œ๋‹ค.

Object๋ฅผ ๊ฐ–๋Š” State๋ฅผ ๋งŒ๋“ค ๋•Œ ์ฃผ์˜์‚ฌํ•ญ

const [user,setUser] = useState({name:'๋ฏผ์ˆ˜', grade: 1})

setUser((current) => {
    current.grade = 2;
    return current;
})

Object๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ–๋Š” State๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ๊ฒฝ์šฐ React๊ฐ€ State์˜ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

State์•ˆ ๊ฐ์ฒด์˜ ์š”์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์ง€๋งŒ, State ์ž์ฒด๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ,

๊ฐ์ฒด ์š”์†Œ๋ฅผ ๋‹ด๋Š” object ์ž์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, React๊ฐ€ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์กด ๊ฐ์ฒด์˜ ๋‚ด์šฉ์„ ์ƒˆ๋กœ์šด object์— ๋‹ด์€ ํ›„ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์˜ณ์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

const [user,setUser] = useState({name: '๋ฏผ์ˆ˜', grade: 1})
setUser((current) => {
	//๊ฐ’์„ ๋ณต์‚ฌ
    const newUser = {...current};
    newUser.grade = 2;
    return current;
})

์ด์™€ ๊ฐ™์ด ํ˜„์žฌ State์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ๋งŒ๋“  ์ƒˆ๋กœ์šด ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ํ†ต์งธ๋กœ ๋ฐ˜ํ™˜ํ•ด์•ผ React๊ฐ€ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ด๋ฅผ ํ™”๋ฉด์— ๋ฐ˜์˜ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

ํ•œ์ค„ ํ‰: ๋ฆฌ์•กํŠธ๋ฅผ ํ™œ์šฉํ•œ ๊ฐœ๋ฐœ์— ์žˆ์–ด ์ค‘์š”ํ•œ ๊ธฐ๋ณธ ๊ฐœ๋…์ธ Props(์†์„ฑ์š”์†Œ)์™€ State(์ƒํƒœ๊ฐ’)์— ๋Œ€ํ•ด ์ œ๋Œ€๋กœ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

profile
์‚ฌ์šฉ์ž์˜ ํŽธ์˜๋ฅผ ๋” ์ƒ๊ฐํ•˜๊ณ  ํŽธ์•ˆํ•œ UI/UX ๊ฐœ๋ฐœ์„ ๊ฟˆ๊พธ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ง€๋ง์ƒ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€