
react ์คํฐ๋์์ ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ ์ด๋ผ๋ ์ฑ ์ ์ ์ ํ๊ณ ์ด ์ฑ ์ ์ฝ๊ณ ๋ฐฐ์ด ๊ฒ์ ๋ฐํ์ผ๋ก ์์ฑ๋์๋ค.
propsvsstate
- ๋ ๋ค ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๊ฑฐ๋ ๋ ๋๋งํ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ๋ฉด์์ ๋น์ทํ๋ค.
props๊ฐ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ค์ ํ๊ณ , ์ปดํฌ๋ํธ ์์ ์ ํด๋นprops๋ฅผ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก๋ง ์ฌ์ฉํ ์ ์๋ค.state๊ฐ์ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์ค์ ํ๊ณ ์ ๋ฐ์ดํธํ ์ ์๋ค.props๊ฐ์ด ๋ฌด์กฐ๊ฑด ๊ณ ์ ์ ์ธ ๊ฒ์ ์๋๋ค.
- ๋ถ๋ชจ ์ปดํฌ๋ํธ์
state๋ฅผ ์์ ์ปดํฌ๋ํธ์props๋ก ์ค์ ํ๊ณ ์์ ์ปดํฌ๋ํธ์์ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉดprops๋ ์ ๋์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
import { Component } from "react";
class Counter extends Component {
constructor(props) {
super(props);
// state์ ์ด๊ธฐ๊ฐ ์ค์
// ๊ฐ์ฒด ํ์!
this.state = {
number: 0
};
}
render() {
// state๋ฅผ ์กฐํํ ๋๋ this.state๋ก ์กฐํ
const { number } = this.state;
return (
<div>
<h1>{number}</h1>
<button
onClick = { () => this.setState({number: number + 1})}
>
+1
</button>
</div>
);
}
}
export default Counter;
props๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ปดํฌ๋ํธ์ ์์ฑ์ ๋ฉ์๋ (constructor ๋ฉ์๋) ๋ด๋ถ์์ super(props)๋ฅผ ํธ์ถํด์ผ ํ๋ค.super(props)๋ฅผ ํธ์ถํ๋ฉด Component ํด๋์ค๊ฐ ์ง๋ ์์ฑ์ ํจ์๋ฅผ ํธ์ถํด ์ค๋ค.state๋ ๊ฐ์ฒด ํ์์ด์ด์ผ ํ๋ค.render ๋ฉ์๋์์ state๋ฅผ ์กฐํํ ๋๋ this.state ์ด์ฉimport { Component } from "react";
class Counter extends Component {
// state์ ์ด๊ธฐ๊ฐ ์ค์
// ๊ฐ์ฒด ํ์!
state = {
number: 0,
fixedNumber: 0
};
constructor(props) {
super(props);
}
render() {
// state๋ฅผ ์กฐํํ ๋๋ this.state๋ก ์กฐํ
const { number, fixedNumber } = this.state;
return (
<div>
<h1>{number}</h1>
<h2>๋ฐ๋์ง ์๋ ๊ฐ: {fixedNumber}</h2>
<button
onClick = { () => this.setState({number: number + 1})}
>
+1
</button>
</div>
);
}
}
export default Counter;
setState๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์
๋ฐ์ดํธํ๊ณ ๋ ๋ค์์ ํน์ ์์
์ ํ๊ณ ์ถ์ ๋๋ setState์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌํ๋ฉด ๋๋ค.
const onClick = () => {
this.setState({
number: number + 1
}, () => {
console.log("setState ํธ์ถ");
})}
};
<button onClick={onClick}>
+1
</button>
๐ก State Updates May Be Asynchronous
React may batch multiple setState() calls into a single update for performance.
๐ก State Updates are Merged
When you call setState(), React merges the object you provide into the current state.
setState()๋ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋๋ค.state๋ ๊ฐ์ฒด์ด๋ค.setState๊ฐ ์ฐ์์ ์ผ๋ก ํธ์ถ๋๋ฉด ์ ๋ฌ ๋ฐ์ ๊ฐ state(๊ฐ์ฒด)๋ฅผ ํฉ์น๊ณ (merging) ํฉ์ณ์ง ๋จ์ผ ๊ฐ์ฒด์ ๋ํด setState()๋ฅผ ์คํํ๋ค. merge ๊ณผ์ ์์ ๊ฐ์ key๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๊ฐ์ ๋ฎ์ด์ด๋ค.setState()๋ฅผ ์ฐ์์ ์ผ๋ก ํธ์ถํ๋ฉด Batch ์ฒ๋ฆฌ(์ผ๊ด ์ฒ๋ฆฌ)๋ฅผ ํ๋ค.setState์ ๊ฐ์ฒด ๋์ ํจ์ ์ธ์๋ฅผ ์ ๋ฌํ๋ค.prevState)๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ฐ๊ณ ์
๋ฐ์ดํธ๊ฐ ์ ์ฉ๋ ์์ ์ props๋ฅผ ๋ ๋ฒ์งธ ์ธ์๋ก ๋ฐ๋๋ค.v16.8 ์ดํ๋ถํฐ useState ํจ์๋ฅผ ์ด์ฉํ์ฌ ํจ์ํ ์ปดํฌ๋ํธ์์๋ state๋ฅผ ์ด์ฉํ ์ ์๋ค.useState ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ฐฐ์ด์ด ๋ฐํ๋๋๋ฐ, ์ฒซ๋ฒ์งธ ์์๋ ํ์ฌ ์ํ๊ฐ์ด๊ณ , ๋๋ฒ์งธ ์์๋ ์ํ๋ฅผ ๋ฐ๊พธ์ด ์ฃผ๋ ํจ์์ด๋ค. (setter ํจ์)useState ํจ์๋ฅผ ํธ์ถํ ๋ ์ด๊ธฐ ์ํ๊ฐ์ ์ธ์๋ก ๋ณด๋ธ๋ค.import React, { useState } from 'react';
function Counter() {
// ๋ฐฐ์ด ๋น๊ตฌ์กฐํ ํ ๋น
const [number, setNumber] = useState(0);
const onIncrease = () => {
setNumber(number + 1);
};
const onDecrease = () => {
setNumber(number - 1);
};
return (
<div>
<h1>{number}</h1>
<button onClick = {onIncrease}>+1</button>
<button onClick = {onDecrease}>-1</button>
</div>
);
}
export default Counter;
setState์ ํจ์ ์ธ์๋ฅผ ์ ๋ฌํ๋ฉด ๋๋ค.// ํจ์ํ ์
๋ฐ์ดํธ
const onIncrease = () => {
setNumber(prevNumber => prevNumber + 1);
}
const onDecrease = () => {
setNumber(prevNumber => prevNumber - 1);
}
state ๊ฐ์ ๋ฐ๊พธ์ด์ผ ํ ๋๋ setState ํน์ useState๋ฅผ ํตํด ์ ๋ฌ๋ฐ์ setter ํจ์๋ฅผ ์ฌ์ฉํด์ผ๋ง ํ๋ค.// ์๋ชป๋ ์ฝ๋
this.state.number = this.state.number + 1;
this.state.array = this.state.array.push(2);
this.state.object.value = 5;
const [object, setObject] = useState({a: 1, b: 1});
object.b = 2;
setState ํน์ setter ํจ์ํตํด ์
๋ฐ์ดํธํ๋ค.์ฐธ๊ณ : React ๊ณต์ ๋ฌธ์