-
React :: Component, Props, StatePROGRAMMING/React 2021. 3. 20. 19:32
Component
๊ฐ๋ ์ ์ผ๋กJavaScript ํจ์์ ์ ์ฌํ Component ๋,
- Props ๋ผ๋ ์ ๋ ฅ์ ๋ฐ๊ณ ,
- ๋ก์ปฌ State ๋ฅผ ๊ฐ์ง๊ณ ,
- React Element ๋ฅผ ๋ฐํํ๋ค.
๋ฐ๋ผ์ ์ปดํฌ๋ํธ๋ฅผ ํตํด ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ๋ณ '์กฐ๊ฐ'์ ๋ง๋ค ์ ์๋ค.
๊ฐ์ฅ ๊ฐ๋จํ, ์ด๋ฆ์ Props ๋ก ๋ฐ์์ "Hello, {user}" ๋ฅผ ๋ณด์ฌ์ฃผ๋ Element ๋ฅผ ๋ฐํํ๋ Component ๊ฐ ์๋ค๊ณ ํ์.
๊ทธ๋ฌ๋ฉด ๊ทธ Component ๋ฅผ ๋ค๋ฅธ Compnent ์์ import ํด์ ํ ์กฐ๊ฐ์ ๊ฐ๋ค ๋ถ์ด๋ฏ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค.
* Props ์ ๊ฐ๋ ์ ๋ฐ์์ ๋ค๋ฃจ๊ณ , ์ผ๋จ Component ๊ฐ ์ธ๋ถ์์ ๋ฐ์์ค๋ ๋ฐ์ดํฐ ๋ผ๊ณ ๋ง ์๊ณ ์์.
์ฃผ์ํ ์ฌํญ์, Component ์ด๋ฆ์ ํญ์! ๋๋ฌธ์๋ก ์์ํ๋ค.
React ๋ ์๋ฌธ์๋ก ์์ํ๋ ์ปดํฌ๋ํธ๋ DOM ํ๊ทธ (div ๋ฑ) ๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฐ Component ๋ฅผ ์ ์ํ๋ ค๋ฉด ํด๋์ค/ํจ์ ๋ฅผ ํตํด ์ ์ํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋๋ฐ, ํ๋์ฉ ์ดํด๋ณด์.
ํจ์ ์ปดํฌ๋ํธ
Component ๋ฅผ ์ ์ํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก, JavaScript ํจ์๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค.
function Welcome(props) { return <h1>Hello, {props.name}</h1>; }
๋ณด๋ฉด ์ ์ ์๋ฏ, JavaScript ํจ์์ด๋ฏ๋ก "ํจ์ ์ปดํฌ๋ํธ" ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ด๋ ํ์ฌ CRA (Creat-React-App. 2021.03.19) ๋ฅผ ํตํด ์ React ์ฑ์ ๋ง๋ค์์ ๋
./my-app/src/App.js ์์ ์ฌ์ฉํ ์ปดํฌ๋ํธ ์ ์ ๋ฐฉ์์ด๋ค.
import logo from './logo.svg'; import './App.css'; function App() { return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <p> Edit <code>src/App.js</code> and save to reload. </p> <a className="App-link" href="https://reactjs.org" target="_blank" rel="noopener noreferrer" > Learn React </a> </header> </div> ); } export default App;
์ด๋ฐ ์์ผ๋ก App Component ๋ฅผ ๋ง๋ค๊ณ , export ํ์ฌ ๋ค๋ฅธ ๊ณณ์์๋ App Component ๋ฅผ ์ฌ์ฉํ๋๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ด Component ์ ์ฌ์ฉ ๊ฐ๋ ์ด๋ค.
ํด๋์ค ์ปดํฌ๋ํธ
ES6 Class ๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ ์๋ ์๋ค.
class Welcome extends React.Component { render() { return <h1>Hello, {this.props.name}</h1>; } }
์ด๋ ์์์ ์์ฑํ Welcome ๊ณผ React ๊ด์ ์์๋ ๋์ผํ๋ค!
๋ค๋ง ๋ ๋ฐฉ์์์ ์๋ก ๋ค๋ฅธ ์ถ๊ฐ ๊ธฐ๋ฅ๋ค์ด ์กด์ฌํ๋ค.
ํจ์ ์ปดํฌ๋ํธ๋ก ์์ฑํ๋ฉด ๊ฐ๊ฒฐํ๋ค๋ ์ฅ์ ์ด,
ํด๋์ค ์ปดํฌ๋ํธ๋ก ์์ฑํ๋ฉด ์ฌ๋ฌ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค๋ ์ฅ์ ์ด ์กด์ฌํ๋ค.
์ปดํฌ๋ํธ ํฉ์ฑ
์ปดํฌ๋ํธ๋ ์์ ์ ์ถ๋ ฅ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
function Friends() { return ( <div> <Welcome name="React" /> <Welcome name="HTML" /> <Welcome name="JavaScript" /> </div> ); }
Props
์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ๋ก ์์ฑํ ์๋ฆฌ๋จผํธ๊ฐ ์์ผ๋ฉด,
JSX ์ดํธ๋ฆฌ๋ทฐํธ์ ์ง์์ ํด๋น ์ปดํฌ๋ํธ์ ๋จ์ผ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋๋ฐ,
๊ทธ ๊ฐ์ฒด๊ฐ ๋ฐ๋ก "Props" ์ด๋ค.
์ฆ, ์ง๊ธ๊น์ง๋ Element ๋ฅผ DOM ํ๊ทธ(div,,๋ฑ) ์ผ๋ก ๋ํ๋๋๋ฐ, ์ด์ ๋ ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ๋ก ๋ํ๋ผ ์ ์์ผ๋ฉด์, ๊ทธ ์ปดํฌ๋ํธ์๊ฒ porps ์ด๋ผ๋ ํํ๋ก ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด์ค ์ ์๋ค๋ ๊ฒ์ด์ด๋ค.
์์์ ๋ง๋ค์๋ Welcome ์ปดํฌ๋ํธ๋ก Element ๋ฅผ ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
const element = <Welcome name="React" />;
๊ทธ๋ผ Welcome ํจ์ ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ๊ณ , ๋ ๋๋งํ๋ ๊ณผ์ ์ ์ดํด๋ณด์.
function Welcome(props) { return <h1>Hello, {props.name}</h1>; } const element = <Welcome name="React" />; ReactDOM.render( element, document.getElementById('root') );
- <Welcome name="React" /> ์๋ฆฌ๋จผํธ๋ก ReactDOM.render() ํธ์ถ
- React ๊ฐ ์ด element ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด, {name: 'React'} ๋ฅผ props ๋ก ํ์ฌ Welcome ์ปดํฌ๋ํธ๋ฅผ ํธ์ถํ๋ค.
- Welcome ์ปดํฌ๋ํธ๋ <h1>Hello, React</h1> ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํ๋ค
- ReactDOM ์ <h1>Hello, React</h1> ์๋ฆฌ๋จผํธ์ ์ผ์นํ๋๋ก DOM ์ ์ ๋ฐ์ดํธ ํ๋ค. (๋ณ๊ฒฝ์ฌํญ๋ง, ํจ์จ์ ์ผ๋ก.)
Props ์ ์ด๋ฆ์ ์ฌ์ฉ๋ Context ๊ฐ ์๋ ์ปดํฌ๋ํธ ์์ฒด์ ๊ด์ ์์ ์ง๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
ex. author ๋ณด๋ค user ์ ๊ฐ์ด ๋ ์ผ๋ฐํ๋ ํํ๋ฅผ ์ฌ์ฉ. (์ํฉ์ ๋ฐ๋ผ์ ๋ฌ๋ผ์ง๋, ํ ๊ฐ์ง ์์์ผ ๋ฟ!)
์ฃผ์ ์ฌํญ
- Props ๋ ์ฝ๊ธฐ ์ ์ฉ์ด๋ค
- ๋ชจ๋ Component ๋ ์์ ์ Props ๋ฅผ ๋ค๋ฃฐ ๋ ์์ ํจ์์ฒ๋ผ ๋์ํด์ผ ํ๋ค.
์์ ํจ์๋, ์ด๋ค ๊ฐ์ด ๋ค์ด์๋ ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.
์ฆ, Component ๋ ์ด๋ค ์ํฉ์์๋ Porps ๋ฅผ ์์ ํด์๋ ์๋๋ค!
์ด๊ฒ์ ์ ์ฐํ React ์๊ฒ ์กด์ฌํ๋ ํ ๊ฐ์ง ์๊ฒฉํ ๊ท์น์ด๋ค.
Default Props
Props ๋ํ Default ๊ฐ์ ์ง์ ํด์ค ์ ์๋ค.
(๋ง์น ํจ์์์ ๋ํดํธ ์ธ์๊ฐ์ ์ง์ ํด ์ฃผ๋ฏ..)
class Welcome extends React.Component { static defaultProps = { name: "React" } render() { return <h1>Hello, {this.props.name}</h1>; } }
Props ์ ํจ์ Component
๋จ์ํ Props ๋ฅผ ๊ฐ์ ธ์์ ๋ณด์ฌ์ฃผ๊ธฐ๋ง ํ๋ ์ปดํฌ๋ํธ๋ ํจ์ ์ปดํฌ๋ํธ๋ก ๋ ๊ฐ๋จํ๊ฒ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํด์, ์๋์ ๊ฐ์ด ์์ฑํด์ค ์ ์๋ค.
const Welcome = ({name}) => { return ( <div> Hello, {name} </div> ); );
State
- ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ ๊ฐ์ฒด๋ผ๋ ์ ์์ props ์ ์ ์ฌํ์ง๋ง
- State ๋ ๋น๊ณต๊ฐ์ด๋ฉฐ,
- ์ปดํฌ๋ํธ์ ์ํด ์์ ํ ์ ์ด๋๋ค.
state ๊ฐ ์์ ํ๊ณ ์ค์ ํ Component ์ธ์๋ ์ด๋ ํ Component ์๋ ์ ๊ทผํ ์ ์๋ค.
์ด ๋๋ฌธ์ state ๋ ์ข ์ข ๋ก์ปฌ ๋๋ ์บก์ํ๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
๊ทธ๋ ๊ธฐ์ Component ๋ ์์ ์ state ๋ฅผ ์์ Component ์ props ๋ก ์ ๋ฌํ ์ ์์ง๋ง,
Component ๋ ์์ ์ด ๋ฐ์ props ์ด ์์ Component ์์ state ์๋์ง, props ์๋์ง ๋๋ ์๋์ผ๋ก ์ ๋ ฅํ ๊ฒ์ธ์ง ์ ์ ์๋ค.
์ด๋ ๊ฒ ์์์ ์๋๋ก (๋ถ๋ชจ-์์) ํ๋ฅด๋ ๋ฐ์ดํฐ ํ๋ฆ์ "ํํฅ์(top-down)" ๋๋ "๋จ๋ฐฉํฅ์" ๋ฐ์ดํฐ ํ๋ฆ์ด๋ผ๊ณ ํ๋ค.
์๋ฅผ ์ดํด๋ณด์.
class Welcome extends React.Component { constructor(props) { super(props); this.state = {comment: "Hello"}; } render() { return ( <div> <h1>{this.state.comment}, {this.props.name}</h1> </div> ); } }
state ๋ class field ์ฒ๋ผ ์์ฑํ ์๋ ์๋ค.
class Welcome extends React.Component { state = { comment: "Hello" } render() { return ( <div> <h1>{this.state.comment}, {this.props.name}</h1> </div> ); } }
์ด๋ ์์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ธ๋ค.
super(props)
Component ๋ฅผ ๋ง๋ค๋ฉด์ constructor ๋ฅผ ์์ฑํ๋ฉด ๊ธฐ์กด ํด๋์ค ์์ฑ์๋ฅผ ๋ฎ์ด์ฐ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์์ํ Component ๊ฐ ๊ฐ์ง๊ณ ์๋ constructor ๋ฅผ super ๋ก ์คํํ๊ณ , ๊ทธ ํ์ state ๋ฅผ ์ค์ ํด์ค์ผ ํ๋ค.
setState()
์์ฑํ state ๋ setState() ํจ์๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
์๋์ ์์์, ์ฃผ์ ์ฌํญ์ ์ ๋ด๋ณด์.
๋ณํฉ
setState() ๋ฅผ ํธ์ถํ ๋ React๋ ์ ๊ณตํ ๊ฐ์ฒด๋ฅผ ํ์ฌ state๋ก ๋ณํฉํ๋ค.
์ฆ state ๋ ๋ ๋ฆฝ์ ์ธ ์ฌ๋ฌ ๊ฐ์ ๋ณ์๋ฅผ ํฌํจํ ์ ์๋๋ฐ, setState() ํจ์ ํธ์ถ๋ก ๊ฐ ๋ณ์๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์๋ค.
๊ฐ๋จํ ์์๋ฅผ ์ดํด๋ณด์. (๋ง์ด ์ถ์ฝ๋ ํํ)
... constructor(props){ super(props); this.state = { name: [], comment: [] }; } ... ... this.setState({comment: "Changed!"}); ...
this.setState({comment}) ๋ this.state.name ์ ์ํฅ์ ์ฃผ์ง ์์ง๋ง, this.state.comment ๋ ๋์ฒด๋๋ค!
์ฃผ์์ฌํญ
- state ๋ ์ง์ ์์ ํ์ง ๋ง๊ณ , setState() ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค
//Wrong this.state.comment = 'Hello'; //Correct this.setState({comment: 'Hello'});
this.state ๋ฅผ ์ง์ ์ง์ ํ ์ ์๋ ์ ์ผํ ๊ณต๊ฐ์ constructor ์ด๋ค.
- State ์ ๋ฐ์ดํธ๋ ๋น๋๊ธฐ์ ์ผ ์ ์์ผ๋, state ๋ฅผ ๋ณ๊ฒฝํ ๋ ํด๋น ๊ฐ์ ์์กดํด์๋ ์๋๋ค.
// Wrong this.setState({ counter: this.state.counter + this.props.increment, }); // Correct this.setState((state, props) => ({ counter: state.counter + props.increment }));
Wrong ์ฒ๋ผ ์์ฑํ๋ฉด ์ฑ๊ณต์ ์ผ๋ก counter ๊ฐ์ด ์ ๋ฐ์ดํธ ๋ ์ ์์ง๋ง,
๋น๋๊ธฐ์ ์ผ๋ก state ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ค๋ฉด, ์ ๋๋ก ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ์คํจํ ์ ์๋ค.
์ด์์ผ๋ก React ์ Component , Props , State ์ ๋ํด ์์๋ณด์๋ค.
๋ค์์ผ๋ก๋ ์๋ช ์ฃผ๊ธฐ์ ๋ํด์ ์์๋ณด์.
Reference
React ๊ณต์ ๋ฌธ์
ko.reactjs.org/docs/components-and-props.html
ko.reactjs.org/docs/state-and-lifecycle.html
.
'PROGRAMMING > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React :: Hook, useState, useEffect, ์ฌ์ฉ์ ์ ์ Hook (0) 2021.03.31 React :: ์๋ช ์ฃผ๊ธฐ (Lifecycle) (0) 2021.03.21 React :: Element Rendering (์๋ฆฌ๋จผ๋ ๋ ๋๋ง) (0) 2021.03.20 React : JSX (0) 2021.03.20 React :: React ์์ํ๊ธฐ (0) 2021.03.20