[React Docs] 5. State and Lifecycle
๋ณธ ๊ฒ์๊ธ์ย ๋ฆฌ์กํธ ๊ณต์๋ฌธ์๋ฅผ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ด๋ค.
: ์๋ฆฌ๋จผํธ ๋ ๋๋ง ํํธ์์ ๋ค๋ค๋ณธ ์๊ณ ์์๋ฅผ ๋ค์ ์ดํด๋ณด์. ๋ ๋๋ง ๋ ์ถ๋ ฅ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด root.render()
๋ฅผ ํธ์ถํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
const root = ReactDOM.createRoot(document.getElementById("root"));
function tick() {
const element = (
<div>
<h1>Hello, world!</h1>
<h2>It is {new Date().toLocaleTimeString()}.</h2>
</div>
);
root.render(element);
}
setInterval(tick, 1000);
: ์ด ์น์
์์ Clock
์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๊ณ ์บก์ํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ธ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ปดํฌ๋ํธ๋ ์ค์ค๋ก ํ์ด๋จธ๋ฅผ ์ค์ ํ๊ณ ๋งค ์ด ์ค์ค๋ก ์
๋ฐ์ดํธํ ๊ฒ์ด๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const root = ReactDOM.createRoot(document.getElementById("root"));
function Clock(props) {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {props.date.toLocaleTimeString()}.</h2>
</div>
);
}
function tick() {
root.render(<Clock date={new Date()} />);
}
setInterval(tick, 1000);
- ์๊ณ๋ฅผ ์บก์ํ ํ๊ธฐ์ ์ฌ๊ธฐ์๋ ์ค์ํ ์กฐ๊ฑด์ด ๋๋ฝ๋์ด ์๋๋ฐ,
Clock
์ด ํ์ด๋จธ๋ฅผ ์ค์ ํ๊ณ ๋งค์ด UI๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ยClock
์ปดํฌ๋ํธ ๋ด๋ถ์ ์์ด์ผ ํ๋ค.
: ์ด์์ ์ผ๋ก ํ ๋ฒ๋ง ์ฝ๋๋ฅผ ์์ฑํ๊ณ Clock
์ ์ค์ค๋ก ์
๋ฐ์ดํธํ๋๋ก ๋ง๋ค์ด๋ณด์.
1
root.render(<Clock />);
- ์ด๊ฒ์ ๊ตฌํํ๊ธฐ ์ํด์
Clock
์ปดํฌ๋ํธ์ โstateโ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค. - State๋ Props์ ์ ์ฌํ์ง๋ง, ๋น๊ณต๊ฐ์ด๋ฉฐ ์ปดํฌ๋ํธ์ ์ํด ์์ ํ ์ ์ด๋๋ค.
ํจ์๋ฅผ ํด๋์ค๋ก ๋ณํ
: ๋ค์ฏ ๋จ๊ณ๋ก Clock
ย ๊ณผ ๊ฐ์ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ํด๋์ค๋ก ๋ณํํ ์ ์๋ค.
React.Component
ย ๋ฅผ ํ์ฅํ๋ ๋์ผํ ์ด๋ฆ์ ES6 class๋ฅผ ์์ฑํ๋ค.- ๋น์ด์๋ย
render()
ย ๋ฉ์๋๋ฅผ ํ๋ ์ถ๊ฐํ๋ค. - ํจ์์ ๋ด์ฉ์ย
render()
ย ๋ฉ์๋ ์์ผ๋ก ์ฎ๊ธด๋ค. render()
ย ๋ฐ๋ ๋ด์์ยprops
ย ๋ฅผยthis.props
ย ๋ก ๋ฐ๊พผ๋ค.- ๋จ์์๋ ๋น ํจ์ ์ ์ธ๋ฌธ์ ์ ๊ฑฐํ๋ค.
1
2
3
4
5
6
7
8
9
10
class Clock extends React.Component {
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.props.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
Clock
ย ์ ์ด์ ํจ์๊ฐ ์๋ ํด๋์ค๋ก ์ ์๋๋ค.
Class์ ๋ก์ปฌ state ์ถ๊ฐํ๊ธฐ
: date
๋ฅผ props์์ state๋ก ์ฎ๊ธฐ๊ธฐ ์ํด์ 3๋จ๊ณ๋ฅผ ์งํํ๋ค.
1๏ธโฃ render()
ย ๋ฉ์๋ ๋ด์ย this.props.date
๋ฅผย this.state.date
๋ก ๋ฐ๊พผ๋ค.
1
2
3
4
5
6
7
8
9
10
class Clock extends React.Component {
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
2๏ธโฃ this.state
๋ฅผ ์ด๊ธฐํ ํ๋ย ํด๋์ค ์์ฑ์ย ๋ฅผ ์ถ๊ฐํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = { date: new Date() };
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
ํด๋์ค ์ปดํฌ๋ํธ๋ ํญ์
props
๋ก ๊ธฐ๋ณธconstructor
๋ฅผ ํธ์ถํด์ผํ๋ค.
3๏ธโฃ <Clock />
์์์์ย date
ย prop์ ์ญ์ ํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = { date: new Date() };
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
ReactDOM.render(<Clock />, document.getElementById("root"));
ํด๋์ค์ ๋ผ์ดํธ์ฌ์ดํด ๋ฉ์๋ ์ถ๊ฐํ๊ธฐ
: ๋ง์ ์ปดํฌ๋ํธ๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ปดํฌ๋ํธ๊ฐ ์ญ์ ๋ ๋ ํด๋น ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉ ์ค์ด๋ ๋ฆฌ์์ค๋ฅผ ํ๋ณดํ๋ ๊ฒ์ด ์ค์ํ๋ค.
Clock
์ด ์ฒ์ DOM์ ๋ ๋๋ง ๋ ๋๋ง๋คย ํ์ด๋จธ๋ฅผ ์ค์ ย ํ๋ ค๊ณ ํ๋ค. ์ด๊ฒ์ React์์ โmountingโ์ด๋ผ๊ณ ํ๋ค.Clock
์ ์ํด ์์ฑ๋ DOM์ด ์ญ์ ๋ ๋๋ง๋คย ํ์ด๋จธ๋ฅผ ํด์ ํ๋ ค๊ณ ํ๋ค. ์ด๊ฒ์ React์์ โunmountingโ์ด๋ผ๊ณ ํ๋ค.- ์ปดํฌ๋ํธ ํด๋์ค์์ ํน๋ณํ ๋ฉ์๋๋ฅผ ์ ์ธํ์ฌ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋๊ฑฐ๋ ์ธ๋ง์ดํธ ๋ ๋ ์ผ๋ถ ์ฝ๋๋ฅผ ์๋์ํฌ ์ ์๊ฒ ๋ง๋๋ ๋ฉ์๋๋ค์ย โ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋โย ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์์ฑ : componentDidMount()
ย ํ
์ ์ด๊ธฐ ๋ ๋๋ง ์ ์คํ ํ์ง ์๊ณ DOM์ด ๋ ๋๋ง ๋ ์ดํ ๋์ํ๋ค. ์ด ๋ถ๋ถ์ด ํ์ด๋จธ๋ฅผ ์ค์ ํ๊ธฐ ์ ๋นํ๋ค.
1
2
3
4
5
6
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
)
}
this
(this.timerId
)์์ ์ด๋ป๊ฒ ํ์ด๋จธ ID๋ฅผ ์ ๋๋ก ์ ์ฅํ๋์ง ์ฃผ์ํ์.
๋ง์ดํธ ํด์ : componentWillUnmount()
ย ๋ผ์ดํ์ฌ์ดํด ํ
์์ ํ์ด๋จธ๋ฅผ ์ข
๋ฃํ๋ค.
1
2
3
componentWillUnmount() {
clearInterval(this.timerId);
}
: this.setState()
๋ฅผ ์ฌ์ฉํ์ฌ state ์ ๊ฐ์ ๋ณ๊ฒฝํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
}
componentWillUnmount() {
clearInterval(this.timerID);
}
tick() {
this.setState({
date: new Date()
});
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
ReactDOM.render(
<Clock />,
1๏ธโฃ <Clock />
์ด ReactDOM.render()
์ ์ ๋ฌ๋ ๋, React๋ Clock
์ปดํฌ๋ํธ์ ์์ฑ์(constructor) ํจ์๋ฅผ ํธ์ถํ๋ค. Clock
์ด ํ ์๊ฐ ํ๋ฉด์ ๋ณด์ฌ์ง ๋, ํ ์๊ฐ์ ํฌํจํ๋ this.state
๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋ค. ์ด state๋ ๋์ค์ ์
๋ฐ์ดํธ ํ๋ค.
2๏ธโฃ React๋ Clock
์ปดํฌ๋ํธ์ render()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. React๊ฐ Clock
์ปดํฌ๋ํธ์ render()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. ๊ทธ๋ค์ React๋ย Clock
ย ์ ๋ ๋๋ง ์ถ๋ ฅ๊ณผ ์ผ์นํ๋๋ก DOM์ ์
๋ฐ์ดํธํ๋ค.
3๏ธโฃ Clock
ย ์ถ๋ ฅ์ด DOM์ ์ฃผ์
๋์์ ๋, React๋ย componentDidMount()
ย ๋ผ์ดํ ํ
์ ํธ์ถํ๋ค. ๊ทธ์์ย Clock
ย ์ปดํฌ๋ํธ๋ ๋ธ๋ผ์ฐ์ ์๊ฒ ์ปดํฌ๋ํธ์ย tick()
ย ๋ฉ์๋๋ฅผ ์ด๋น ํ๋ฒ ํธ์ถํ๋ ํ์ด๋จธ๋ฅผ ์ค์ ํ๋ผ๊ณ ์๊ตฌํ๋ค.
4๏ธโฃ๋งค ์ด๋ง๋คย ๋ธ๋ผ์ฐ์ ๊ฐtick()
ย ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. ๊ทธ ์์์ย Clock
ย ์ปดํฌ๋ํธ๋ ํ์ฌ ์๊ฐ์ ํฌํจํ๋ ๊ฐ์ฒด๋กย setState()
ย ๋ฅผ ํธ์ถํ์ฌ UI ์
๋ฐ์ดํธ๋ฅผ ์์ฝํ๋ค.ย setState()
ย ํธ์ถ ๋๋ถ์, React๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๊ฑธ ์๊ณ ์๊ณ ,ย render()
ย ๋ฉ์๋๋ฅผ ๋ค์ ํ๋ฒ ํธ์ถํด ํ๋ฉด์ ๋ฌด์์ด ์์ด์ผ ํ๋ ์ง ์ ์ ์๋ค. ์ด ๋ ย render()
ย ๋ฉ์๋ ๋ด์ย this.state.date
ย ๊ฐ ๋ฌ๋ผ์ง๊ณ ๋ ๋๋ง ์ถ๋ ฅ๊ฐ์ ์
๋ฐ์ดํธ๋ ์๊ฐ์ ํฌํจํ๋ค. React๋ ๊ทธ์ ๋ฐ๋ผ DOM์ ์
๋ฐ์ดํธํ๋ค.
5๏ธโฃ๋ง์ฝย Clock
ย ์ปดํฌ๋ํธ๊ฐ DOM์์ ์ญ์ ๋์๋ค๋ฉด, React๋ย componentWillUnmount()
ย ๋ผ์ดํ์ฌ์ดํด ํ
์ ํธ์ถํ๊ณ ํ์ด๋จธ๋ฅผ ๋ฉ์ถ๋ค.
State ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๊ธฐ
: setState()
์ ๋ํด ์์์ผ ํ 3๊ฐ์ง๊ฐ ์๋ค.
-
State๋ฅผ ์ง์ ์์ ํ์ง ๋ง์
1 2 3 4 5
// Wrong โ this.state.comment = "Hello"; // Correct โญ this.setState({ comment: "Hello" });
this.state
๋ฅผ ์ง์ ํ ์ ์๋ ์ ์ผํ ๊ณณ์constructor
๋ด๋ถ์ด๋ค.
-
State ์ ๋ฐ์ดํธ๋ ๋น๋๊ธฐ์ผ ์ ์๋ค.
- React๋ ์ฌ๋ฌ
setState()
ํธ์ถ์ ์ฑ๋ฅ์ ์ํด ๋จ์ผ ์ ๋ฐ์ดํธ๋ก ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ค. this.props
๋ฐthis.state
๊ฐ ๋น๋๊ธฐ๋ก ์ ๋ฐ์ดํธ๋ ์ ์๊ธฐ ๋๋ฌธ์, ๋ค์ state๋ฅผ ๊ณ์ฐํ ๋ ํด๋น ๊ฐ์ ์ ๋ขฐํด์๋ ์๋๋ค.- ์๋ฅผ ๋ค์ด, ์นด์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ์ด ์ฝ๋๋ ์คํจํ ์ ์๋ค.
1 2 3 4
// Wrong โ this.setState({ counter: this.state.counter + this.props.increment, });
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ์ฒด๊ฐ ์๋ ํจ์๋ฅผ ์ธ์๋ก ์ฌ์ฉํ๋ ๋ค๋ฅธ ํํ์
setState()
๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ ํจ์๋ ์ด์ state๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ฐ์๋๋ฆด ๊ฒ์ด๊ณ , ์ ๋ฐ์ดํธ๊ฐ ์ ์ฉ๋ ์์ ์ props๋ฅผ ๋ ๋ฒ์งธ ์ธ์๋ก ๋ฐ์๋ค์ผ ๊ฒ์ด๋ค.
1 2 3 4 5 6 7 8 9 10 11
// Correct - ํ์ดํ ํจ์ โญ this.setState((prevState, props) => ({ counter: prevState.counter + props.increment, })); // Correct - ์ผ๋ฐ ํจ์ โญ this.setState(function (prevState, props) { return { counter: prevState.counter + props.increment, }; });
- React๋ ์ฌ๋ฌ
-
State ์ ๋ฐ์ดํธ๋ ๋ณํฉ๋๋ค.
setState()
๋ฅผ ํธ์ถํ ๋, React๋ ํ์ฌ state์ ์ ๊ณตํ ๊ฐ์ฒด๋ฅผ ๋ณํฉํ๋ค. ์๋ฅผ ๋ค์ด, state๋ ์ฌ๋ฌ ๋ ๋ฆฝ์ ์ธ ๋ณ์๋ฅผ ๊ฐ์ง ์ ์๋ค.
1 2 3 4 5 6 7
constructor(props) { super(props); this.state = { posts: [], comments: [] }; }
- ๊ฐ๋ณ
setState()
๋ฅผ ํธ์ถํ์ฌ ์์ดํ ์ ๊ฐ ๊ฐ ์ ๋ฐ์ดํธํ ์ ์๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13
componentDidMount() { fetchPosts().then(response => { this.setState({ posts: response.posts }); }); fetchComments().then(response => { this.setState({ comments: response.comments }); }); }
- ๋ณํฉ์ ์๊ฒ ์ด๋ฃจ์ด์ ธ์ย
this.setState({comments})
๋ยthis.state.posts
์ ์ํฅ์ ์ฃผ์ง ์์ง๋งยthis.state.comments
๋ ์์ ํ ๋์ฒด๋๋ค.
๋ฐ์ดํฐ๋ ์๋๋ก ํ๋ฅธ๋ค.
: ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ ์์ ์ปดํฌ๋ํธ๋ ํน์ ์ปดํฌ๋ํธ์ state ์ ๋ฌด๋ฅผ ์ ์ ์์ผ๋ฉฐ ํด๋น ์ปดํฌ๋ํธ๊ฐ ํจ์๋ ํด๋์ค๋ก ์ ์ธ๋์๋์ง ์ ์ ์๋ค.
์ด๋ state๊ฐ ๋ก์ปฌ์ด๋ผ๊ณ ๋ถ๋ฅด๊ฑฐ๋ ์บก์ํ๋ ์ด์ ์ด๋ค. ์ปดํฌ๋ํธ ์์ ์ธ์๋ ์ ๊ทผํ ์ ์๋ค. ์ปดํฌ๋ํธ๋ ์์ ์ state๋ฅผ ์์ ์ปดํฌ๋ํธ์ props๋ก ์ ๋ฌํ ์ ์๋ค.
1
<FormattedDate date={this.state.date} />
FormattedDate
ย ์ปดํฌ๋ํธ๋ props์์ย date
๋ฅผ ๋ฐ์ง๋ง ์ด ๊ฐ์ดย Clock
์ state์ธ ์ง,ย Clock
์ props์ธ ์ง, ํน์ ์๋์ผ๋ก ์
๋ ฅํ ๊ฑด์ง ์ ์ ์๋ค.
1
2
3
function FormattedDate(props) {
return <h2>It is {props.date.toLocaleTimeString()}.</h2>;
}
- ์ด๋ฐ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ณดํต โํํฅ์โ ํน์ โ๋จ๋ฐฉํฅ์โ ๋ฐ์ดํฐ ํ๋ฆ์ด๋ผ๊ณ ํ๋ค. ๋ชจ๋ state๋ ํญ์ ํน์ ์ปดํฌ๋ํธ๊ฐ ์์ ํ๋ฉฐ, ๊ทธ state์์ ํ์๋ ๋ชจ๋ UI, ๋ฐ์ดํฐ๋ ํธ๋ฆฌ์ ์ปดํฌ๋ํธ โ์๋โ์๋ง ์ํฅ์ ๋ผ์น๋ค.
: ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ์์ ํ ๋
๋ฆฝ์ ์ด๋ผ๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด App ์ ๋ ๋๋งํ๋ ์ธ ๊ฐ์ <Clock>
์ ์์ฑํ๋ค.
1
2
3
4
5
6
7
8
9
function App() {
return (
<div>
<Clock />
<Clock />
<Clock />
</div>
);
}
- ๊ฐ
<Clock>
์ ์์ ๋ง์ ํ์ด๋จธ๋ฅผ ์ค์ ํ๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ์ ๋ฐ์ดํธ ํ๋ค.
๐๐ป React์ฑ์์ ์ปดํฌ๋ํธ๊ฐ ์ํ๊ฐ ์๋ ์ง ์๋์ง์ ๋ํ ๊ฒ์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋ ์ ์๋ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ผ๋ก ๊ฐ์ฃผ๋๋ค. ์ ์ํ ์ปดํฌ๋ํธ ์์์ ๋ฌด์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ๊ทธ ๋ฐ๋ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
Leave a comment