Component ๊ธฐ๋ฐ์ ๊ตฌ์กฐ์ด๋ฉฐ, ๋ชจ๋ ํ์ด์ง๊ฐ Component ๊ตฌ์ฑ๋์ด ์๊ณ ํ๋์ Component ๋ ๋ค๋ฅธ ์ฌ๋ฌ ๊ฐ์ Component ์กฐํฉ์ผ๋ก ๊ตฌ์ฑ๋ ์ ์๋ค.
์ด๋ฌํ Component๋ค์ ๋ง์น ๋ ๊ณ ๋ธ๋ก์ ์กฐ๋ฆฝํ๋ฏ ๋ผ์ ๋ง์ถฐ ์๋ก์ด Component ๋ง๋ค ์ ์๋ค.
Componentย : ์
๋ ฅ(props
)์ ๋ฐ์ ์ถ๋ ฅ(Element
) ํ๋ ์ญํ
React Component๋ ํฌ๊ฒ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์์ฑํ๋ค.
ํจ์ํ ์ปดํฌ๋ํธ (Function Component)
ํด๋์คํ ์ปดํฌ๋ํธ (Class Component)
โปํ์ฌ๋ ํจ์ํ์ ๋ง์ด ์ฐ์ง๋ง ๊ทธ๋๋ ํด๋์ค๊ฐ ๋ฌด์์ธ์ง๋ ์๊ณ ์์ด์ผ ํ๋ ๊ฐ์ด ์์ฑํ๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ Class Component
React์ ์ด๊ธฐ ๋ฒ์ ์์ ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ ์์ฑ ๋ฐฉ๋ฒ
ES6 ํด๋์ค ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ๊ณ , React์์ ์ ๊ณตํ๋ render() ๋ฉ์๋๋ฅผ ํตํด UI๋ฅผ ๋ ๋๋ง ํ๋ค.
์ฅ์ ์ผ๋ก๋ ์ํ(state)์ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
ํ์ง๋ง React 16.8์์ ํ
(Hooks)์ด ๋์
๋ ์ดํ๋ก ํจ์ํ ์ปดํฌ๋ํธ(Function Component
๊ฐ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
์์ ์ฝ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ํด๋์คํ ์ปดํฌ๋ํธ๋ ์์ง ์ฌ์ฉ๋๊ณ ์์ผ๋ ๊ฐ๋จํ๊ฒ ์ดํด๋ ํ๋๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.
this.state
๋ฅผ ์ฌ์ฉ ์ํ๋ฅผ ๊ด๋ฆฌrender()
๋ฉ์๋: React.Component์ ํ์ class์์ ๋ฐ๋์ ์ ์ํด์ผ ํ๋ ๋ฉ์๋์ํ ๊ด๋ฆฌ (this.state
์ this.setState
)
์ํ๋ฅผ ๊ด๋ฆฌํ๋ ค๋ฉด, ํด๋์ค์ ์์ฑ์(constructor)์์ this.state
๋ฅผ ์ด๊ธฐํํ๊ณ , ์ํ๋ฅผ ๋ณ๊ฒฝํ ๋๋ this.setState()
๋ฉ์๋๋ฅผ ์ฌ์ฉ
import React, { Component } from 'react';
class Counter extends Component {
constructor(props) {
super(props);
this.state = {
count: 0,
};
}
plus = () => {
this.setState({ count: this.state.count + 1 });
}
minus = () => {
this.setState({ count: this.state.count - 1 });
}
render() {
return (
<div>
<button onClick={this.plus}>+1</button>
<button onClick={this.minus}>-1</button>
<p>Count: {this.state.count}</p>
</div>
);
}
}
export default Counter;
this.state
๋ ์ปดํฌ๋ํธ์ ์ํ๊ณ this.setState()
๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ๋ณ๊ฒฝ๋๋ค.setState()
๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋ง ๋๋ค.React 16.8๋ถํฐ Hooks๊ฐ ๋์
๋๋ฉด์ ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
์ํ(state)๋ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋(lifecycle methods)๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด useState, useEffect ๋ฑ์ ํ
์ ์ฌ์ฉ์๋ค.
์ด ๋ฐฉ์์ JavaScript ํจ์๋ก ์์ฑ UI๋ฅผ ๋ฐํํ๋ ๊ฐ๋จํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
React 16.8์ด์ ์๋ ํด๋์คํ ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉ๋์์ง๋ง, ํ์ฌ๋ ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ํจ์ฌ ๋ ์ ํธ๋๊ณ ์๋ค.
1)๋จ์ํจ: ํจ์ํ์ด ํด๋์คํ๋ณด๋ค ์ฝ์ ์ฝ๊ณ ๊ฐ๊ฒฐ
2)์ํ์ ์ดํํธ ๊ด๋ฆฌ: useState
, useEffect
์ ๊ฐ์ React ํ
(Hook)์ ์ฌ์ฉํ์ฌ ์ํ ๊ด๋ฆฌ์ ์๋ช
์ฃผ๊ธฐ ๊ด๋ฆฌ
3)์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ์ฑ ํจ์ํ ์ปดํฌ๋ํธ๋ ๋ค๋ฅธ ํจ์๋ ์ปดํฌ๋ํธ์ ์ฝ๊ฒ ๊ฒฐํฉ ๋ฐ ์ฌ์ฌ์ฉ์ ์ฉ์ด
๊ฐ๊ฒฐ์ฑ: ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ ์ฌ์ฐ๋ฉฐ, ์๊ฐ ๋จ์ถ ๋ฐ ์ ์ง๋ณด์๊ฐ ์ฉ์ด.
์ฑ๋ฅ: ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ต์ ํ
Hooks๋ฅผ ํตํ ๊ธฐ๋ฅ ํ์ฅ: useState
, useEffect
, useContext
, useReducer
๋ฑ ๋ค์ํ ํ
์ ํตํด ์ํ ๊ด๋ฆฌ, ์ฌ์ด๋ ์ดํํธ ์ฒ๋ฆฌ, ๋ฐ์ดํฐ ๊ณต์ , ๋ฑ ์ฒ๋ฆฌ ๊ฐ๋ฅ
Hooks์ ๋ํด ์์ธํ ์๊ณ ์ถ์ผ๋ฉด ์๋ ์ฐธ๊ณ
์๋ฌธ์๋ก ์์ํ๋ฉด html div ํ๊ทธ๋ก ์ธ์
const element = <div/>;
Welcome ์ด๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉ์๊ฐ ์ ์ ๋๋ฌธ์๋ก ํ์ฌ๊ธ ๋ฆฌ์กํธ Component๋ก ์ธ์
cosnt element = <Welcome name="ํ๊ธธ๋"/>
const name = 'mini';
return <h1>Hello, {name}!</h1>; // "Hello, mini" ์ถ๋ ฅ
props
๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ ๋ฌ๋ ๊ฐ์ด๋ฏ๋ก, ์์ ์ปดํฌ๋ํธ์์ ์ง์ ์์ ํ๋ฉด ์๋๋ค.props
๋ฅผ ์์ ํ๋ ค๋ฉด ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ณ , ๊ทธ์ ๋ฐ๋ผ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ณ๊ฒฝ๋ props๋ฅผ ๋ฐ๋๋ก ํด์ผ ํ๋ค.*์ํ๋ props๋ ๋ถ๋ณ์ด์ด์ผ ํฉ๋๋ค. ์ฆ, ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์ํ๋ฅผ ์ง์ ์์ ํ๋ ๊ฒ์ด ์๋๋ผ ์๋ก์ด ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
์ํ๋ฅผ ๋ฐฐ์ด๋ก ๋ค๋ฃฐ ๋ push()
๋์ concat()์ ์ฌ์ฉํด์ผ ํ๋ค. ์ํ๊ฐ ์ง์ ๋ณ๊ฒฝ๋๋ฉด ๋ณํ๋ฅผ ๊ฐ์งํ์ง ๋ชปํ ์ ์๊ธฐ๋๋ฌธ
// ๋ถ๋ณ์ฑ ์๋ฐ (์๋ชป๋)
this.state.items.push(newItem);
// ๋ถ๋ณ์ฑ ์ ์ง (์ฌ๋ฐ๋ฅธ)
this.setState({ items: [...this.state.items, newItem] });
React ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ๋ ์์ ๊ฐ์ ์ฃผ์์ฌํญ๋ค์ ์งํค๋ ๊ฒ์ด ์ค์ํ๋ฉฐ, ์ด๋ฅผ ํตํด ์ฑ๋ฅ ์ต์ ํ, ์ฝ๋์ ์ ์ง๋ณด์์ฑ ํฅ์, ์๋ฌ ๋ฐฉ์ง ๋ฑ์ ํ ์ ์๋ค.
์ปดํฌ๋ํธ๋ฅผ ์ ๊ตฌ์กฐํํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ด ํต์ฌ!
โป ๋ณธ ํฌ์คํ ์ ์ธํ๋ฐ ๊ฐ์์ ๋ฆฌ์กํธ ํ์ด์ง๋ฅผ ๋ณด๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.