[๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ ] 3์ฅ - Component

์ด ๊ธ์ ๊น๋ฏผ์ค(velopert)๋์ ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ ์์ฐธ์กฐํ์ฌ ์์ฑํ ๊ธ์ ๋๋ค.
๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ธํฐํ์ด์ค๋ ์ฌ๋ฌ ๊ฐ์ง ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ๋ฆฌ์กํธ์์ ์ปดํฌ๋ํธ๋๋จ์ํ ํ ํ๋ฆฟ ์ด์์ ๊ธฐ๋ฅ์ ์ํํ๋ค. ๋ฐ์ดํฐ์ ๋ฐ๋ผ UI๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ , ๋ผ์ดํ์ฌ์ดํด API๋ฅผ ์ด์ฉํด ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์์ ๋ํ๋ ๋, ์ฌ๋ผ์ง ๋, ๋ณํ๊ฐ ์ผ์ด๋ ๋ ์ฃผ์ด์ง ์์ ์ ์ฒ๋ฆฌํ๊ณ , ์์ ๋ฉ์๋๋ก ํน๋ณํ ๊ธฐ๋ฅ์ ๋ถ์ฌ์ค ์ ์๋ค.
์ปดํฌ๋ํธ์๋ ํด๋์คํ ์ปดํฌ๋ํธ์ ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ์๋๋ฐ, ๋จผ์ ํด๋์คํ ์ปดํฌ๋ํธ๋ถํฐ ์์๋ณธ๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ#
2์ฅ์์ ๋ณธ App.js ์ฒ๋ผ function ํค์๋๋ก ์ ์ธ๋์ด ์๊ณ ์ปดํฌ๋ํธ๋ฅผ return ํ๋ ๊ตฌ์กฐ๋ก ๋์ด์๋ ์ปดํฌ๋ํธ๊ฐ ํจ์ํ ์ปดํฌ๋ํธ์ด๋ค.
๋ฐ๋ฉด ํด๋์คํ ์ปดํฌ๋ํธ์ ์ฝ๋ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
App.js
import React, {Component} from 'react';
class App extends Component { render() { const name = 'react'; return <div classNme="react">{name}</div>; }}
export default App;์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด App class๋ ๋ฆฌ์กํธ Component ๋ฅผ ํ์ฅํ๊ณ ์๊ณ , render() ํจ์๋ฅผ ๊ฐ๊ณ ์์ผ๋ฉฐ, render ํจ์์์ ๋ณด์ฌ์ค JSX๋ฅผ ๋ฐํํ๊ณ ์๋ค. ํด๋์คํ ์ปดํฌ๋ํธ์์๋ ์ด render ํจ์๊ฐ ๊ผญ ์์ด์ผ ํ๋ค.
ํจ์ํ vs ํด๋์คํ#
๊ทธ๋ฌ๋ฉด ์ด๋ค ํจ์ํ ์ปดํฌ๋ํธ์ ํด๋์คํ ์ปดํฌ๋ํธ์ ์ด๋ค ์ฐจ์ด๊ฐ ์์๊น?
ํจ์ํ ์ปดํฌ๋ํธ๋ ํด๋์คํ ์ปดํฌ๋ํธ๋ณด๋ค ์ ์ธ์ด ํธ๋ฆฌํ๊ณ , ๋ฉ๋ชจ๋ฆฌ ์์์ ๋ ์ฌ์ฉํ๋ฉฐ, ๋ฐฐํฌ์ ๊ฒฐ๊ณผ๋ฌผ์ ํฌ๊ธฐ๊ฐ ๋ ์๋ค. ์ฃผ์ ๋จ์ ์ผ๋ก๋ state ์ ๋ผ์ดํ์ฌ์ดํด API ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ์ ์ด์๋๋ฐ, ๋ฆฌ์กํธ v16.8 ์ดํ Hooks ๊ธฐ๋ฅ์ ๋์
์ผ๋ก ํด๊ฒฐ๋์๋ค.
๋ฆฌ์กํธ ๊ณต์ ๋งค๋ด์ผ์์ ํจ์ํ ์ปดํฌ๋ํธ์ Hooks๋ฅผ ๊ถ์ฅํ๋ ๋งํผ ํจ์ํ ์ปดํฌ๋ํธ๋ก์์ฑํ๋ ๊ฒ์ด ์ ์ ์ค์ํด์ง๊ณ ์์ง๋ง, ํด๋์คํ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง๋ ๊ฒ์ด ์๋๋ฏ๋กํด๋์คํ ์ปดํฌ๋ํธ์ ๊ธฐ๋ฅ์ ์์๋ ํ์๊ฐ ์๋ค.
์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ#
์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ create react-app ์ผ๋ก ๋ง๋ ๋ฆฌ์กํธ ํ๋ก์ ํธ์์ src ๋๋ ํ ๋ฆฌ์ ์ปดํฌ๋ํธ ํ์ผ NewComponent.js ์ ์์ฑํ๋ค.
NewComponent.js
import React from 'react';
const NewComponent = () => { return <div>Hello React Component!</div>;};
export default NewComponent;๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ(Export) ๋ฐ ๋ถ๋ฌ์ค๊ธฐ(Import)#
์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ฉด ๋งจ ์๋ ์ค ์ฝ๋์ฒ๋ผ ํด๋น ํด๋์ค๋ฅผ ๋ค๋ฅธ ํ์ผ์์ import ํ ์์๋๋ก export ํด์ฃผ์ด์ผ ํ๋ค.
export default NewComponent;๊ทธ๋ฆฌ๊ณ ๋์ ์ด ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์ฌ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ import ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์๋ค.
import React from 'react';import NewComponent from './NewComponent';
const App = () => { return ( <div> <NewComponent /> </div> );};
export default App;props#
props ๋ properties๋ฅผ ์ค์ธ ํํ์ผ๋ก ์ปดํฌ๋ํธ ์์ฑ์ ์ค์ ํ ๋ ์ฌ์ฉํ๋ ์์์ด๋ค. props ๊ฐ์ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์ ์ฌ์ฉํ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ค์ ํ ์ ์๋ค.
์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ๋ props ๊ฐ ์ง์ ํ๊ธฐ#
์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ props ๊ฐ์ ์ง์ ํ ์ ์๋ค. App.js ์์์ฌ์ฉํ๋ NewComponent ์ props ๊ฐ์ ์ง์ ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์๋ค.
App.js
import React from 'react';import NewComponent from './NewComponent';
const App = () => { return ( <div> <NewComponent name="younho9" /> </div> );};
export default App;JSX ๋ด๋ถ์์ props ๋ ๋๋ง#
์ด๋ ๊ฒ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ NewComponent ์ ์ง์ ํ name ์ด๋ผ๋ ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ด NewComponent ์์ props ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์์ ์ฌ์ฉ ํ ์ ์๋ค.
NewComponent.js
import React from 'react';
const NewComponent = (props) => { return <div>Hello, React Component! I'm {props.name}</div>;};
export default NewComponent;props ๊ธฐ๋ณธ๊ฐ ์ค์ : defaultProps#
๋ง์ฝ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ props ๊ฐ์ ์ง์ ํ์ง ์์์ ๊ฒฝ์ฐ์ defaultProps ๋ก ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ ์ ์๋ค.
import React from 'react';
const NewComponent = (props) => { return <div>Hello, React Component! I'm {props.name}</div>;};
NewComponent.defaultProps = { name: 'default name',};
export default NewComponent;ํ๊ทธ ์ฌ์ด์ ๋ด์ฉ์ ๋ณด์ฌ์ฃผ๋ children#
๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ๋, children ์ด๋ผ๋ props ๋ ์ปดํฌ๋ํธ ํ๊ทธ ์ฌ์ด์๋ด์ฉ์ ๋ณด์ฌ์ค๋ค.
App.js
import React from 'react';import NewComponent from './NewComponent';
const App = () => { return <NewComponent>React</NewComponent>;};
export default App;์ ์ฝ๋์์ NewComponent ํ๊ทธ ์ฌ์ด์ ์์ฑํ React ๋ผ๋ ๋ฌธ์์ด์ NewComponent ๋ด๋ถ์์ ๋ณด์ฌ์ฃผ๋ ค๋ฉด props.children ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
NewComponent.js
import React from 'react';
const NewComponent = (props) => { return ( <div> Hello, React Component! My name is {props.name} <br /> Children is {props.children} </div> );};
NewComponent.defaultProps = { name: 'default name',};
export default NewComponent;๋น๊ตฌ์กฐํ ํ ๋น ๋ฌธ๋ฒ์ ํตํด props ๋ด๋ถ ๊ฐ ์ถ์ถํ๊ธฐ#
ํ์ฌ NewComponent ์์ props ๋ฅผ ์กฐํํ ๋๋ง๋ค props. ์ผ๋ก ์์ํ๋ ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ์ด์ผ ํ๋๋ฐ, ์ด๋ฅผ ํธํ๊ฒ ํ๊ธฐ ์ํด ES6 ๋ฌธ๋ฒ์ธ ๋น๊ตฌ์กฐํ ํ ๋น์ ์ฌ์ฉํ ์์๋ค.
NewComponent.js
import React from 'react';
const NewComponent = (props) => { const {name, children} = props; return ( <div> Hello, React Component! My name is {name} <br /> Children is {children} </div> );};
NewComponent.defaultProps = { name: 'default name',};
export default NewComponent;ํจ์์ ํ๋ผ๋ฏธํฐ ๋ถ๋ถ์์ ๋ฐ๋ก ๋น๊ตฌ์กฐํ ํ ๋น ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์๋ ์๋ค.
NewComponent.js
import React from 'react';
const NewComponent = ({name, children}) => { return ( <div> Hello, React Component! My name is {name} <br /> Children is {children} </div> );};
NewComponent.defaultProps = { name: 'default name',};
export default NewComponent;propTypes ๋ฅผ ํตํ props ๊ฒ์ฆ#
์ปดํฌ๋ํธ์ ํ์ props ์ง์ ๋๋ props ํ์
์ง์ ์ ์ํด propTypes ๋ฅผ ์ฌ์ฉํ๋ค.
NewComponent.js
import React from 'react';import PropTypes from 'prop-types';
const NewComponent = ({name, children}) => { return ( <div> Hello, React Component! My name is {name} <br /> Children is {children} </div> );};
NewComponent.defaultProps = { name: 'default name',};
NewComponent.propTypes = { name: PropTypes.string,};
export default NewComponent;๋จผ์ PropTypes ๋ฅผ import ๊ตฌ๋ฌธ์ผ๋ก ๋ถ๋ฌ์ค๊ณ , defaultProps ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฝ๋ ํ๋จ์ ์ ์ํ๋ค. ๋ค์์ ์ ์๋ name ์์ฑ์ด ๋ฐ๋์ ๋ฌธ์์ด(string) ํํ๋ก ์ ๋ฌ๋์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋ง์ฝ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ App ์ปดํฌ๋ํธ์์ name ๊ฐ์ ๋ฌธ์์ด์ด ์๋ ์ซ์๋ก ์ ๋ฌํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?

ํ๋ฉด์ ๊ฐ์ด ๋ ๋๋ง๋์ด ๋ํ๋๊ธฐ๋ ํ์ง๋ง, Console์ ์ด์ด๋ณด๋ฉด ๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ๋ณผ ์์๋๋ฐ, NewComponent ์ name prop ์ string ํ์
์ด ๋ค์ด์ฌ ๊ฒ์ผ๋ก ์๊ฐํ์ง๋ง ์ ํจํ์ง ์์ number ํ์
์ด ๋ค์ด์๋ค๊ณ ํ์ํ๊ณ ์๋ค.
์ด๋ ๊ฒ props ์ ์ํ๋ ํ์
์ ์ง์ ํ ์ ์๋ ๊ฒ์ด๋ค.
๋ํ isRequired ๋ฅผ ์ฌ์ฉํ๋ฉด, ํ์ propTypes ๋ฅผ ์ง์ ํ ์ ์๋ค. propTypes ๋ฅผ์ง์ ํ ๋ ๋ค์ isRequired ๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
NewComponent.propTypes = { name: PropTypes.string.isRequired,};์ด๋ ๊ฒ ํ๋ฉด name prop ์ ๋ง์ฝ ์ง์ ํ์ง ์๋๋ค๋ฉด ๊ฒฝ๊ณ ๋ฉ์์ง๊ฐ ๋ํ๋๊ฒ ๋๋ค.
PropTypes ์๋ ๋ฐฐ์ด, ํจ์, ์ซ์ ๋ฑ ์ฌ๋ฌ ์ข ๋ฅ๋ฅผ ์ค์ ํ ์ ์๋ค. ์๋์ ๋งํฌ์์์์ธํ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ์์ props ์ฌ์ฉํ๊ธฐ#
ํด๋์คํ ์ปดํฌ๋ํธ์์ props ๋ฅผ ์ฌ์ฉํ ๋๋ render ํจ์์์ this.props ๋ฅผ์กฐํํ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ defaultProps ์ propTypes ๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ค์ ํ ์์๋ค.
NewComponent.js
import React, {Component} from 'react';import PropTypes from 'prop-types';
class NewComponent extends Component { render() { const {name, children} = this.props; return ( <div> Hello, React Component! My name is {name} <br /> Children is {children} </div> ); }}
NewComponent.defaultProps = { name: 'default name',};
NewComponent.propTypes = { name: PropTypes.string.isRequired,};
export default NewComponent;ํด๋์คํ ์ปดํฌ๋ํธ์์๋ defaultProps ์ propTypes ๋ฅผ class ๋ด๋ถ์์ ์ง์ ํ ์๋ ์๋ค.
import React, {Component} from 'react';import PropTypes from 'prop-types';
class NewComponent extends Component { static defaultProps = { name: 'default name', };
static propTypes = { name: PropTypes.string.isRequired, }; render() { const {name, children} = this.props; return ( <div> Hello, React Component! My name is {name} <br /> Children is {children} </div> ); }}
export default NewComponent;state#
๋ฆฌ์กํธ์์ state ๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๋ฐ๋ ์ ์๋ ๊ฐ์ ์๋ฏธํ๋ค. props ๋์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉ๋๋ ๊ณผ์ ์์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์ค์ ํ๋ ๊ฐ์ด๊ณ , ์ปดํฌ๋ํธ ์์ ์ props ๋ฅผ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
๋ฆฌ์กํธ์๋ ๋ ๊ฐ์ง ์ข
๋ฅ์ state ๊ฐ ์๋๋ฐ, ํ๋๋ ํด๋์คํ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ง๊ณ ์๋ state ์ด๊ณ , ๋ค๋ฅธ ํ๋๋ ํจ์ํ ์ปดํฌ๋ํธ์์ useState ๋ผ๋ ํจ์๋ฅผ ํตํด์ฌ์ฉํ๋ state ์ด๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ์ state#
src ๋๋ ํฐ๋ฆฌ์ ์๋ก์ด Counter.js ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ ๋ค.
Counter.js
import React, {Component} from 'react';
class Counter extends Component { constructor(props) { super(props); this.state = { number: 0, }; } render() { const {number} = this.state; return ( <div> <h1>{number}</h1> <button onClick={() => { this.setState({number: number + 1}); }} > +1 </button> </div> ); }}
export default Counter;์ปดํฌ๋ํธ์ state ๋ฅผ ์ค์ ํ ๋๋, constructor ๋ฉ์๋๋ฅผ ์์ฑํ์ฌ ์ค์ ํ๋ค. ์ด๋ ์ปดํฌ๋ํธ์ ์์ฑ์ ๋ฉ์๋๋ก, ๋ฐ๋์ super(props) ๋ฅผ ํธ์ถํ์ฌ, ๋ฆฌ์กํธ Component ํด๋์ค๊ฐ ์ง๋ ์์ฑ์ ํจ์๋ฅผ ํธ์ถํด ์ฃผ์ด์ผํ๋ค.
๊ทธ ๋ค์ this.state ๊ฐ์ ์ด๊ธฐ๊ฐ์ ์ค์ ํด์ฃผ๋๋ฐ, ์ปดํฌ๋ํธ์ state ๋ ๊ฐ์ฒด ํ์์ด์ด์ผ ํ๋ค.
render ํจ์์์ ํ์ฌ state ๋ฅผ ์กฐํํ ๋๋ this.state ๋ฅผ ์กฐํํ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ button ์ onClick ์ด๋ผ๋ ๊ฐ์ props ๋ก ๋ฃ์ด์ฃผ๋๋ฐ, ์ด๋ ๋ฒํผ์ ํด๋ฆญํ ๋ ํธ์ถ ์ํฌ ํจ์๋ฅผ ์ค์ ํ๋ค. (์ด๋ฒคํธ)
์ด๋ฒคํธ๋ก ์ค์ ํ ํจ์๋ฅผ ํ์ดํ ํจ์ ๋ฌธ๋ฒ์ ์ฌ์ฉํด์ ๋ฃ์ด์ฃผ์๋ค. ํจ์ ๋ด๋ถ์์๋ this.setState ๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด๋ state ๊ฐ์ ๋ฐ๊ฟ ์ ์๊ฒ ํด์ค๋ค.
์ด์ Counter ์ปดํฌ๋ํธ๋ฅผ App์์ ๋ถ๋ฌ์ ๋ ๋๋งํ๋ค.
App.js
import React from 'react';import Counter from './Counter';
const App = () => { return <Counter />;};
export default App;
๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ซ์๊ฐ 1์ฉ ์ฌ๋ผ๊ฐ๋ค.
์์์ constructor ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ฐ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ฐ๋จํ๊ฒ state ์ ์ด๊ธฐ๊ฐ์ ์ง์ ํ ์ ์๋ค.
import React, {Component} from 'react';
class Counter extends Component { state = { number: 0, }; render() { const {number} = this.state; return ( <div> <h1>{number}</h1> <button onClick={() => { this.setState({number: number + 1}); }} > +1 </button> </div> ); }}
export default Counter;this.setState ์ ๊ฐ์ฒด ๋์ ํจ์ ์ธ์ ์ ๋ฌํ๊ธฐ#
this.setState ๋ state ๊ฐ์ ๋น๋๊ธฐ์ ์ผ๋ก ์
๋ฐ์ดํธํ๋ค. ๋ง์ฝ onClick ํจ์๋ด๋ถ๊ฐ ๋ค์๊ณผ ๊ฐ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
onClick={() => { this.setState({ number: number + 1 }); this.setState({ number: this.state.number + 1 });}}this.setState ๋ฅผ ๋ ๋ฒ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ Click ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ซ์๊ฐ 2์ฉ์ฆ๊ฐํ ๊ฒ ๊ฐ์ง๋ง, ์ซ์๊ฐ 1์ฉ ์ฆ๊ฐํ๋๋ฐ, this.setState ๋ฅผ ํ๊ณ ๋์ state ๊ฐ์ด๋ฐ๋ก ๋ฐ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฅผ ๊ฐ์ฒด ๋์ ์ ํจ์๋ฅผ setState ์ ์ธ์๋ก ๋ฃ์ด์ค์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
onClick={() => { this.setState(prevState => ({ number: prevState.number + 1 })); this.setState(prevState => ({ number: prevState.number + 1 }));}}์ด๋ ๊ฒ setState ์ ์ธ์๋ก ํจ์๋ก ๋ฃ์ด์ฃผ๋ฉด 2์ฉ ์ฆ๊ฐํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
this.setState ๊ฐ ๋๋ ํ ํน์ ์์
์คํํ๊ธฐ#
setState ํจ์์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฑ๋กํ์ฌ setState ๊ฐ ๋๋ ํํน์ ์์
์ ์ฒ๋ฆฌํ ์ ์๋ค.
<button onClick={() => { this.setState( (prevState) => ({ number: prevState.number + 1, }), () => { console.log('setState๊ฐ ํธ์ถ๋์์ต๋๋ค.'); }, ); }}> +1</button>ํจ์ํ ์ปดํฌ๋ํธ์์ useState ์ฌ์ฉํ๊ธฐ#
๋ฆฌ์กํธ 16.8 ์ด์ ๋ฒ์ ์์๋ ํจ์ํ ์ปดํฌ๋ํธ์์ state ๋ฅผ ์ฌ์ฉํ ์ ์์๋๋ฐ, 16.8์ดํ๋ก๋ useState ํจ์๋ก ํจ์ํ ์ปดํฌ๋ํธ์์๋ state ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ๋์๋ค. ์ด ๊ณผ์ ์์ Hooks๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๊ฒ ๋๋ค.
src ๋๋ ํ ๋ฆฌ์ Say.js ๋ฅผ ์์ฑํ๋ค.
Say.js
import React, {useState} from 'react';
const Say = () => { const [message, setMessage] = useState(''); const onClickEnter = () => setMessage('Hi!'); const onClickLeave = () => setMessage('Bye!');
return ( <div> <button onClick={onClickEnter}>Enter</button> <button onClick={onClickLeave}>Exit</button> <h1>{message}</h1> </div> );};
export default Say;์ฝ๋ ์ฒซ ์ค์ ๋ณด๋ฉด useState ๋ฅผ import ํ๋ค. ๊ทธ๋ฆฌ๊ณ useState ํจ์๋ฅผ ์ฌ์ฉํ๋๋ฐ , ํจ์์ ์ธ์์๋ ์ํ์ ์ด๊น๊ฐ์ ๋ฃ์ด์ค ์ ์๋ค. ํด๋์คํ ์ปดํฌ๋ํธ์์์ state ์ด๊น๊ฐ์ ๊ฐ์ฒด ํํ๋ก ๋ฃ์ด์ฃผ์ด์ผ ํ์ง๋ง, useState ์์ ๊ฐ์ ํํ๋ ์์ ์ด๋ค.
ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ฐฐ์ด์ด ๋ฐํ๋๋๋ฐ, ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์๋ ํ์ฌ ์ํ, ๋ ๋ฒ์งธ ์์๋ ์ํ๋ฅผ ๋ฐ๊พธ์ด ์ฃผ๋ ์ธํฐ(Setter) ํจ์์ด๋ค. ์ด๋ฅผ ๋น๊ตฌ์กฐํ ํ ๋น์ผ๋ก message , setMessage ์ ํ ๋นํด ์ฃผ๊ณ ์๋ค. onClickEnter ํจ์๋ 'Hi!' ๋ผ๋ ๋ฉ์์ง๋ก state ๋ฅผ ์ธํ
ํ๋ ํจ์์ด๊ณ , onClickLeave ํจ์๋ 'Bye!' ๋ผ๋ ๋ฉ์์ง๋ก state ๋ฅผ ์ธํ
ํ๋ ํจ์์ด๋ค.

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด Enter, Exit ๋ฒํผ์ ํด๋ฆญํ ๋ ๋ฉ์์ง๊ฐ ๋ณํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
useState ๋ ํ ์ปดํฌ๋ํธ์์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ ์ ์๋ค. ์์ ๊ด๋ฆฌํ๋ color ๋ฅผ state ์ ์ถ๊ฐํ๋ค.
import React, {useState} from 'react';
const Say = () => { const [message, setMessage] = useState(''); const onClickEnter = () => setMessage('Hi!'); const onClickLeave = () => setMessage('Bye!');
const [color, setColor] = useState('black');
return ( <div> <button onClick={onClickEnter}>Enter</button> <button onClick={onClickLeave}>Exit</button> <h1 style={{color}}>{message}</h1> <button style={{color: 'red'}} onClick={() => setColor('red')}> Red </button> <button style={{color: 'green'}} onClick={() => setColor('green')}> Green </button> <button style={{color: 'blue'}} onClick={() => setColor('blue')}> Blue </button> </div> );};
export default Say;JSX inline style ๋ฌธ๋ฒ
style={ ๊ฐ์ฒด }์ด๋ฏ๋กcolor๋ ํ์ฌ ๋ฌธ์์ด.{ color }๋ก ํ๋ฉด{ color : "black" }๋ก ๊ฐ์ฒด ํํ๊ฐ ๋๋ค. ๋ฐ๋ผ์style={{ color }}๊ฐ ์ณ์ ๋ฌธ๋ฒ.

state ๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ ์ฌํญ#
ํด๋์คํ, ํจ์ํ ์ปดํฌ๋ํธ ๋ชจ๋ state ์ ๊ฐ์ ๋ฐ๊พธ์ด์ผ ํ ๋๋ setState ํน์ useState ๋ฅผ ํตํด ์ ๋ฌ๋ฐ์ ์ธํฐ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๋ค์ ์ฝ๋์ฒ๋ผ state ๊ฐ์ ์ง์ ๋ณ๊ฒฝํด์๋ ์๋๋ค.
// ํด๋์คํ ์ปดํฌ๋ํธthis.state.number = this.state.number + 1;this.state.array = this.array.push(2);this.state.object.value = 5;
// ํจ์ํ ์ปดํฌ๋ํธconst [object, setObject] = useState({a: 1, b: 1});object.b = 2;์๋ํ๋ฉด ๋ฆฌ์กํธ์์๋ state ์ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ , ๋ณ๊ฒฝ๋ ๋ถ๋ถ์ ๋ฆฌ๋ ๋๋ง์ ํ๋๋ฐ setState (๋๋ useState ์ ์ธํฐ ํจ์)๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ง์ state ๊ฐ์์์ ํ ๊ฒฝ์ฐ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ์ฐธ์กฐ๊ฐ์ ๊ฐ์ง๋ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๋ฅผ ์
๋ฐ์ดํธํด์ผ ํ ๋๋ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด ์ฌ๋ณธ์๋ง๋ค๊ณ , ์ฌ๋ณธ์ ๊ฐ์ ์
๋ฐ์ดํธ ํ ํ, ๊ทธ ์ฌ๋ณธ์ ์ํ๋ฅผ setState ํน์ ์ธํฐ ํจ์๋ฅผํตํด ์
๋ฐ์ดํธ ํด์ผํ๋ค.
// ๊ฐ์ฒดconst object = {a: 1, b: 2, c: 3};const nextObject = {...object, b: 2};
// ๋ฐฐ์ดconst array = [ {id: 1, value: true}, {id: 2, value: true}, {id: 3, value: false},];const nextArray = array.concat({id: 4});๊ฐ์ฒด์์๋ spread ์ฐ์ฐ์ ์ฌ์ฉ, ๋ฐฐ์ด์์๋ ๋ฐฐ์ด ๋ด์ฅํจ์๋ฅผ ์ฌ์ฉ
์ ๋ฆฌ#

props ์ state ๋ชจ๋ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๊ฑฐ๋ ๋ ๋๋งํ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์์ง๋ง, props ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์ค์ ํ๊ณ , state ๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๊ฐ์ ์
๋ฐ์ดํธํ๋ค.
props ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ด ๋ฌด์กฐ๊ฑด ๊ณ ์ ์ ์ด์ง ์์๋ฐ, ๋ถ๋ชจ ์ปดํฌ๋ํธ์ state ๋ฅผ์์ ์ปดํฌ๋ํธ์ props ๋ก ์ ๋ฌํ๊ณ , ์์ ์ปดํฌ๋ํธ์์ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค๋ฉด, props ๋ ์ ๋์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.