react ์คํฐ๋์์ ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ ์ด๋ผ๋ ์ฑ ์ ์ ์ ํ๊ณ ์ด ์ฑ ์ ์ฝ๊ณ ๋ฐฐ์ด ๊ฒ์ ๋ฐํ์ผ๋ก ์์ฑ๋์๋ค.
props
vsstate
- ๋ ๋ค ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๊ฑฐ๋ ๋ ๋๋งํ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ๋ฉด์์ ๋น์ทํ๋ค.
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 ๊ณต์ ๋ฌธ์