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) ๊ณต์์ ์๋ฏธ๋ฅผ ๊ณฑ์น์ด๋ณด์!
- ์์ฝ๋ ์ฅํ๋์ ํฌ์ธํธ ๊ฐ์ ์ค :]