state๋ ์ปดํฌ๋ํธ๋ด์์ ์ด๋ ํ ๊ฐ์ ๋์ ์ผ๋ก ๊ฐฑ์ ํด์ฃผ๊ธฐ ์ํ์ฌ ์ฌ์ฉํ๋ค.
์ฆ, state๋ ๋์ ์ผ๋ก ๊ฐฑ์ ๋๋ ๊ฐ์ด๋ค.
์์ ๋ณด์๋ฏ์ด props๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
๋ฐ๋ผ์ props ๊ฐ์ ๋ณ๊ฒฝํด์ฃผ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก state๊ฐ ์๋ค.
๊ผญ props ๋ฟ๋ง ์๋๋ผ ์ปดํฌ๋ํธ์์๋ ๋์ ์ผ๋ก ๊ฐฑ์ ํ๊ณ ์ถ์ ๊ฐ์ด ์๋ค๋ฉด state๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
state์ ํน์ง
state๋ฅผ ์
๋ฐ์ดํธํ๊ธฐ ์ํด์๋ setState๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
setState๋ฅผ ์ฌ์ฉํ์ง ์๊ณ state๋ฅผ ์ง์ ์ ์ผ๋ก ์
๋ฐ์ดํธํ๋ฉด ์
๋ฐ์ดํธ๊ฐ ๋ฐ์๋์ง ์๋๋ค.
setState๋ ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํ๋ค.
์ฆ, setState๋ฅผ ์คํํ๋ค์ ์ฆ์ state๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ด ์๋๋ผ ์ผ๋ถ ์์
์ด ์๋ฃ๋ ๋ค์ state๊ฐ ์
๋ฐ์ดํธ๋ ์๋ ์๋ค๋ ๊ฒ์ด๋ค.
state๊ฐ์ ๋ถ๋ณ์ฑ์ ์ ์งํ๋ฉฐ ์
๋ฐ์ดํธ๋์ผํ๋ค.
์ต์ ํํ๋๋ฐ ์ฉ์ดํ๊ธฐ ๋๋ฌธ์ด๋ค.
shouldComponentUpdate๋ React.memo๋ฑ์ ์ฌ์ฉํ์ฌ ์ด์ ์ํ๊ฐ๊ณผ ๋น๊ตํ์ ๋ ๋ณํ๊ฐ ์์ผ๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋งํ์ง ์๊ฒ ํ ์ ์๋ค.
state๊ฐ ๋ถ๋ณ์ฑ์ด ์ ์งํ์ง์๊ณ ์ด์ ๊ฐ์ ๋ณ๊ฒฝ์ํจ๋ค๋ฉด ์ด์ state์ ๋ณ๊ฒฝ๋๋ state๊ฐ ๊ฐ์์ง๊ธฐ ๋๋ฌธ์ ์ ๊ฐ์ ์ต์ ํ ์์ ์ ํ์ง ๋ชปํ๋ค.
๋ํ react๋ virtual DOM์ ํตํด ๋ณ๊ฒฝ๋๋ DOM๋ง ํจ์จ์ ์ผ๋ก ์ ๋ฐ์ดํธํด์ฃผ๋๋ฐ ์ด์ ์ํ๊ฐ๋ ๋ฐ๋๋ ์ํ๊ฐ๊ณผ ๊ฐ๊ฒ ๋ง๋ค๋ฉด DOM์ด ์ ๋ฐ์ดํธ๋์ง ๋ชปํ๊ฒ ๋๋ค.
๋ง๋ถํ ๋ฆฌ์กํธ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ฆ, side effect๋ฅผ ๋ง๋ค์ง ์๋ ๊ฒ์ ์ถ๊ตฌํ๊ณ ์๊ธฐ ๋๋ฌธ์ ํจ์๋ด๋ถ์์ ์ธ๋ถ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ง์ํ๋ค.
๋ค์์ ํด๋์คํ ์ปดํฌ๋ํธ์ ํจ์ํ ์ปดํฌ๋ํธ์ state ์ฌ์ฉ ์์์ด๋ค.
import React, { Component } from "react";
class ClassComponent extends Component {
constructor(props) {
super(props);
this.state = {
number: 0,
};
}
render() {
const { number } = this.state;
return (
<div>
<span>{number}</span>
<button
onClick={() => {
this.setState({ number: number + 1 });
}}
>
Increase
</button>
</div>
);
}
}
export default ClassComponent;
ํด๋์คํ ์ปดํฌ๋ํธ์์ state๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ constructor ์์ฑ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ฐ๋ผ์ constructor()๋ฉ์๋ ๋ด์์ state๊ฐ์ ๊ฐ์ฒด ํ์ ์ผ๋ก ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
state ๊ฐ์ ๊ฐฑ์ ํ๊ณ ์ ํ ๋์๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง ์์๋ก๋
๋ฆฌ์กํธ ์์(button)์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉํ์ฌ setState() ๋ฉ์๋์ ์ธ์๋ก ๊ฐ์ฒด๋ฅผ ์
๋ ฅํ์ฌ ๊ฐ์ ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋๋ค.
์ฐธ๊ณ ๋ก setState๋ render()๋ฉ์๋ ๋ด์์ ์ฌ์ฉํด์ผํ๋ค.
- React.Component๋ฅผ ์์ํ ์ปดํฌ๋ํธ๋ props๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ์ฌ super๋ก props๋ฅผ ์ ๋ฌ๋ฐ๋๋ค.
(super class์ ์ธ์๋ฅผ ์ ๋ฌ๋ฐ๊ธฐ ์ํด์๋ sub class๋ super()๋ฉ์๋์ ์ธ์๋ก ๋ฐ์์ค์ผํจ.)- ํ์ง๋ง constructor()๋ฉ์๋๋ฅผ ์๋ตํ์ฌ๋ React.Component๋ก๋ถํฐ props๋ฅผ ์๋ฌต์ ์ผ๋ก ์์๋ฐ์ props๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ์์ ์๋ณด๋ค ํธํ๊ฒ state๊ฐ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
import React, { Component } from "react";
class ClassComponent extends Component {
state = {
number: 0,
};
render() {
const { number } = this.state;
return (
<div>
<span>{number}</span>
<button
onClick={() => {
this.setState({ number: number + 1 });
}}
>
Increase
</button>
</div>
);
}
}
export default ClassComponent;
constructor() ๋ฉ์๋๋ฅผ ์๋ตํ์ฌ ํธ๋ฆฌํ๊ฒ state๋ฅผ ์ ์ํ ์ ์๋ค.
ํจ์ํ ์ปดํฌ๋ํธ์์๋ ํ ์ ์ฌ์ฉํ์ฌ state๋ฅผ ๊ด๋ฆฌํ๋ค.
import React, { useState } from "react";
const FunctionComponent = () => {
const chooseColor = ["red", "orange", "yellow", "green", "blue", "purple"];
const [color, setColor] = useState("black");
function colorChange() {
const ran = Math.floor(Math.random() * 6);
setColor(chooseColor[ran]);
}
return (
<>
<div
style={{
width: "100px",
height: "100px",
backgroundColor: color,
}}
></div>
<button onClick={colorChange}>Change</button>
</>
);
};
export default FunctionComponent;
import {useState} from "react"
useState() => [์ง์ ๊ฐ , ์ง์ ๊ฐ์ ๋ณ๊ฒฝํด์ฃผ๋ ํจ์]
const [color, setColor] = useState("black");
color : ์ง์ ๊ฐ
setColor : color๋ฅผ ๋ณ๊ฒฝํด์ฃผ๋ ํจ์
์ด์ฒ๋ผ ํจ์ํ ์ปดํฌ๋ํธ์์๋ useState๋ฅผ ์ฌ์ฉํ์ฌ ํด๋์คํ ์ปดํฌ๋ํธ๋ณด๋ค ๊ฐํธํ๊ฒ state๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
ParentComponent.js
import React, { Component } from "react";
import ChildComponent from "./ChildComponent";
class ParentComponent extends Component {
state = {
number: 0,
};
render() {
const { number } = this.state;
const changeNumber = () => {
this.setState({ number: number + 1 });
};
return (
<div>
<ChildComponent id={number} changeNumber={changeNumber} />
</div>
);
}
}
export default ParentComponent;
ChildCoponent.js
import React from "react";
const ChildComponent = ({ id, changeNumber }) => {
return (
<div>
<span>{id}</span>
<button onClick={changeNumber}>Increase</button>
</div>
);
};
export default ChildComponent;
๋ถ๋ชจ ์ปดํฌ๋ํธ์์ state๊ฐ(number)๊ณผ ๊ฐฑ์ ํจ์(changeNumber)๋ฅผ ์์ ์ปดํฌ๋ํธ์ props๋ก ์ ๋ฌํด์ฃผ์ด ์์์ปดํฌ๋ํธ์ props๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
์ด์ฒ๋ผ props ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ ํ๋ฉด ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ state๊ฐ์ ์ ์ํ์ฌ ์์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๋ฉด ๋๋ค.
์ด๊ฒ์ด ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ์ฌ์ฉ์ ์ผ๋ฐ์ ์ธ ๋ฉ์ปค๋์ฆ์ด๋ค.
๐๐