[๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ ] 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;
props
๋ ๋๋ง#
JSX ๋ด๋ถ์์ ์ด๋ ๊ฒ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ 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
๋ ์ ๋์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.