[React] # ํด๋์คํ ์ปดํฌ๋ํธ VS ํจ์ํ ์ปดํฌ๋ํธ
- -
๐ข https://daradarav.tistory.com/ ๋ก ์ด์ ์ค์ ๋๋ค.
3์ฅ์์ ํด๋์คํ ์ปดํฌ๋ํธ์ ํจ์ํ ์ปดํฌ๋ํธ์ ๋ํด ์ฝ๋๋ฅผ ์์ฑํ๋ฉฐ ๋ฐฐ์ ์ต๋๋ค. ์ ์ธ ๋ฐฉ์๊ณผ ์ปดํฌ๋ํธ์ ์ฐจ์ด์ props, state ์ ๋ํ ์์ธํ ์ฝ๋์ ์ค๋ช ์ ๋ค์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์๊ธธ ๋ฐ๋๋๋ค.
https://jiyesmoon.tistory.com/19?category=969102
์ด๋ฒ ์ฑํฐ์์๋ ์ปดํฌ๋ํธ์ ๋ํด ๊ฐ๋จํ ์ ๋ฆฌํ๊ฒ ์ต๋๋ค. ์ดํ ํด๋์คํ ์ปดํฌ๋ํธ์ ํจ์ํ ์ปดํฌ๋ํธ์ ์ฐจ์ด๋ฅผ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค. ์ปดํฌ๋ํธ ๋ชฉ์ ์ ๋ฐ๋ผ ๋๋๋ ๊ฒฝ์ฐ๋ ์์๋ณด๊ฒ ์ต๋๋ค.
๐ I. ์ปดํฌ๋ํธ
๐ 1. ์ปดํฌ๋ํธ
- ๋ฆฌ์กํธ๋ก ๋ง๋ค์ด์ง ์ฑ์ ์ด๋ฃจ๋ ์ต์ํ์ ๋จ์
- UI๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ๋ณ์ ์ธ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋๋๊ณ , ๊ฐ ์กฐ๊ฐ์ ๊ฐ๋ณ์ ์ผ๋ก ์ดํด๋ณผ ์ ์์
- ํน์ ๋ถ๋ถ์ด ์ด๋ป๊ฒ ์๊ธธ์ง ์ ํ๋ ์ ์ธ์ฒด
- ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ API, ๋ค์ํ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ผ๋ฉฐ ์ปดํฌ๋ํธ ํ๋์ ์๊น์์ ์๋ ๋ฐฉ์์ ์ ์
- JavaScript ํจ์์ ์ ์ฌ, "props"๋ผ๊ณ ํ๋ ์์์ ์ ๋ ฅ์ ๋ฐ๊ณ ํจ์์ ์ด๋ป๊ฒ ํ์ํ๋์ง๋ฅผ ์๋ฆฌ๋จผํธ์ ๋ฐํํจ
- ์ปดํฌ๋ํธ์ ์ด๋ฆ์ ๋ฐ๋์ ๋๋ฌธ์๋ก ์์๋จ
๐ 2. ์ปดํฌ๋ํธ ๋ชฉ์ ์ ๋ฐ๋ฅธ ๋ถ๋ฅ
(1) ํ๋ ์ ํ ์ด์ ๋ ์ปดํฌ๋ํธ
- View ๋ง์ ๋ด๋นํ๋ ์ปดํฌ๋ํธ
- ํ๋ ์ ํ ์ด์ ๋ ์ปดํฌ๋ํธ์ ์ปจํ ์ด๋ ์ปดํฌ๋ํธ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ
- props๋ก๋ง ๋ฐ์ดํฐ๋ ํจ์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์
- state๋ ๋ฐ์ดํฐ๊ฐ ์๋ UI์ ๋ํ state์ฌ์ผํจ
- ํจ์ํ ์ปดํฌ๋ํธ๋ก ์์ฑ๋จ
(2) ์ปจํ ์ด๋ ์ปดํฌ๋ํธ
- ๋ค๋ฅธ ํ๋ ์ ํ ์ด์ ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ด๋ฆฌ
- ๋ด๋ถ์ DOM ์๋ฆฌ๋จผํธ(UI)๋ฅผ ์์ฑํ์ง ์์
- ์คํ์ผ์ ๊ฐ์ง์ง ์์, ์คํ์ผ์ ๋ฐ๋์ ํ๋ ์ ํ ์ด์ ๋ ์ปดํฌ๋ํธ์ ์์ฑ๋ ๊ฒ
๐ II. ํจ์ํ ์ปดํฌ๋ํธ VS ํด๋์คํ ์ปดํฌ๋ํธ
๐ 1. ์ฐจ์ด์
๋ฆฌ์กํธ v16.8 ์ ๋ฐ์ดํธ๋ก Hooks๊ฐ ๋์ ๋์๊ณ ํจ์ ์ปดํฌ๋ํธ๋ ํด๋์ค ์ปดํฌ๋ํธ์ ๊ฐ์ด ์์ ์ ํ ์ ์๊ฒ ๋์์ต๋๋ค. ๋ฆฌ์กํธ ๊ณต์ ๋งค๋ด์ผ์์๋ ํจ์ ์ปดํฌ๋ํธ+Hooks๋ฅผ ์ฌ์ฉํ๋๋ก ๊ถ์ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด์ ์ ์์ฑ๋ ์ฝ๋๋ค์ ์ ์ง ๋ฐ ๋ณด์๋ฅผ ์ํ์ฌ ํด๋์ค ์ปดํฌ๋ํธ๋ ๋ฐ๋์ ์์๋์ด์ผํฉ๋๋ค.
๐ 2. ์ ์ธ ๋ฐฉ์
(1) ํด๋์คํ ์ปดํฌ๋ํธ
import {Component} from "react";
class App extends Component {
render() {
const cType = 'ํด๋์คํ ์ปดํฌ๋ํธ';
return <div'> {cType} </div>;
}
}
export default App;
- ์๋ฐ๋ ํ์ด์ฌ ๊ฐ์ ๊ฐ์ฒด ์งํฅ ์ธ์ด์ class ๋์ผ
- class ํค์๋๋ก ์ ์ธํ๊ณ React.component๋ฅผ ์์ํ์ฌ exportํจ
- render( ) ๋ฉ์๋๊ฐ ๋ฐ๋์ ํ์, ๋ฆฌ์กํธ์ ์๋ช ์ฃผ๊ธฐ ์ค ํ๋์
- state, lifCycle ๊ด๋ จ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์
- ์์์ ๋ฉ์๋ ์ ์ ๊ฐ๋ฅ
- ๋ฉ๋ชจ๋ฆฌ ์์์ด ์๋์ ์ผ๋ก ๋ง์ด ์๋ชจ๋๊ณ ๋ฌธ๋ฒ์ด ๋ณต์กํจ
(2) ํจ์ํ ์ปดํฌ๋ํธ
function App() {
const cType = "ํจ์ํ ์ปดํฌ๋ํธ";
return <div> {cType} </div>;
}
export default App;
- ํจ์(function)์ exportํ ํํ
- state๋ lifeCycle ๊ด๋ จ ๊ธฐ๋ฅ์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅ
- ํด๋์ค ์ปดํฌ๋ํธ๋ณด๋ค ์ ์ธํ๊ธฐ ํธ๋ฆฌ
- ํด๋์ค ์ปดํฌ๋ํธ๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ ์์์ ๋ ์ฌ์ฉํ๊ณ , ์ค์ ๋ฐฐํฌํ ๋๋ ๊ฒฐ๊ณผ๋ฌผ์ ํ์ผ ํฌ๊ธฐ๊ฐ ๋ ์์ต๋๋ค.
- ๋ฆฌ์กํธ v16.8 ์ ๋ฐ์ดํธ๋ก Hook์ ํตํ state์ ๋ผ์ดํ์ฌ์ดํด API๋ ์ฌ์ฉ์ด ๊ฐ๋ฅ
๐ 3. props
(1) props
- props๋ properties์ ์ค์๋ง๋ก ์ปดํฌ๋ํธ์ ์์ฑ์ ์ค์
- props ๊ฐ์ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์ ์ฌ์ฉํ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ค์ ํ ์ ์์
- ์ปดํฌ๋ํธ ์์ฒด์์๋ props ๊ฐ์ ์์ ํ ์ ์์, ์ฝ๊ธฐ ์ ์ฉ
(2) ํด๋์คํ ์ปดํฌ๋ํธ
import { Component } from "react";
class NewComponent extends Component {
render() {
const cType = "ํด๋์คํ ์ปดํฌ๋ํธ";
const {write} = this.props;
return <div> {cType}์์ {write}์ ๋ณด์ฌ์ค๋๋ค</div>;
}
}
- render ํจ์์์ this.props๋ฅผ ์กฐํํ ์ ์์
- defaultProps์ propTypes๋ ํจ์ํ ์ปดํฌ๋ํธ์ ๋์ผํ๊ฒ ์ ์ธ, class ๋ด๋ถ์์๋ ์ง์ ๊ฐ๋ฅ
(2) ํจ์ํ ์ปดํฌ๋ํธ
const App = ({write}) => {
const cType = "ํจ์ํ ์ปดํฌ๋ํธ";
return (
<div>
{cType}์์ {write}์ ๋ณด์ฌ์ค๋๋ค
</div>
)
}
- props๋ฅผ ๋ถ๋ฌ์ฌ ํ์ ์์ด ๋ฐ๋ก ํธ์ถ ๊ฐ๋ฅ
- props ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ์ฌ ๊ฐ์ ์ฐธ์กฐ
๐ 4. state
(1) state
- state๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๋ฐ๋ ์ ์๋ ๊ฐ์ ์๋ฏธ
- state๋ ์ปดํฌ๋ํธ ์์ฒด์ ์ผ๋ก ์ง๋ ๊ฐ์ผ๋ก ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๊ฐ์ ์ ๋ฐ์ดํธ ํ ์ ์์
- ์ผ๋ฐ ๋ณ์๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ html์ ์๋ ๋ณ๊ฒฝ๋์ง ์์ง๋ง, state๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด html์ ์ฌ๋๋๋ง ํด์ค
=> ๊ฐ์ ๋ณํ๊ฐ ์์ฃผ ์์ ๋ state๋ฅผ ์ฌ์ฉ - ํด๋์คํ ์ปดํฌ๋ํธ๋ state, ํจ์ ์ปดํฌ๋ํธ์์๋ useState๋ฅผ ์ฌ์ฉ
(2) ํด๋์คํ ์ปดํฌ๋ํธ
import { Component } from "react";
class Counter extends Component {
constructor(props) {
super(props);
this.state = {
number: 0
};
}
render() {
const cType = "ํด๋์คํ ์ปดํฌ๋ํธ";
const {number} = this.state;
return (
<div>
<h1> {cType} </h1>
<h1> {number} </h1>
<button
onClick = {() => {
this.setState( {number: number +1 } );
}}
>
+1
</button>
</div>
);
}
}
export default Counter;
- ํ์ดํ ํจ์๋ก ํจ์๋ฅผ ์ ์ธํ ์ ์์
- ์์์ ๊ฐ์ ์ ์ฉํ ๋ this.์ ๋ถ์ฌ์ ์ ๊ทผํด์ผํจ
(2) ํจ์ํ ์ปดํฌ๋ํธ
import { useState } from "react";
const Say = () => {
const [message, setMessage] = useState('');
const onClickEnter = () => setMessage("์๋
ํ์ธ์!");
const onClickLeave = () => setMessage("์๋
ํ๊ฐ์ธ์!");
return (
<div>
<button onClick={onClickEnter}>์
์ฅ</button>
<button onClick={onClickLeave}>ํด์ฅ</button>
<h1> {message} </h1>
</div>
);
};
export default Say;
- const + ํจ์ ํํ๋ก ์ ์ธ
- this์์ด ์์์ ์ ์ฉ ๊ฐ๋ฅ
- ํ ์ปดํฌ๋ํธ์์ useState ์ฌ๋ฌ ๋ฒ ์ฌ์ฉ ๊ฐ๋ฅ
- useState ํจ์ ์ธ์์๋ ์ํ์ ์ด๊น๊ฐ์ ์ง์ , ๊ฐ์ฒด๊ฐ ์๋์ด๋ ๊ด์ฐฎ์
- ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ฐฐ์ด์ด ๋ฐํ
* ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์๋ ํ์ฌ ์ํ
* ๋ฐฐ์ด์ ๋ ๋ฒ์งธ ์์๋ ์ํ๋ฅผ ๋ฐ๊พธ์ด์ฃผ๋ ํจ์, setter ํจ์
๐ 5. ๊ธฐํ
ํจ์ํ ์ปดํฌ๋ํธ์ ํด๋์คํ ์ปดํฌ๋ํธ๋ Life Cycle๊ณผ ์ด๋ฒคํธ ํธ๋ค๋ง์์๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ด์ ๊ด๋ จ๋ ํฌ์คํธ๋ฅผ ์์ฑ ํ ๋ค์ ์๊ฐํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ III. ์ ๋ฆฌ
ํจ์ํ ์ปดํฌ๋ํธ๋ ํด๋์คํ ์ปดํฌ๋ํธ๋ณด๋ค ๋ค์ ๋ง๋ค์ด์ก์ต๋๋ค. Hooks์ ๋ฑ์ฅ์ผ๋ก ํด๋์คํ ์ปดํฌ๋ํธ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ฒ ๋์ด ๊ณต์ React์์๋ ํจ์ํ ์ปดํฌ๋ํธ + Hooks๋ฅผ ๊ถ์ฅํฉ๋๋ค.
๊ทธ๋ฌ๋ ํด๋์คํ ์ปดํฌ๋ํธ๋ ์์๋ ํ์์ฑ์ด ์์ต๋๋ค. ํด๋์คํ ์ปดํฌ๋ํธ๋ฅผ ํจ์ํ ์ปดํฌ๋ํธ๋ก ๋ฐ๊ฟ ํ์๋ ์์ง๋ง ๋ณด์ํ๊ฑฐ๋ ์ ์งํ ๋ ํ์ํฉ๋๋ค. React ๊ณต์ ํํ์ด์ง์์ ํด๋์ค ์ปดํฌ๋ํธ๋ค์ ์ง์ํ ์์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] 04. ์ด๋ฒคํธ ํธ๋ค๋ง (0) | 2022.10.10 |
---|---|
[React] 03. ์ปดํฌ๋ํธ (1) | 2022.10.04 |
[React] 02. JSX (0) | 2022.09.26 |
[React] # ๋ฆฌ์กํธ ํ๋ก์ ํธ ๋ง๋ค๊ธฐ (0) | 2022.09.25 |
[React] 01. ๋ฆฌ์กํธ ์์ (1) | 2022.09.24 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค