.png)
1>๐Stete์ ๐event๋ฅผ ์ฌ์ฉํด์ UI๋ฅผ ์ ๋ฐ์ดํธ ํด๋ณด๊ณ 2>๐ปProps๋ก state์ event handler๋ฅผ ๋๊ฒจ๋ณด์ข.
state๋ ํ๋ฉด์ ๋ณด์ฌ์ง๋ ๊ฒ์ ํต์ฌ์ ๋ณด๋ก์ ๊ฒฐ๊ตญ UI๋ render(state)์ด๋ค.- ์ด๋ ํ๋ฉด์ ๋ณด์ฌ์ง๋ UI๋ ๋ชจ๋
state๋ก๋ถํฐ ๊ทธ๋ ค์ง๊ณ ์ค์งstate์ ์ํด์๋ง ํ๋ฉด์ด ๋ณํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
state์ ๋จ์ด ๋ป์ธ ์ํ, ์ฆ ์๋ฏธ ๊ทธ๋๋ก ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๊ฐ์ง๊ณ ์๋ ์ปดํฌ๋ํธ์ ์ํ๊ฐ์ ์๋ฏธํฉ๋๋ค.
์ฆ, state๋ ํ๋ฉด์ ๋ณด์ฌ์ค ์ปดํฌ๋ํธ์ UI์ ๋ณด๋ฅผ ์ง๋๊ณ ์๋ "๊ฐ์ฒด"์ด๋ค.
State ์ญ์ props์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ฒด๋ผ๋ ์ ์ด๋ค.<script> this.state = { color: 'red', fontSize: '40px' }; </script>
- ๊ฐ์ฒด ๋ด๋ถ์ key(color)์ key์ value(red)๊ฐ ํ ์์ผ๋ก ๋ค์ด๊ฐ๋ค.
1>
constructor ํจ์๋ด๋ถ์super()๋ฅผ ํธ์ถํ๊ณ props๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํด์ค๋ค.
2> ์ดํthis.state๊ฐ์ ์ด๊ธฐ๊ฐ(์ปดํฌ๋ํธ์ ์ด๊ธฐ ์ํ ๊ฐ)์ ๋จผ์ ์ธํ ํด์ฃผ๋ฉด ์ดํ 3>render ํจ์๊ฐ ์คํ๋๋ค.
4>state์ ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋this.setState()๋ฅผ ํตํด ๋ณ๊ฒฝํด์ผํ๋ฉฐ,
5> ์ด๋ฅผ ํตํด ์ปดํฌ๋ํธ์ ์ํ๊ฐ ๋ณ๊ฒฝ์ด ๋๋ฉด render ํจ์๊ฐ ๋ฆฌ๋ ๋๋ง, ์ฌ์คํ ๋๋ค.
state์์ ์ํ๊ฐ์ ์ค์ ํ๋ ์ด์ ๋ ์ปดํฌ๋ํธ ๋ด๋ถ ์์์์ ์ํ๊ฐ์ ๋ฐ์ํ์ฌ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํจ๊ณผ์ ์ผ๋ก ํ๋ฉด(UI)์ ๋ํ๋๋๋ก ๋ง๋ค๊ธฐ ์ํด์์ด๋ค.- ์ด๋ ์์ ์ดํด๋ณธ
UI = render(state)๊ณต์๊ณผ ๋์ผํ๋ค.
- ํด๋น
state๋ฅผ ํ์ฉํ์ฌ JSX ์์์ ์ธ๋ผ์ธ ์คํ์ผ์ ์ ์ฉํ๊ธฐ ์ํด์ ๋ค์๊ณผ ๊ฐ์ด ์ ๊ทผํ ์ ์๋ค.<script> import React, { Component } from 'react'; class State extends Component { constructor() { super(); this.state = { color: 'red', fontSize: '40px' }; } render() { return ( <div> <h1 style={{ color: this.state.color, fontSize: this.state.fontSize }}> Class Component | State </h1> </div> ); } } export default State; </script>
dot notation์ ์ด์ฉํ์ฌ ๊ฐ์ฒด์ ํน์ key ๊ฐ์ ์ ๊ทผํ์ฌ ํน์ key ๊ฐ์ color ์์ฑ์ value๋ก ์ง์ ํด ์ค ์ ์๋ค.- ์ด๋ฅผ ํตํด
state์ํ ๊ฐ์ ์ค์ ํ๋ฉด ์ปดํฌ๋ํธ ๋ด๋ถ์ ์์(h1)์์ ์ํ๊ฐ์ ๋ฐ์ํ์ฌ UI์ ๋ํ๋์ง๋๋ก ํ ์ ์๋ค.<script> <h1 style={{ color: this.state.color, fontSize: this.state.fontSize }}> Class Component | State </h1> // this : ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. // this.state : ํด๋น ์ปดํฌ๋ํธ์ state ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค. // this.state.color : state ๊ฐ์ฒด์ ํน์ key ๊ฐ์ด๋ค. </script>
<script>
setState(updater, [callback])
</script>
setState ํจ์๋ฅผ ํตํด state ์ํ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
setState ํจ์๋ 2๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋๋ฐ
1> ์ฒซ ๋ฒ์งธ updater์๋ ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ๊ฑฐ๋ ํจ์ํํ๊ฐ ๋ค์ด๊ฐ ์ ์๋ค.
2> ๋๋ฒ์งธ๋ callback ์ธ์์๋ ์ฝ๋ฐฑํจ์๊ฐ ๋ค์ด๊ฐ ์ ์๋ค.
<script> import React, { Component } from 'react'; class State extends Component { constructor() { super(); this.state = { color: 'red', }; } handleColor = () => { this.setState({ color: 'blue' }) } render() { return ( <div> <h1 style={{ color: this.state.color }}>Class Component | State</h1> <button onClick={this.handleColor}>Click</button> </div> ); } } export default State;</script> </script>
- 1> button ์์์
onClick ์ด๋ฒคํธ๋ฐ์์์ ํ์ฌ ์ปดํฌ๋ํธ(state)์handleColor ํจ์๊ฐ ์คํ๋๋ค.- 2>
handleColor ํจ์์คํ๋๋ฉดsetStateํจ์ ์คํ๋์ด ์ด๋ฅผ ํตํด state์color๊ฐ์ 'blue' ๋ก ๋ณ๊ฒฝํด์ค๋ค.- 3>
state๊ฐ์ด ๋ฐ๋๋ฉดrenderํจ์๊ฐ ๋ค์ ํธ์ถ๋์ด ๋ฐ๋ state ๊ฐ์ ๋ฐ์ํ์ฌ<h1>ํ๊ทธ ๊ธ์ ์์ ๋ณ๊ฒฝ๋๋ค.
- ๋ฐ๋ผ์ state์ ๋ฐ๋ผ className์ ๋ณ๊ฒฝํ์ฌ style์ ๋ฐ๊พธ์ด์ฃผ๋๋ก ๊ตฌํํ๋ ๊ฒ์ด ์ข๋ค.
<script> import React, { Component } from 'react'; class State extends Component { constructor() { super(); this.state = { isChangecolor: false, }; } handleColor = () => { this.setState({ isChangecolor: !this.state.isChangecolor, }) } render() { return ( <div> <h1 className={isChangecolor ? "red" : "normal "}> Class Component | State </h1> <button onClick={this.handleColor}>Click</button> </div> ); } } export default State </script>
props(properties, ์์ฑ)๋ ๋จ์ด ์๋ฏธ ๊ทธ๋๋กย ์ปดํฌ๋ํธ์ ์์ฑ๊ฐ์ผ๋กprops๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ง๋๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค.
props๋ ๋ถ๋ชจ์state๋ฅผ ์์์๊ฒ ๋๊ฒจ์ฃผ๋ ํํ์ด๋ค. ์ด๋ ๊ฒ ๋ถ๋ชจ์ ์ํ๋ฅผ ์์์๊ฒ ๋๊ฒจ์ฃผ๋ ํํ๋ ๋ฆฌ์กํธ์์ ์์ฃผ ์ฐ์ด๋ ํจํด์ด๋ค.<script> import React from 'react'; import Child from '../pages/Child/Child'; // ๋ถ๋ชจ ์ปดํฌ๋ํธ class Parent extends React.Component { constructor() { super(); this.state = { color: 'red' }; } render() { return ( <div> <h1>Parent Component</h1> // ์์ ์ปดํฌ๋ํธ์ props ์ค์ ํ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ state๋ฅผ ๋๊ฒจ์ฃผ๊ณ ์๋ค. <Child titleColor={this.state.color}/> </div> ); } } export default Parent; </script><script> import React from 'react'; // ์์ ์ปดํฌ๋ํธ class Child extends React.Component { render() { // ๋๊ฒจ๋ฐ์ state๋ฅผ ์์ ์ปดํฌ๋ํธ์์ ์ฐ์ด๋ณธ๋ค. console.log("์ด๊ฐ์๋ญ๊น?", this.props.titleColor); // ๋ถ๋ชจ์ state ๊ฐ์ธ 'red'๊ฐ ์ง์! return ( <div> <h1 style={{color : this.props.titleColor}}>Child Component</h1> </div> ); } } export default Child; </script>
- ์์ ์ปดํฌ๋ํธ๋ ๋ถ๋ชจ๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ๋ก๋ถํฐ ํ๋ฉด์ ๋ฌ๋ผ์ง๊ฒ ํด์ค๋ค.
- ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ์๊ฒ ๋๊ฒจ์ฃผ๋ ๋ฐ์ดํฐ๋
state๊ฐ ๋ ์ ์๊ณํจ์๊ฐ ๋ ์ ์์ด ๊ทธ ํจ์๊ฐ event handler์ผ ์ ๋ ์๋ค.props๋ ์ค์ ๋กstate๋ก๋ถํฐ ์ค๊ณ ์๋ค.props๋ช ๊ณผevent handler๋ก ๋๊ฒจ์ค ํจ์ ๋ช ์ ๋๊ฐ์ ๊ฑธ๋ก ์ง์ด์ฃผ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ์ปจ๋ฒค์ ์ด๋ค.
state๋ฅผ ๋ณํ์ํค๋ event handler ํจ์๋ฅผ props๋ก ๋๊ฒจ์ค๋ค๋ฉด, 2>์์์ ๊ทธ ํจ์๋ฅผ ์คํํ์ฌ ๋ถ๋ชจ์ state๋ฅผ ๋ณํ์ํฌ ์ ์๋ค!<script>
import React from 'react';
import Child from '../pages/Children/Children';
class Parent extends React.Component {
constructor() {
super();
this.state = {
color: 'red'
};
}
changeColor = () => {
this.setState({
color: 'blue'
})
}
render() {
return (
<div>
<h1>Parent Component</h1>
<Child titleColor={this.state.color} changeColor={this.changeColor}/>
</div>
);
}
}
export default State;
</script>
props ๊ฐ์ฒด๋ฅผ ํตํด state ๋ฐ์ดํฐ ๋ฟ๋ง ์๋๋ผ ๋ถ๋ชจ์์ ์ ์ํ event handler ํจ์๋ ๋๊ฒจ์ค๋ค.props์ changeColor ๊ฐ์ผ๋ก Parent ํจ์์์ ์ ์ํ handleColor ํจ์ ์์ฒด๋ฅผ ๋๊ฒจ์ฃผ๊ณ ์๋ค.<Child /> ์ปดํฌ๋ํธ์์ ์ด๋ป๊ฒ props๋ก ์ ๋ฌ๋ฐ์ handleColor ํจ์๋ฅผ ํ์ฉํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.state๋ ๋จ๋ฐฉํฅ์ผ๋ก ํ๋ฌ๊ฐ๋ค
๋ฐ๋ผ์ ์์ ์ปดํฌ๋ํธ์์ ์ ์คํ ์ดํธ๋ก ์คํ ์ดํธ๋ฅผ ๋ณ๊ฒฝํ๋ค๋ ๊ฑด ์์์ปดํฌ๋ํธ ์์ฒด๊ฐ ๊ฐ์ง ์คํ ์ดํธ๋ฅผ ์ ๊ทธ๋ ์ด๋ํ๋ ๊ฒ์ด์ง ๋ถ๋ชจ๋ก๋ถํฐ ๋ฐ์์จ ๊ฒ์ ์ ๋ฐ์ดํธํ์ง ๋ชปํ๋ค.
- state์ event๋ฅผ ํ์ฉํ์ฌ UI๊ฐ ๋ณ๊ฒฝ๋๋ ๊ณผ์ ์ ์ดํดํด๋ณด๊ณ UI = render(state) ๊ณต์์ ์๋ฏธ๋ฅผ ๊ณฑ์น์ด๋ณด์!
- ์์ฝ๋ ์ฅํ๋์ ํฌ์ธํธ ๊ฐ์ ์ค :]