React.Component
์ด ๋ฌธ์์์๋ React ์ปดํฌ๋ํธ class๋ฅผ ๋ค๋ฃจ๋ API๋ค์ ์์ธํ ์๊ฐํฉ๋๋ค. ์ด ๋ฌธ์๋ ์ปดํฌ๋ํธ์ props, state์ ์๋ช ์ฃผ๊ธฐ ๋ฑ๊ณผ ๊ฐ์ ๊ธฐ์ด์ ์ธ React์ ๊ฐ๋ ๋ค์ ์ต์ํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์์ต๋๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด, ๋จผ์ ์ฝ์ผ์๊ธธ ๋ฐ๋๋๋ค.
๊ฐ์
React๋ฅผ ์ฌ์ฉํ ๋๋ ์ปดํฌ๋ํธ๋ฅผ class ๋๋ ํจ์๋ก ์ ์ํ ์ ์์ต๋๋ค. class๋ก ์ ์๋ ์ปดํฌ๋ํธ๋ ์๋์ ์์ธํ ์ค๋ช
ํ๊ณ ์๋ฏ ๋ณด๋ค ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. React ์ปดํฌ๋ํธ class๋ฅผ ์ ์ํ๋ ค๋ฉด React.Component
๋ฅผ ์์๋ฐ์์ผ ํฉ๋๋ค.
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
render()
๋ React.Component
์ ํ์ class์์ ๋ฐ๋์ ์ ์ํด์ผ ํ๋ ๋ฉ์๋์
๋๋ค. ๊ทธ ์ธ์ ์ด ๋ฌธ์์์ ์ค๋ช
ํ๋ ๋ฉ์๋๋ค์ ์ ํ ์ฌํญ์
๋๋ค.
์ปดํฌ๋ํธ ํด๋์ค๋ฅผ ์ง์ ๋ง๋ค์ด์ ์ฌ์ฉํ์ง ๋ง์ธ์. React ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ๋์๋ ์์๋ณด๋ค ํฉ์ฑ์ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
์ฃผ์
React๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ๋์ ES6 class ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ง ์์๋ ๋ฉ๋๋ค. ๊ทธ ๋์
create-react-class
๋ชจ๋ ๋๋ ์ด์ ์ ์ฌํ ๋ณ๋์ ์ถ์ํ๋ฅผ ์ฌ์ฉํด๋ ๋ฉ๋๋ค. ์์ธํ ์ ๋ณด๋ ES6 ์์ด ์ฌ์ฉํ๋ React ๋ฌธ์์์ ํ์ธํ ์ ์์ต๋๋ค.
์ปดํฌ๋ํธ ์๋ช ์ฃผ๊ธฐ
๋ชจ๋ ์ปดํฌ๋ํธ๋ ์ฌ๋ฌ ์ข ๋ฅ์ โ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋โ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ด ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ํน์ ์์ ์ ์ฝ๋๊ฐ ์คํ๋๋๋ก ์ค์ ํ ์ ์์ต๋๋ค. ์ด ์๋ช ์ฃผ๊ธฐ ๋ํ๋ฅผ ํ์ํ ๋๋ง๋ค ํ์ฉํ๋ฉด ์ข์ต๋๋ค. ์๋ ๋ชฉ๋ก์์ ์์ฃผ ์ฌ์ฉ๋๋ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ์งํ๊ฒ ํ์ํ์ต๋๋ค. ๋๋จธ์ง ๊ฒ๋ค์ ์๋์ ์ผ๋ก ์์ฃผ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
๋ง์ดํธ
์๋ ๋ฉ์๋๋ค์ ์ปดํฌ๋ํธ์ ์ธ์คํด์ค๊ฐ ์์ฑ๋์ด DOM ์์ ์ฝ์ ๋ ๋์ ์์๋๋ก ํธ์ถ๋ฉ๋๋ค.
์ฃผ์
์๋ ๋ฉ์๋๋ ๊ธฐ์กด์ ์ฌ์ฉ๋์์ง๋ง ์ด์ ๋ ์ฌ์ฉํ๋ฉด ์ ๋ฉ๋๋ค.
์ ๋ฐ์ดํธ
props ๋๋ state๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ฐฑ์ ์ด ๋ฐ์ํฉ๋๋ค. ์๋ ๋ฉ์๋๋ค์ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋ ๋ ์์๋๋ก ํธ์ถ๋ฉ๋๋ค.
static getDerivedStateFromProps()
shouldComponentUpdate()
render()
getSnapshotBeforeUpdate()
componentDidUpdate()
์ฃผ์
์๋ ๋ฉ์๋๋ ๊ธฐ์กด์ ์ฌ์ฉ๋์์ง๋ง ์ด์ ๋ ์ฌ์ฉํ๋ฉด ์ ๋ฉ๋๋ค.
๋ง์ดํธ ํด์
์๋ ๋ฉ์๋๋ ์ปดํฌ๋ํธ๊ฐ DOM ์์์ ์ ๊ฑฐ๋ ๋์ ํธ์ถ๋ฉ๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ
์๋ ๋ฉ์๋๋ค์ ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ฑฐ๋, ์์ ์ปดํฌ๋ํธ๊ฐ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฑฐ๋, ๋๋ ์์ ์ปดํฌ๋ํธ๊ฐ ์์ฑ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋์ ํธ์ถ๋ฉ๋๋ค.
๊ธฐํ API
์ด ์ธ์๋ ์ปดํฌ๋ํธ๋ ๋ช๋ช API๋ฅผ ์ ๊ณตํฉ๋๋ค.
class ํ๋กํผํฐ
์ธ์คํด์ค ํ๋กํผํฐ
์ฐธ๊ณ ์
์์ฃผ ์ฌ์ฉ๋๋ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋
์ด ์น์ ์์ ๋ค๋ฃจ๋ ๋ฉ์๋๋ค์ ์ฌ์ฉํ๋ฉด React ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ๋์ ๋ง์ฃผ์น๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ด ์๋ช ์ฃผ๊ธฐ ๋ํ๋ฅผ ์๊ฐ ์๋ฃ๋ก ํ์ฉํ๋ฉด ์ข์ต๋๋ค.
render()
render()
render()
๋ฉ์๋๋ ํด๋์ค ์ปดํฌ๋ํธ์์ ๋ฐ๋์ ๊ตฌํ๋ผ์ผํ๋ ์ ์ผํ ๋ฉ์๋์
๋๋ค.
์ด ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด this.props
์ this.state
์ ๊ฐ์ ํ์ฉํ์ฌ ์๋์ ๊ฒ ์ค ํ๋๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
- React ์๋ฆฌ๋จผํธ. ๋ณดํต JSX๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด,
<div />
์<MyComponent />
๋ React๊ฐ DOM ๋ ธ๋ ๋๋ ์ฌ์ฉ์๊ฐ ์ ์ํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๋๋ก ์ง์ํ๋ React ์๋ฆฌ๋จผํธ์ ๋๋ค. - ๋ฐฐ์ด๊ณผ Fragment.
render()
๋ฅผ ํตํ์ฌ ์ฌ๋ฌ ๊ฐ์ ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํฉ๋๋ค. ์์ธํ ์ ๋ณด๋ Fragments ๋ฌธ์๋ฅผ ํตํ์ฌ ํ์ธํ ์ ์์ต๋๋ค. - Portal. ๋ณ๋์ DOM ํ์ ํธ๋ฆฌ์ ์์ ์๋ฆฌ๋จผํธ๋ฅผ ๋ ๋๋งํฉ๋๋ค. ์์ธํ ์ ๋ณด๋ Portals์์ ํ์ธํ ์ ์์ต๋๋ค.
- ๋ฌธ์์ด๊ณผ ์ซ์. ์ด ๊ฐ๋ค์ DOM ์์ ํ ์คํธ ๋ ธ๋๋ก์ ๋ ๋๋ง๋ฉ๋๋ค.
- Boolean ๋๋ null. ์๋ฌด๊ฒ๋ ๋ ๋๋งํ์ง ์์ต๋๋ค. (๋๋ถ๋ถ์ ๊ฒฝ์ฐ
return test && <Child />
ํจํด์ ์ง์ํ๋ ๋ฐ์ ์ฌ์ฉ๋๋ฉฐ, ์ฌ๊ธฐ์test
๋ boolean ๊ฐ์ ๋๋ค.)
render()
ํจ์๋ ์์ํด์ผ ํฉ๋๋ค. ์ฆ, ์ปดํฌ๋ํธ์ state๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ํธ์ถ๋ ๋๋ง๋ค ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํด์ผ ํ๋ฉฐ, ๋ธ๋ผ์ฐ์ ์ ์ง์ ์ ์ผ๋ก ์ํธ์์ฉ์ ํ์ง ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ์ ์ํธ์์ฉํ๋ ์์
์ด ํ์ํ๋ค๋ฉด, ํด๋น ์์
์ componentDidMount()
์ด๋ ๋ค๋ฅธ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋ ๋ด์์ ์ํํ์ธ์. render()
๋ฅผ ์์ํ๊ฒ ์ ์งํ์ฌ์ผ ์ปดํฌ๋ํธ์ ๋์์ ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค.
์ฃผ์
shouldComponentUpdate()
๊ฐ false๋ฅผ ๋ฐํํ๋ฉดrender()
๋ ํธ์ถ๋์ง ์์ต๋๋ค.
constructor()
constructor(props)
๋ฉ์๋๋ฅผ ๋ฐ์ธ๋ฉํ๊ฑฐ๋ state๋ฅผ ์ด๊ธฐํํ๋ ์์ ์ด ์๋ค๋ฉด, ํด๋น React ์ปดํฌ๋ํธ์๋ ์์ฑ์๋ฅผ ๊ตฌํํ์ง ์์๋ ๋ฉ๋๋ค.
React ์ปดํฌ๋ํธ์ ์์ฑ์๋ ํด๋น ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋๊ธฐ ์ ์ ํธ์ถ๋ฉ๋๋ค. React.Component
๋ฅผ ์์ํ ์ปดํฌ๋ํธ์ ์์ฑ์๋ฅผ ๊ตฌํํ ๋์๋ ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ์์ super(props)
๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด this.props
๊ฐ ์์ฑ์ ๋ด์์ ์ ์๋์ง ์์ ๋ฒ๊ทธ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
React์์ ์์ฑ์๋ ๋ณดํต ์๋์ ๋ ๊ฐ์ง ๋ชฉ์ ์ ์ํ์ฌ ์ฌ์ฉ๋ฉ๋๋ค.
this.state
์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ์ฌ ์ง์ญ state๋ฅผ ์ด๊ธฐํ- ์ธ์คํด์ค์ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฉ์๋๋ฅผ ๋ฐ์ธ๋ฉ
constructor()
๋ด๋ถ์์ setState()
๋ฅผ ํธ์ถํ๋ฉด ์ ๋ฉ๋๋ค. ์ปดํฌ๋ํธ์ ์ง์ญ state๊ฐ ํ์ํ๋ค๋ฉด ์์ฑ์ ๋ด์์ this.state
์ ์ด๊ธฐ state ๊ฐ์ ํ ๋นํ๋ฉด ๋ฉ๋๋ค.
constructor(props) {
super(props);
// ์ฌ๊ธฐ์ this.setState()๋ฅผ ํธ์ถํ๋ฉด ์ ๋ฉ๋๋ค!
this.state = { counter: 0 };
this.handleClick = this.handleClick.bind(this);
}
์์ฑ์๋ this.state
๋ฅผ ์ง์ ํ ๋นํ ์ ์๋ ์ ์ผํ ๊ณณ์
๋๋ค. ๊ทธ ์ธ์ ๋ฉ์๋์์๋ this.setState()
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์์ฑ์ ๋ด์์๋ ๋ถ์ ํจ๊ณผ๋ฅผ ๋ฐ์์ํค๊ฑฐ๋ ๊ตฌ๋
์์
(subscription)์ ์ํํ๋ฉด ์ ๋ฉ๋๋ค. ํด๋น ๊ฒฝ์ฐ์๋ componentDidMount()
๋ฅผ ๋์ ์ฌ์ฉํ์ธ์.
์ฃผ์
state์ props๋ฅผ ๋ณต์ฌํ๋ฉด ์ ๋ฉ๋๋ค! ๊ฐ์ฅ ํํ ๋ฒํ๋ ์ค์ ์ค ํ๋์ ๋๋ค.
constructor(props) { super(props); // ์ด๋ ๊ฒ ํ์ง ๋ง์ธ์! this.state = { color: props.color }; }
์ด๊ฒ์ ๋ถํ์ํ ์์ ์ด๋ฉฐ(
this.props.color
๋ฅผ ์ง์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค), ๋ฒ๊ทธ๋ฅผ ๋ฐ์์ํต๋๋ค(color
props์ ๊ฐ์ด ๋ณํ๋๋ผ๋ state์ ๋ฐ์๋์ง ์์ต๋๋ค).props์ ๊ฐฑ์ ์ ์๋์ ์ผ๋ก ๋ฌด์ํด์ผ ํ ๋๋ง ์ด์ ๊ฐ์ ํจํด์ ์ฌ์ฉํ๊ธฐ ๋ฐ๋๋๋ค. ์ด ๊ฒฝ์ฐ, ํด๋น props์ ์ด๋ฆ์
initialColor
๋๋defaultColor
๋ฑ์ผ๋ก ๋ณ๊ฒฝํ๋ ํธ์ด ์์ฐ์ค๋ฝ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ดํ ํ์์ ๋ฐ๋ผ ์ปดํฌ๋ํธ๊ฐkey
๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ด๊ธฐ state๋ฅผ โ์ฌ์ค์ โํ๋๋ก ๊ฐ์ ํ ์ ์์ต๋๋ค.props์ ๊ฐ์ ์์กดํ๋ state๊ฐ ํ์ํ ๋ ์ด๋ป๊ฒ ํด์ผ ํ๋์ง์ ๋ํ์ฌ ์๊ณ ์ถ๋ค๋ฉด, ์ฐ๋ฆฌ๊ฐ ์์ฑํ state๋ก๋ถํฐ ๊ฐ์ ๊ฐ์ ธ์ค์ง ์๋ ๋ฒ์ ๋ํ ๋ธ๋ก๊ทธ ๊ธ์ ์ฝ์ด๋ณด์ธ์.
componentDidMount()
componentDidMount()
componentDidMount()
๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ์งํ, ์ฆ ํธ๋ฆฌ์ ์ฝ์
๋ ์งํ์ ํธ์ถ๋ฉ๋๋ค. DOM ๋
ธ๋๊ฐ ์์ด์ผ ํ๋ ์ด๊ธฐํ ์์
์ ์ด ๋ฉ์๋์์ ์ด๋ฃจ์ด์ง๋ฉด ๋ฉ๋๋ค. ์ธ๋ถ์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ผ ํ๋ค๋ฉด, ๋คํธ์ํฌ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ํ ์์น์
๋๋ค.
์ด ๋ฉ์๋๋ ๋ฐ์ดํฐ ๊ตฌ๋
์ ์ค์ ํ๊ธฐ ์ข์ ์์น์
๋๋ค. ๋ฐ์ดํฐ ๊ตฌ๋
์ด ์ด๋ฃจ์ด์ก๋ค๋ฉด, componentWillUnmount()
์์ ๊ตฌ๋
ํด์ ์์
์ ๋ฐ๋์ ์ํํ๊ธฐ ๋ฐ๋๋๋ค.
componentDidMount()
์์ ์ฆ์ setState()
๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ์ด๋ก ์ธํ์ฌ ์ถ๊ฐ์ ์ธ ๋ ๋๋ง์ด ๋ฐ์ํ์ง๋ง, ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๊ฐฑ์ ํ๊ธฐ ์ ์ ์ด๋ฃจ์ด์ง ๊ฒ์
๋๋ค. ์ด ๊ฒฝ์ฐ render()
๊ฐ ๋ ๋ฒ ํธ์ถ๋์ง๋ง, ์ฌ์ฉ์๋ ๊ทธ ์ค๊ฐ ๊ณผ์ ์ ๋ณผ ์ ์์ ๊ฒ์
๋๋ค. ์ด๋ฐ ์ฌ์ฉ ๋ฐฉ์์ ์ฑ๋ฅ ๋ฌธ์ ๋ก ์ด์ด์ง๊ธฐ ์ฌ์ฐ๋ฏ๋ก ์ฃผ์๊ฐ ํ์ํฉ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ, ์์ ๋ฐฉ์์ ๋์ ํ์ฌ constructor()
๋ฉ์๋์์ ์ด๊ธฐ state๋ฅผ ํ ๋นํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ชจ๋ฌ(Modal) ๋๋ ํดํ๊ณผ ๊ฐ์ด ๋ ๋๋ง์ ์์ DOM ๋
ธ๋์ ํฌ๊ธฐ๋ ์์น๋ฅผ ๋จผ์ ์ธก์ ํด์ผ ํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ ๋ฐฉ์์ด ํ์ํ ์ ์์ต๋๋ค.
componentDidUpdate()
componentDidUpdate(prevProps, prevState, snapshot)
componentDidUpdate()
๋ ๊ฐฑ์ ์ด ์ผ์ด๋ ์งํ์ ํธ์ถ๋ฉ๋๋ค. ์ด ๋ฉ์๋๋ ์ต์ด ๋ ๋๋ง์์๋ ํธ์ถ๋์ง ์์ต๋๋ค.
์ปดํฌ๋ํธ๊ฐ ๊ฐฑ์ ๋์์ ๋ DOM์ ์กฐ์ํ๊ธฐ ์ํ์ฌ ์ด ๋ฉ์๋๋ฅผ ํ์ฉํ๋ฉด ์ข์ต๋๋ค. ๋ํ, ์ด์ ๊ณผ ํ์ฌ์ props๋ฅผ ๋น๊ตํ์ฌ ๋คํธ์ํฌ ์์ฒญ์ ๋ณด๋ด๋ ์์ ๋ ์ด ๋ฉ์๋์์ ์ด๋ฃจ์ด์ง๋ฉด ๋ฉ๋๋ค (๊ฐ๋ น, props๊ฐ ๋ณํ์ง ์์๋ค๋ฉด ๋คํธ์ํฌ ์์ฒญ์ ๋ณด๋ผ ํ์๊ฐ ์์ต๋๋ค).
componentDidUpdate(prevProps) {
// ์ ํ์ ์ธ ์ฌ์ฉ ์ฌ๋ก (props ๋น๊ต๋ฅผ ์์ง ๋ง์ธ์)
if (this.props.userID !== prevProps.userID) {
this.fetchData(this.props.userID);
}
}
componentDidUpdate()
์์ setState()
๋ฅผ ์ฆ์ ํธ์ถํ ์๋ ์์ง๋ง, ์์ ์์์ฒ๋ผ ์กฐ๊ฑด๋ฌธ์ผ๋ก ๊ฐ์ธ์ง ์์ผ๋ฉด ๋ฌดํ ๋ฐ๋ณต์ด ๋ฐ์ํ ์ ์๋ค๋ ์ ์ ์ฃผ์ํ์ธ์. ๋ํ ์ถ๊ฐ์ ์ธ ๋ ๋๋ง์ ์ ๋ฐํ์ฌ, ๋น๋ก ์ฌ์ฉ์๋ ๋์น์ฑ์ง ๋ชปํ ์ง๋ผ๋ ์ปดํฌ๋ํธ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์์์์ ๋ด๋ ค์จ prop์ ๊ทธ๋๋ก state์ ์ ์ฅํ๋ ๊ฒ์ ์ข์ง ์์ผ๋ฉฐ, ๊ทธ ๋์ prop์ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด์ ๊ด๋ จ๋ ์์ธํ ์ ๋ณด๋ props๋ฅผ state์ ๋ณต์ฌํ๋ ๊ฒ์ด ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ๋ ์ด์ ์์ ํ์ธํ ์ ์์ต๋๋ค.
์ปดํฌ๋ํธ์์ getSnapshotBeforeUpdate()
๋ฅผ ๊ตฌํํ๋ค๋ฉด, ํด๋น ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ componentDidUpdate()
์ ์ธ ๋ฒ์งธ โsnapshotโ ์ธ์๋ก ๋๊ฒจ์ง๋๋ค. ๋ฐํ๊ฐ์ด ์๋ค๋ฉด ํด๋น ์ธ์๋ undefined๋ฅผ ๊ฐ์ง๋๋ค.
์ฃผ์
componentDidUpdate()
๋shouldComponentUpdate()
๊ฐ false๋ฅผ ๋ฐํํ๋ฉด ํธ์ถ๋์ง ์์ต๋๋ค.
componentWillUnmount()
componentWillUnmount()
componentWillUnmount()
๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ํด์ ๋์ด ์ ๊ฑฐ๋๊ธฐ ์ง์ ์ ํธ์ถ๋ฉ๋๋ค. ์ด ๋ฉ์๋ ๋ด์์ ํ์ด๋จธ ์ ๊ฑฐ, ๋คํธ์ํฌ ์์ฒญ ์ทจ์, componentDidMount()
๋ด์์ ์์ฑ๋ ๊ตฌ๋
ํด์ ๋ฑ ํ์ํ ๋ชจ๋ ์ ๋ฆฌ ์์
์ ์ํํ์ธ์.
์ด์ ์ปดํฌ๋ํธ๋ ๋ค์ ๋ ๋๋ง๋์ง ์์ผ๋ฏ๋ก, componentWillUnmount()
๋ด์์ setState()
๋ฅผ ํธ์ถํ๋ฉด ์ ๋ฉ๋๋ค. ์ปดํฌ๋ํธ ์ธ์คํด์ค๊ฐ ๋ง์ดํธ ํด์ ๋๊ณ ๋๋ฉด, ์ ๋๋ก ๋ค์ ๋ง์ดํธ๋์ง ์์ต๋๋ค.
์ ์ฌ์ฉํ์ง ์๋ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋
์ด ์น์ ์์ ๋ค๋ฃจ๋ ๋ฉ์๋๋ค์ ์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ฃผ ๊ฐ๋ ์์ง๋ง, ๋๋ถ๋ถ์ ์ปดํฌ๋ํธ์์๋ ํ์ํ์ง ์์ต๋๋ค. ๋๋ถ๋ถ์ ๋ฉ์๋๋ค์ ์ด ์๋ช ์ฃผ๊ธฐ ๋ํ์ ์ต์๋จ์ ์์นํ๋ โ๋ ์ผ๋ฐ์ ์ธ ๋ผ์ดํ ์ฌ์ดํด ํ์โ ์ฒดํฌ๋ฐ์ค๋ฅผ ํด๋ฆญํ๋ฉด ํ์ธํ ์ ์์ต๋๋ค.
shouldComponentUpdate()
shouldComponentUpdate(nextProps, nextState)
shouldComponentUpdate()
๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ฌ state ๋๋ props์ ๋ณํ๊ฐ ์ปดํฌ๋ํธ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ์ ์ํฅ์ ๋ฏธ์น๋์ง ์ฌ๋ถ๋ฅผ React๊ฐ ์ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ ๋์์ ๋งค state ๋ณํ๋ง๋ค ๋ค์ ๋ ๋๋ง์ ์ํํ๋ ๊ฒ์ด๋ฉฐ, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋์์ ๋ฐ๋ผ์ผ ํฉ๋๋ค.
shouldComponentUpdate()
๋ props ๋๋ state๊ฐ ์๋ก์ด ๊ฐ์ผ๋ก ๊ฐฑ์ ๋์ด์ ๋ ๋๋ง์ด ๋ฐ์ํ๊ธฐ ์ง์ ์ ํธ์ถ๋ฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ true
์
๋๋ค. ์ด ๋ฉ์๋๋ ์ด๊ธฐ ๋ ๋๋ง ๋๋ forceUpdate()
๊ฐ ์ฌ์ฉ๋ ๋์๋ ํธ์ถ๋์ง ์์ต๋๋ค.
์ด ๋ฉ์๋๋ ์ค์ง ์ฑ๋ฅ ์ต์ ํ๋ง์ ์ํ ๊ฒ์
๋๋ค. ๋ ๋๋ง์ ๋ฐฉ์งํ๋ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฒ๊ทธ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. shouldComponentUpdate()
์ ๋ด์ฉ์ ์ง์ ์์ฑํ๋ ๋์ ์ PureComponent
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. PureComponent
๋ props์ state์ ๋ํ์ฌ ์์ ๋น๊ต๋ฅผ ์ํํ๊ณ , ํด์ผ ํ ๊ฐฑ์ ์์
์ ๊ฑด๋๋ธ ํ๋ฅ ์ ๋ฎ์ถฅ๋๋ค.
์ด ๋ฉ์๋๋ฅผ ์ง์ ์์ฑํ ์์ ์ด ์๋ค๋ฉด, this.props
์ nextProps
, ๊ทธ๋ฆฌ๊ณ this.state
์ nextState
๋ฅผ ๋น๊ตํ ๋ค false
๋ฅผ ๋ฐํํ๋ ๊ฒ์ผ๋ก React๊ฐ ๊ฐฑ์ ์์
์ ๊ฑด๋๋ฐ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ false
๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ์์ ์ปดํฌ๋ํธ๋ค์ด ๊ฐ์๊ฐ ๊ฐ์ง state์ ๋ณํ์ ๋ฐ๋ผ ๋ค์ ๋ ๋๋ง์ ์ํํ๋ ๊ฒ์ ๋ง๋ ๊ฒ์ ์๋๋ผ๋ ์ ์ ์ฃผ์ํ์๊ธธ ๋ฐ๋๋๋ค.
shouldComponentUpdate()
๋ด์์ ๊น์ ๋์ผ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํ๊ฑฐ๋ JSON.stringify()
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถํ์ง ์์ต๋๋ค. ์์ฃผ ๋นํจ์จ์ ์ด๋ฉฐ ์ฑ๋ฅ์ ๋จ์ดํธ๋ฆด ์ ์์ต๋๋ค.
ํ์ฌ, shouldComponentUpdate()
๊ฐ false
๋ฅผ ๋ฐํํ ๊ฒฝ์ฐ UNSAFE_componentWillUpdate()
, render()
, ๊ทธ๋ฆฌ๊ณ componentDidUpdate()
๋ ํธ์ถ๋์ง ์์ต๋๋ค. ๋์ค์๋ shouldComponentUpdate()
๋ฅผ ์๊ฒฉํ ์ง์์๊ฐ ์๋ ํํธ๋ก์ ๋ค๋ฃจ๊ฒ ๋ ๊ฒ์ด๊ณ , false
์ ๋ฐํ์ ๋ฐํํ๋๋ผ๋ ์ปดํฌ๋ํธ๊ฐ ๊ณ์ํด์ ๋ค์ ๋ ๋๋ง์ ์ํํ ๊ฒ์
๋๋ค.
static getDerivedStateFromProps()
static getDerivedStateFromProps(props, state)
getDerivedStateFromProps
๋ ์ต์ด ๋ง์ดํธ ์์ ๊ฐฑ์ ์ ๋ชจ๋์์ render
๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ง์ ์ ํธ์ถ๋ฉ๋๋ค. state๋ฅผ ๊ฐฑ์ ํ๊ธฐ ์ํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ฑฐ๋, null
์ ๋ฐํํ์ฌ ์๋ฌด ๊ฒ๋ ๊ฐฑ์ ํ์ง ์์ ์ ์์ต๋๋ค.
์ด ๋ฉ์๋๋ ์๊ฐ์ด ํ๋ฆ์ ๋ฐ๋ผ ๋ณํ๋ props์ state๊ฐ ์์กดํ๋ ์์ฃผ ๋๋ฌธ ์ฌ์ฉ๋ก๋ฅผ ์ํ์ฌ ์กด์ฌํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฌด์์ ์์ง์ด๋๋ก ๋ง๋ค์ง ๊ฒฐ์ ํ๊ธฐ ์ํ์ฌ ์ด์ ๊ณผ ํ์ฌ์ ์์ ์๋ฆฌ๋จผํธ๋ฅผ ๋น๊ตํ๋ <Transition>
์ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ ๋์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
state๋ฅผ ๋์ด์ค๋ฉด ์ฝ๋๊ฐ ์ฅํฉํด์ง๊ณ , ์ด๋ก ์ธํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์์ง๋๋ค. ๋ณด๋ค ๊ฐ๋จํ ๋ค๋ฅธ ๋์๋ค์ ์ต์ํด์ง๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
- props ๋ณํ์ ๋์ํ ๋ถ์ ํจ๊ณผ๋ฅผ ๋ฐ์์์ผ์ผ ํ๋ค๋ฉด (์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋๋ ์ ๋๋ฉ์ด์
),
componentDidUpdate
์๋ช ์ฃผ๊ธฐ๋ฅผ ๋์ ํด์ ์ฌ์ฉํ์ธ์. - props๊ฐ ๋ณํํ์ ๋์๋ง ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ณ์ฐ ํ๊ณ ์ถ๋ค๋ฉด, Memoization Helper๋ฅผ ๋์ ํด์ ์ฌ์ฉํ์ธ์.
- props๊ฐ ๋ณํํ ๋์ ์ผ๋ถ state๋ฅผ ์ฌ์ค์ ํ๊ณ ์ถ๋ค๋ฉด, ์์ ์ ์ด ์ปดํฌ๋ํธ ๋๋
key
๋ฅผ ์ฌ์ฉํ๋ ์์ ๋น์ ์ด ์ปดํฌ๋ํธ๋ก ๋ง๋ค์ด์ ์ฌ์ฉํ์ธ์.
์ด ๋ฉ์๋๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ธ์คํด์ค ์ ๊ทผ์ด ํ์ํ๋ค๋ฉด, class ์ ์ ์ธ๋ถ์์ ์ปดํฌ๋ํธ์ props์ state์ ๋ํ ์์ ํจ์๋ฅผ ์ถ์ถํ์ฌ getDerivedStateFromProps()
์ ๋ค๋ฅธ ํด๋์ค ๋ฉ์๋ ๊ฐ์ ์ฝ๋๋ฅผ ๊ณต์ ๋ฐ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ๋ฉ์๋๋ ์ด์ ์ ์๊ด์์ด ๋ ๋๋ง ๋๋ง๋ค ๋งค๋ฒ ์คํ๋๋ฏ๋ก ์ฃผ์ํ์ธ์. ์ด๋ UNSAFE_componentWillReceiveProps
์๋ ๋ค๋ฅธ๋ฐ, ์ด ๋ฉ์๋์ ๊ฒฝ์ฐ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง์ ๋ฐ์์์ผฐ์ ๋์๋ง ์คํ๋๊ณ , ํด๋น ์ปดํฌ๋ํธ ๋ด์์ ์ง์ญ์ ์ธ setState
๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์๋ ์คํ๋์ง ์์ต๋๋ค.
getSnapshotBeforeUpdate()
getSnapshotBeforeUpdate(prevProps, prevState)
getSnapshotBeforeUpdate()
๋ ๊ฐ์ฅ ๋ง์ง๋ง์ผ๋ก ๋ ๋๋ง๋ ๊ฒฐ๊ณผ๊ฐ DOM ๋ฑ์ ๋ฐ์๋๊ธฐ ์ ์ ํธ์ถ๋ฉ๋๋ค. ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๊ฐ DOM์ผ๋ก๋ถํฐ ์คํฌ๋กค ์์น ๋ฑ๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ์ดํ ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ์ป์ ์ ์์ต๋๋ค. ์ด ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ componentDidUpdate()
์ ์ธ์๋ก ์ ๋ฌ๋ฉ๋๋ค.
์ด ๋ฉ์๋์ ๋ํ ์ฌ์ฉ๋ก๋ ํํ์ง ์์ง๋ง, ์ฑํ ํ๋ฉด์ฒ๋ผ ์คํฌ๋กค ์์น๋ฅผ ๋ฐ๋ก ์ฒ๋ฆฌํ๋ ์์ ์ด ํ์ํ UI ๋ฑ์ ์๊ฐํด๋ณผ ์ ์์ต๋๋ค.
์ค๋
์ท ๊ฐ์ ๋ฐํํ๊ฑฐ๋ null
์ ๋ฐํํฉ๋๋ค.
์ฌ์ฉํ๋ ์์๋ ์๋์ ๊ฐ์ต๋๋ค.
class ScrollingList extends React.Component {
constructor(props) {
super(props);
this.listRef = React.createRef();
}
getSnapshotBeforeUpdate(prevProps, prevState) {
// Are we adding new items to the list?
// Capture the scroll position so we can adjust scroll later.
if (prevProps.list.length < this.props.list.length) {
const list = this.listRef.current;
return list.scrollHeight - list.scrollTop;
}
return null;
}
componentDidUpdate(prevProps, prevState, snapshot) {
// If we have a snapshot value, we've just added new items.
// Adjust scroll so these new items don't push the old ones out of view.
// (snapshot here is the value returned from getSnapshotBeforeUpdate)
if (snapshot !== null) {
const list = this.listRef.current;
list.scrollTop = list.scrollHeight - snapshot;
}
}
render() {
return (
<div ref={this.listRef}>{/* ...contents... */}</div>
);
}
}
์์ ์์์์๋ getSnapshotBeforeUpdate
์ scrollHeight
ํ๋กํผํฐ ๊ฐ์ ์๋ ๊ฒ์ด ์ค์ํ๋ฐ, render
์ ๊ฐ์ โ๋ ๋๋งโ ๋จ๊ณ์ ์๋ช
์ฃผ๊ธฐ์ getSnapshotBeforeUpdate
์ componentDidUpdate
์ ๊ฐ์ โ์ปค๋ฐโ ๋จ๊ณ์ ์๋ช
์ฃผ๊ธฐ ๊ฐ์ ์ง์ฐ ์๊ฐ์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
Error Boundary
Error boundary๋ ์์ ์ปดํฌ๋ํธ ํธ๋ฆฌ ๋ด์ ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ฅ๋ฅผ ๊ฐ์งํ๊ณ , ํด๋น ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ๋ฉฐ, ์ถฉ๋์ด ๋ฐ์ํ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ๋์ ํ์ฌ ๋์ฒด UI๋ฅผ ํ์ํ๋ React ์ปดํฌ๋ํธ์ ๋๋ค. Error boundary์ ํ์ ํธ๋ฆฌ์ ์กด์ฌํ๋ ๋ ๋๋ง ๊ณผ์ , ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋, ๋ชจ๋ ์์ฑ์์ ๋ํ์ฌ ์ค๋ฅ๋ฅผ ๊ฐ์งํด๋ ๋๋ค.
ํด๋์ค ์ปดํฌ๋ํธ์ static getDerivedStateFromError()
๋๋ componentDidCatch()
๋ฅผ ์ ์ํ ๊ฒฝ์ฐ ํด๋น ์ปดํฌ๋ํธ๋ Error boundary๊ฐ ๋ฉ๋๋ค. ๋ ์๋ช
์ฃผ๊ธฐ ๋ด์์ state๋ฅผ ๊ฐฑ์ ํ๊ฒ ๋๋ฉด ํ์ ํธ๋ฆฌ ๋ด์ ์ฒ๋ฆฌ๋์ง ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ณ , ๋์ฒด UI๋ฅผ ํ์ํฉ๋๋ค.
๋ฐ๋์ Error boundary๋ ์์ธกํ์ง ์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ์ฌ ๋ณต๊ตฌํ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ๊ธฐ ๋ฐ๋๋๋ค. ์ ์ด ํ๋ฆ์ ์กฐ์ํ๋ ๋ฐ์๋ ์ฌ์ฉํ์ง ๋ง์ธ์.
์์ธํ ์ ๋ณด๋ React 16์์ ์ค๋ฅ ์ฒ๋ฆฌํ๊ธฐ ๋ฌธ์์์ ํ์ธํ ์ ์์ต๋๋ค.
์ฃผ์
Error boundary๋ ํธ๋ฆฌ ๋ด์์ ์์ ๋ณด๋ค ํ์์ ์กด์ฌํ๋ ์ปดํฌ๋ํธ์ ๋ํ ์ค๋ฅ๋ง์ ๊ฐ์งํด๋ ๋๋ค. ์ฆ, Error boundary๋ ์๊ธฐ ์์ ์ ๋ํ ์ค๋ฅ๋ฅผ ๊ฐ์งํ ์ ์์ต๋๋ค.
static getDerivedStateFromError()
static getDerivedStateFromError(error)
์ด ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ ํ์์ ์์ ์ปดํฌ๋ํธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ํธ์ถ๋ฉ๋๋ค. ์ด ๋ฉ์๋๋ ๋งค๊ฐ๋ณ์๋ก ์ค๋ฅ๋ฅผ ์ ๋ฌ๋ฐ๊ณ , ๊ฐฑ์ ๋ state ๊ฐ์ ๋ฐ๋์ ๋ฐํํด์ผ ํฉ๋๋ค.
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) { // state๋ฅผ ๊ฐฑ์ ํ์ฌ ๋ค์ ๋ ๋๋ง์์ ๋์ฒด UI๋ฅผ ํ์ํฉ๋๋ค. return { hasError: true }; }
render() {
if (this.state.hasError) { // ๋ณ๋๋ก ์์ฑํ ๋์ฒด UI๋ฅผ ๋ ๋๋งํ ์๋ ์์ต๋๋ค. return <h1>Something went wrong.</h1>; }
return this.props.children;
}
}
์ฃผ์
getDerivedStateFromError()
๋ โrenderโ ๋จ๊ณ์์ ํธ์ถ๋๋ฏ๋ก, ๋ถ์ ํจ๊ณผ๋ฅผ ๋ฐ์์ํค๋ฉด ์ ๋ฉ๋๋ค. ํด๋น ๊ฒฝ์ฐ์๋componentDidCatch()
๋ฅผ ๋์ ์ฌ์ฉํ์ธ์.
componentDidCatch()
componentDidCatch(error, info)
์ด ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ ์์ ์ปดํฌ๋ํธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋์ ํธ์ถ๋๋ฉฐ, 2๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌ๋ฐ์ต๋๋ค.
error
- ๋ฐ์ํ ์ค๋ฅinfo
- ์ด๋ค ์ปดํฌ๋ํธ๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์์ผฐ๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํcomponentStack
ํค๋ฅผ ๊ฐ๊ณ ์๋ ๊ฐ์ฒด
componentDidCatch()
๋ โ์ปค๋ฐโ ๋จ๊ณ์์ ํธ์ถ๋๋ฏ๋ก, ๋ถ์ ํจ๊ณผ๋ฅผ ๋ฐ์์์ผ๋ ๋ฉ๋๋ค. ์๋์ ๊ฐ์ด ์ค๋ฅ ๋ก๊ทธ ๊ธฐ๋ก ๋ฑ์ ์ํ์ฌ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// state๋ฅผ ๊ฐฑ์ ํ์ฌ ๋ค์ ๋ ๋๋ง์์ ๋์ฒด UI๋ฅผ ํ์ํฉ๋๋ค.
return { hasError: true };
}
componentDidCatch(error, info) { // Example "componentStack": // in ComponentThatThrows (created by App) // in ErrorBoundary (created by App) // in div (created by App) // in App logComponentStackToMyService(info.componentStack); }
render() {
if (this.state.hasError) {
// ๋ณ๋๋ก ์์ฑํ ๋์ฒด UI๋ฅผ ๋ ๋๋งํ ์๋ ์์ต๋๋ค.
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
React์ componentDidCatch()
๊ฐ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ํ๋ก๋์
๊ณผ ๊ฐ๋ฐ ๋น๋๊ฐ ์ฝ๊ฐ ๋ค๋ฆ
๋๋ค.
๊ฐ๋ฐ ๋น๋์์, ์ค๋ฅ๋ window
๊น์ง ์ ํ๋ฉ๋๋ค. ์ด๋ window.onerror
๋ window.addEventListener('error', callback)
๊ฐ componentDidCatch()
์์ ์ก์ ์ค๋ฅ๋ฅผ ์ธํฐ์
ํธํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ฌ๋ ํ๋ก๋์
๋น๋์์ ์ค๋ฅ๋ ์ ํ๋์ง ์์ต๋๋ค. ์ฆ ์์ ์ค๋ฅ ํธ๋ค๋ฌ๋ componentDidCatch()
์ ์ํด ๋ช
์์ ์ผ๋ก ์กํ์ง ์์ ์ค๋ฅ๋ง ๋ฐ์ต๋๋ค.
์ฃผ์
์ค๋ฅ ์ด๋ฒคํธ ๋ด์์๋
setState()
์ ํธ์ถ์ ํตํ์ฌcomponentDidCatch()
๋ก ๊ตฌํ๋ ๋์ฒด UI๋ฅผ ๋ ๋๋งํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ฐ ๋ฐฉ์์ ์ดํ์ ๋ฆด๋ฆฌ์ฆ์์๋ ์ฌ์ฉํ ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค. ๋์ฒด UI ๋ ๋๋ง ์ ์ด๋ฅผ ํ๋ ค๋ฉดstatic getDerivedStateFromError()
๋ฅผ ๋์ ์ฌ์ฉํ์ธ์.
๋ ๊ฑฐ์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋
์๋์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ค์ โ๋ ๊ฑฐ์โ๋ก ๋ถ๋ฅ๋ฉ๋๋ค. ์ฆ ์ฌ์ ํ ์๋ํ์ง๋ง, ์๋ก ์์ฑํ๋ ์ฝ๋์์๋ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ๋ ๊ฑฐ์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ์ต์ ๋ฌธ๋ฒ์ผ๋ก ์ ํ(migration)ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ์ ๋ณด๋ ์ด ๋ธ๋ก๊ทธ ๋ฌธ์์์ ํ์ธํ ์ ์์ต๋๋ค.
UNSAFE_componentWillMount()
UNSAFE_componentWillMount()
์ฃผ์
์ด ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋์ ๊ธฐ์กด ์ด๋ฆ์
componentWillMount
์ ๋๋ค. ์ด ์ด๋ฆ์ ๋ฒ์ 17๊น์ง ๊ทธ๋๋ก ์ ์ง๋ ๊ฒ์ ๋๋ค.rename-unsafe-lifecycles
codemod๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ์ต์ ๋ฌธ๋ฒ์ผ๋ก ์๋ ๊ฐฑ์ ์ํฌ ์ ์์ต๋๋ค.
UNSAFE_componentWillMount()
๋ ๋ง์ดํธ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ ํธ์ถ๋ฉ๋๋ค. render()
๊ฐ ์คํ๋๊ธฐ ์ ์ ํธ์ถ๋๋ฏ๋ก, ์ด ๋ฉ์๋ ๋ด์์ setState()
๋ฅผ ๋๊ธฐ์ ์ผ๋ก ํธ์ถํ๋๋ผ๋ ์ถ๊ฐ์ ์ธ ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์์ต๋๋ค. state๋ฅผ ์ด๊ธฐํํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด, ๋ณดํต์ constructor()
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด ๋ฉ์๋ ๋ด์์ ๋ถ์ ํจ๊ณผ๋ฅผ ๋ฐ์์ํค๊ฑฐ๋ ๊ตฌ๋
์์
(subscription)์ ์ํํ๋ฉด ์ ๋ฉ๋๋ค. ํด๋น ๊ฒฝ์ฐ์๋ componentDidMount()
๋ฅผ ๋์ ์ฌ์ฉํ์ธ์.
์ด ๋ฉ์๋๋ ์๋ฒ ๋ ๋๋ง์์ ํธ์ถ๋๋ ์ ์ผํ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋์ ๋๋ค.
UNSAFE_componentWillReceiveProps()
UNSAFE_componentWillReceiveProps(nextProps)
์ฃผ์
์ด ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋์ ๊ธฐ์กด ์ด๋ฆ์
componentWillReceiveProps
์ ๋๋ค. ์ด ์ด๋ฆ์ ๋ฒ์ 17๊น์ง ๊ทธ๋๋ก ์ ์ง๋ ๊ฒ์ ๋๋ค.rename-unsafe-lifecycles
codemod๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ์ต์ ๋ฌธ๋ฒ์ผ๋ก ์๋ ๊ฐฑ์ ์ํฌ ์ ์์ต๋๋ค.
์ฃผ์
์ด ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฒ๊ทธ๋ฅผ ๋ง๋ค๊ฑฐ๋, ์ผ๊ด์ฑ์ ํด์น ์ ์์ต๋๋ค.
- props ๋ณํ์ ๋์ํ ๋ถ์ ํจ๊ณผ๋ฅผ ๋ฐ์์์ผ์ผ ํ๋ค๋ฉด (์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋๋ ์ ๋๋ฉ์ด์ ),
componentDidUpdate
์๋ช ์ฃผ๊ธฐ๋ฅผ ๋์ ํด์ ์ฌ์ฉํ์ธ์.- props๊ฐ ๋ณํํ ๋์ ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ณ์ฐํ๊ธฐ ์ํ์ฌ
componentWillReceiveProps
๋ฅผ ์ฌ์ฉํ์๋ค๋ฉด, Memoization Helper๋ฅผ ๋์ ํด์ ์ฌ์ฉํ์ธ์.- props๊ฐ ๋ณํํ ๋์ ์ผ๋ถ state๋ฅผ ์ฌ์ค์ ํ๊ธฐ ์ํ์ฌ
componentWillReceiveProps
๋ฅผ ์ฌ์ฉํ์๋ค๋ฉด, ์์ ์ ์ด ์ปดํฌ๋ํธ ๋๋key
๋ฅผ ์ฌ์ฉํ๋ ์์ ๋น์ ์ด ์ปดํฌ๋ํธ๋ก ๋ง๋ค์ด์ ์ฌ์ฉํ์ธ์.๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ๋ ๊ฐ์ ธ์จ state์ ๋ํ์ฌ ๋ค๋ฃฌ ๋ธ๋ก๊ทธ ๊ธ์์ ์ถ์ฒํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ฅด์ธ์.
UNSAFE_componentWillReceiveProps()
๋ ๋ง์ดํธ๋ ์ปดํฌ๋ํธ๊ฐ ์๋ก์ด props๋ฅผ ์ ๋ฌ๋ฐ๊ธฐ ์ ์ ํธ์ถ๋ฉ๋๋ค. props ๋ณํ์ ๋์ํ์ฌ state๋ฅผ ๊ฐฑ์ ํด์ผ ํ๋ค๋ฉด(์๋ฅผ ๋ค์ด, state๋ฅผ ์ฌ์ค์ ํ๊ธฐ), this.props
์ nextProps
๋ฅผ ๋น๊ตํ๊ณ ์ด ๋ฉ์๋ ๋ด์์ this.setState()
๋ฅผ ์ฌ์ฉํ์ฌ state๋ฅผ ๋ฐ๊พธ๋ฉด ๋ฉ๋๋ค.
๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ํด๋น ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋งํ๊ฒ ๋ง๋ ๊ฒฝ์ฐ, props๊ฐ ๋ณํํ์ง ์์๋๋ผ๋ ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค๋ ์ ์ ์ฃผ์ํ์ธ์. ๋ณํ๊ฐ ๋ฐ์ํ์ ๋๋ง ๋ฉ์๋๋ฅผ ์คํ์ํค๋ ค๋ฉด ๋ฐ๋์ props์ ํ์ฌ๊ฐ๊ณผ ๋ค์๊ฐ์ ๋น๊ตํด์ผ ํฉ๋๋ค.
React๋ ๋ง์ดํ
ํ ๋์์๋ UNSAFE_componentWillReceiveProps()
๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉฐ, ์ด๊ธฐ props๋ฅผ ๊ฐ์ง์ง ์์ต๋๋ค. ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ๊ฒฝ์ฐ๋ ์ปดํฌ๋ํธ์ props๊ฐ ๋ณํํ์ ๋์
๋๋ค. this.setState()
๋ฅผ ํธ์ถํ๋ฉด, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ UNSAFE_componentWillReceiveProps()
๋ฅผ ๋ฐ์์ํค์ง ์์ต๋๋ค.
UNSAFE_componentWillUpdate()
UNSAFE_componentWillUpdate(nextProps, nextState)
์ฃผ์
์ด ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋์ ๊ธฐ์กด ์ด๋ฆ์
componentWillUpdate
์ ๋๋ค. ์ด ์ด๋ฆ์ ๋ฒ์ 17๊น์ง ๊ทธ๋๋ก ์ ์ง๋ ๊ฒ์ ๋๋ค.rename-unsafe-lifecycles
codemod๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ์ต์ ๋ฌธ๋ฒ์ผ๋ก ์๋ ๊ฐฑ์ ์ํฌ ์ ์์ต๋๋ค.
UNSAFE_componentWillUpdate()
๋ ์๋ก์ด props ๋๋ state๊ฐ ์ ๋ฌ๋์ด์ ๋ ๋๋ง์ด ์ด๋ฃจ์ด์ง๊ธฐ ์ ์ ํธ์ถ๋ฉ๋๋ค. ์ด ๋ฉ์๋ ๋ด์์ ๊ฐฑ์ ์ด ์ด๋ฃจ์ด์ง๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ์ค๋นํ ์ ์์ต๋๋ค. ์ด ๋ฉ์๋๋ ์ด๊ธฐ ๋ ๋๋ง์์๋ ํธ์ถ๋์ง ์์ต๋๋ค.
์ด ๋ฉ์๋ ๋ด์์๋ this.setState()
๋ฅผ ํธ์ถํ ์ ์๋ค๋ ์ ์ ์ฃผ์ํ์ธ์. ๋ํ React ์ปดํฌ๋ํธ๊ฐ ๊ฐฑ์ ๋๋๋ก ๋ง๋๋ ๊ทธ ์ด๋ค ์์
(์๋ฅผ ๋ค์ด, Redux Action์ Dispatchํ๊ธฐ)๋ UNSAFE_componentWillUpdate()
๊ฐ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๊ธฐ ์ ์๋ ์ด๋ฃจ์ด์ง๋ฉด ์ ๋ฉ๋๋ค.
ํต์์ ์ผ๋ก ์ด ๋ฉ์๋๋ componentDidUpdate()
๋ก ๋์ฒดํ ์ ์์ต๋๋ค. ์ด ๋ฉ์๋ ๋ด์์ DOM์ ๋ํ ์ ๋ณด๋ฅผ ์ป๋๋ค๋ฉด(์๋ฅผ ๋ค์ด, ์คํฌ๋กค ์์น ์ ์ฅํ๊ธฐ), ํด๋น ์ฝ๋๋ฅผ getSnapshotBeforeUpdate()
๋ก ์ด์ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
Note
UNSAFE_componentWillUpdate()
๋shouldComponentUpdate()
์ดfalse
๋ฅผ ๋ฐํํ๋ค๋ฉด ํธ์ถ๋์ง ์์ต๋๋ค.
๊ธฐํ API
์์์ ์ค๋ช ํ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ค๊ณผ ๋ฌ๋ฆฌ ์๋์ ๋ฉ์๋๋ค์ ์ฌ์ฉ์๊ฐ ์ปดํฌ๋ํธ ๋ด์์ ์ง์ ํธ์ถํ ์ ์์ต๋๋ค.
๋จ 2๊ฐ์ ๋ฉ์๋, setState()
์ forceUpdate()
๋ง์ด ์กด์ฌํฉ๋๋ค.
setState()
setState(updater, [callback])
setState()
๋ ์ปดํฌ๋ํธ state์ ๋ณ๊ฒฝ ์ฌํญ์ ๋๊ธฐ์ด์ ์ง์ด๋ฃ๊ณ , React์๊ฒ ํด๋น ์ปดํฌ๋ํธ์ ๊ทธ ์์๋ค์ด ๊ฐฑ์ ๋ state๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ๋ ๋๋ง๋์ด์ผ ํ๋ค๊ณ ์๋ฆฝ๋๋ค. ์ด ๋ฉ์๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์๋ฒ ์๋ต ๋ฑ์ ๋ฐ๋ผ UI๋ฅผ ๊ฐฑ์ ํ ๋์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๋ฉ์๋์
๋๋ค.
setState()
๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐฑ์ ํ๋ ๋ฐ์ ์์ด ์ฆ๊ฐ์ ์ธ ๋ช
๋ น์ด ์๋๋ผ ์์ฒญ์ด๋ผ๊ณ ์๊ฐํ์๊ธฐ ๋ฐ๋๋๋ค. ์ธ์ง ์ฑ๋ฅ(Perceived Performance)์ ํฅ์์ ์ํ์ฌ React๋ ์ด ๋ฉ์๋์ ์คํ์ ์ง์ฐ์ํค๊ณ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ํ๋ฒ์ ๊ฐฑ์ ํ ์๋ ์์ต๋๋ค. React๋ state ๋ณํ๊ฐ ์ฆ์ ์ ์ฉ๋๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
setState()
๋ ์ปดํฌ๋ํธ๋ฅผ ํญ์ ์ฆ๊ฐ์ ์ผ๋ก ๊ฐฑ์ ํ์ง๋ ์์ต๋๋ค. ์คํ๋ ค ์ฌ๋ฌ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ํจ๊ป ์ผ๊ด์ ์ผ๋ก ๊ฐฑ์ ํ๊ฑฐ๋, ๋์ค์ผ๋ก ๋ฏธ๋ฃฐ ์๋ ์์ต๋๋ค. ์ด๋ก ์ธํ์ฌ setState()
๋ฅผ ํธ์ถํ์๋ง์ this.state
์ ์ ๊ทผํ๋ ๊ฒ์ด ์ ์ฌ์ ์ธ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ๊ทธ ๋์ ์ componentDidUpdate
๋๋ setState
์ ์ฝ๋ฐฑ(setState(updater, callback)
)์ ์ฌ์ฉํ์ธ์. ๋ ๋ค ๊ฐฑ์ ์ด ์ ์ฉ๋ ๋ค์ ์คํ๋๋ ๊ฒ์ด ๋ณด์ฅ๋ฉ๋๋ค. ์ด์ state ๊ฐ์ ๊ธฐ์ค์ผ๋ก state ๊ฐ์ ์ค์ ํด์ผ ํ๋ค๋ฉด, ์๋์ ์ค๋ช
๋ updater
์ธ์์ ๋ํ ๋ด์ฉ์ ์ฝ์ด๋ณด์ธ์.
shouldComponentUpdate()
๊ฐ false
๋ฅผ ๋ฐํํ์ง ์๋๋ค๋ฉด setState()
๋ ํญ์ ๋ ๋๋ง์ด ๋ค์ ๋ฐ์ํ๋๋ก ๋ง๋ญ๋๋ค. ๊ฐ๋ณ ๊ฐ์ฒด์ ์ฌ์ฉ์ผ๋ก ์ธํ์ฌ shouldComponentUpdate()
๋ด์์ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ๊ตฌํํ ์ ์๋ค๋ฉด, ์๋ก์ด state๊ฐ ์ด์ ์ state์ ๋ค๋ฅผ ๋์๋ง setState()
๋ฅผ ํธ์ถํ์ธ์. ๊ทธ๋์ผ ๋ถํ์ํ๊ฒ ๋ค์ ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
์ฒซ๋ฒ์งธ ์ธ์ updater
๋ ๋ค์๊ณผ ๊ฐ์ ํํ๋ฅผ ๊ฐ์ง๋ ํจ์์
๋๋ค.
(state, props) => stateChange
state
๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋๋ ์์ ์ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ง๋ state์ ๋ํ ์ฐธ์กฐ์
๋๋ค. state
๋ ์ง์ ๋ณ๊ฒฝํ๋ฉด ์ ๋ฉ๋๋ค. ๋์ , ์ ๋ฌ๋ state
์ props
๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ณ๊ฒฝ ์ฌํญ์ ํํํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, props.step
๋งํผ state์ ์ด๋ค ๊ฐ์ ์ฆ๊ฐ์ํค๊ณ ์ถ์ ์ํฉ์ ๊ฐ์ ํด๋ด
์๋ค.
this.setState((state, props) => {
return {counter: state.counter + props.step};
});
updater
ํจ์๋ก ์ ๋ฌ๋ state
์ props
๋ ์ต์ ๊ฐ์์ด ๋ณด์ฅ๋ฉ๋๋ค. updater
์ ๊ฒฐ๊ณผ๋ state
์ ์๊ฒ ๋ณํฉ๋ฉ๋๋ค.
setState()
๋ก ์ ๋ฌ๋๋ ๋๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ setState
์ ์คํ์ด ์๋ฃ๋๊ณ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋ ๋ค์ ์คํ๋ ํจ์์ ๋ํ ์ฝ๋ฐฑ์ผ๋ก, ์๋ตํ ์ ์์ต๋๋ค. ๋ณดํต ์ด๋ฌํ ๋ฐฉ์์ ์คํ์๋ componentDidUpdate()
์ ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.
setState()
์ ์ ๋ฌํ๋ ์ฒซ๋ฒ์งธ ์ธ์๋ก ์๋์ ๊ฐ์ด ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
setState(stateChange[, callback])
์ด๋ ๊ฒ ํ๋ฉด stateChange
๊ฐ์ฒด๋ ์๋ก์ด state์ ์๊ฒ ๋ณํฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ผํ ์นดํธ์ ์ํ ์๋(quantity
)์ ์กฐ์ ํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑํ๋ฉด ๋ฉ๋๋ค.
this.setState({quantity: 2})
์ด๋ฌํ ํํ์ setState()
๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋น๋๊ธฐ์ ์ผ๋ก ์ํ๋๋ฉฐ, ๊ฐ์ ์ฃผ๊ธฐ ๋์ ์ฌ๋ฌ๋ฒ ํธ์ถ๋๋ค๋ฉด ์ผ๊ด์ ์ผ๋ก ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ์ ์ฃผ๊ธฐ ๋์ ์ํ ์๋์ ํ๋ฒ ์ด์ ์ฆ๊ฐ์ํค๊ฒ ๋๋ฉด, ์๋์ ์ฝ๋์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค๊ฒ ๋ฉ๋๋ค.
Object.assign(
previousState,
{quantity: state.quantity + 1},
{quantity: state.quantity + 1},
...
)
setState
์ ์ฐ์ด์ ํธ์ถ์ ๊ฐ์ ์ฃผ๊ธฐ ๋ด์ ๋ฐ๋ก ์ง์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ๋ฎ์ด์ฐ๊ณ , ๋ฐ๋ผ์ ์๋๊ฐ์ด ํ๋ฒ๋ง ์ฆ๊ฐ๋ ๊ฒ์
๋๋ค. ๋ค์ state์ ๊ฐ์ด ์ด์ state์ ๊ฐ์ ๊ธฐ๋ฐํ๋ค๋ฉด, ์๋์ ๊ฐ์ด updater
์ ํจ์ ํํ๋ฅผ ๋์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
this.setState((state) => {
return {quantity: state.quantity + 1};
});
์์ธํ ์ ๋ณด๋ ์๋์ ๋ฌธ์๋ค์์ ํ์ธํ ์ ์์ต๋๋ค.
- State์ ์๋ช ์ฃผ๊ธฐ ์๋ด
- ์์ธํ ์์๋ณด๊ธฐ:
setState()
ํธ์ถ์ ์ธ์ , ๊ทธ๋ฆฌ๊ณ ์ ์ผ๊ด ์ฒ๋ฆฌ๋๋๊ฐ? - ์์ธํ ์์๋ณด๊ธฐ:
this.state
๋ ์ ์ฆ์ ๊ฐฑ์ ๋์ง ์๋๊ฐ?
forceUpdate()
component.forceUpdate(callback)
์ปดํฌ๋ํธ์ state ๋๋ props๊ฐ ๋ณ๊ฒฝ๋๋ฉด, ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋๋ ๊ฒ์ด ๊ธฐ๋ณธ ๋์์
๋๋ค. ์ด๋ค ์ปดํฌ๋ํธ์ render()
๋ฉ์๋๊ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ๊ฐ์ ์์กดํ๋ ๊ฒฝ์ฐ, React๋ก ํ์ฌ๊ธ forceUpdate()
๋ฅผ ํธ์ถํ์ฌ ๋ ๋๋ง์ ๋ค์ ์ํํ๋๋ก ๋ง๋ค ์ ์์ต๋๋ค.
forceUpdate()
๋ฅผ ํธ์ถํ๋ฉด ์ปดํฌ๋ํธ์ render()
๊ฐ ํธ์ถ๋๋๋ฐ, ์ด๋ shouldComponentUpdate()
๋ ๋ฌด์ํ๊ณ ๊ฑด๋๋๋๋ค. ๊ทธ๋ฌ๋ฉด ์์ ์ปดํฌ๋ํธ๋ค์ ๋ํ์ฌ ํต์์ ์ธ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๊ฐ ์คํ๋๋๋ฐ, ์ฌ๊ธฐ์๋ ๊ฐ๋ณ ์์๋ค์ shouldComponentUpdate()
๋ ํฌํจ๋ฉ๋๋ค. React๋ ๋งํฌ์
์ด ๋ณํํ์ ๋์๋ง DOM์ ๊ฐฑ์ ํ ๊ฒ์
๋๋ค.
๋ณดํต render()
๋ด์์๋ forceUpdate()
๋ฅผ ์ฌ์ฉํ์ง ๋ง์์ผ ํ๋ฉฐ, ์ค์ง this.props
์ this.state
์ ๊ฐ๋ง์ ์ฌ์ฉํ์ฌ์ผ ํฉ๋๋ค.
class ํ๋กํผํฐ
defaultProps
defaultProps
๋ ์ปดํฌ๋ํธ ํด๋์ค ์์ฒด ๋ด์์ ํ๋กํผํฐ๋ก์ ์ ์๋ ์ ์๊ณ , ์ด๋ฅผ ํตํ์ฌ ํด๋น class์ ๊ธฐ๋ณธ props ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค. ์๋ ์์์ ๊ฐ์ด, null
์ด ์๋ ์์ง ์ ์๋์ง ์์ undefined
์ธ props๋ฅผ ๋ค๋ฃฐ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
class CustomButton extends React.Component {
// ...
}
CustomButton.defaultProps = {
color: 'blue'
};
props.color
์ ๊ฐ์ด ์ ๊ณต๋์ง ์์๋ค๋ฉด, ๊ธฐ๋ณธ๊ฐ์ธ 'blue'
๋ก ์ค์ ๋ ๊ฒ์
๋๋ค.
render() {
return <CustomButton /> ; // props.color๋ blue๋ก ์ค์ ๋ฉ๋๋ค
}
props.color
์ null
๊ฐ์ด ์ ๊ณต๋๋ค๋ฉด, ํด๋น ๊ฐ์ null
๋ก ์ ์ง๋ฉ๋๋ค.
render() {
return <CustomButton color={null} /> ; // props.color๋ null์ผ๋ก ์ ์ง๋ฉ๋๋ค
}
displayName
displayName
๋ฌธ์์ด์ ๋๋ฒ๊น
๋ฉ์์ง ํ์์ ์ฌ์ฉ๋ฉ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด ๊ฐ์ ์ค์ ํ์ง ์์๋ ๋๋๋ฐ, ์๋ํ๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ๋ ํจ์ ๋๋ class์ ์ด๋ฆ์ผ๋ก๋ถํฐ ์ถ๋ก ๋๊ธฐ ๋๋ฌธ์
๋๋ค. ๋๋ฒ๊น
์ ์ํ์ฌ ๋ค๋ฅธ ์ด๋ฆ์ ํ์ํ๊ฑฐ๋ ๊ณ ์ฐจ ์ปดํฌ๋ํธ ์์ฑ์ ์ํ์ฌ ๋ช
์์ ์ผ๋ก ์ด ๊ฐ์ ์ค์ ํ๊ณ ์ถ๋ค๋ฉด, ์ฌ์ด ๋๋ฒ๊น
์ ์ํ Display Name ๋ํํ๊ธฐ๋ฅผ ํตํ์ฌ ์์ธํ ์ ๋ณด๋ฅผ ํ์ธํ์ธ์.
์ธ์คํด์ค ํ๋กํผํฐ
props
this.props
๋ ํด๋น ์ปดํฌ๋ํธ๊ฐ ํธ์ถ๋ ๊ณณ์์ ์ ์ํ props๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค. props์ ๋ํ์ฌ ๋ ์๊ณ ์ถ๋ค๋ฉด ์ปดํฌ๋ํธ์ props ๋ฌธ์๋ฅผ ํ์ธํ์ธ์.
ํนํ this.props.children
์ ํน๋ณํ prop์ผ๋ก, ์ผ๋ฐ์ ์ธ ํ๊ทธ๊ฐ ์๋ JSX ํํ์ผ๋ก ์์ฑ๋ ์์ ํ๊ทธ๋ก ์ ์๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
state
state๋ ์ด๋ค ์ปดํฌ๋ํธ์๋ง ํ์ ํ์ฌ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ฉฐ, ํด๋น ๋ฐ์ดํฐ๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. state๋ ์ฌ์ฉ์๊ฐ ์์ ๋กญ๊ฒ ์ ์ํ ์ ์์ผ๋ฉฐ, ์ผ๋ฐ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ด์ด์ผ ํฉ๋๋ค.
The state contains data specific to this component that may change over time. The state is user-defined, and it should be a plain JavaScript object.
์ด๋ค ๊ฐ์ด ๋ ๋๋ง ๋๋ ๋ฐ์ดํฐ ํ๋ฆ ์์์ (์๋ฅผ ๋ค์ด, ํ์ด๋จธ์ ID) ์ฌ์ฉ๋์ง ์๋๋ค๋ฉด, ํด๋น ๊ฐ์ state์ ๋ฃ์ง ์์๋ ๋ฉ๋๋ค. ๊ทธ๋ฌํ ๊ฐ์ ์ปดํฌ๋ํธ ์ธ์คํด์ค์ ํ๋๋ก ์ ์ํ ์ ์์ต๋๋ค.
์์ธํ ์ ๋ณด๋ State์ ์๋ช ์ฃผ๊ธฐ ๋ฌธ์์์ ํ์ธํ ์ ์์ต๋๋ค.
this.state
๋ฅผ ์ง์ ๋ณ๊ฒฝํ๋ฉด ์ ๋ฉ๋๋ค. ์๋ํ๋ฉด ์ดํ ํธ์ถ๋๋ setState()
๊ฐ ์ด์ ์ ์ ์ฉ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฎ์ด์ฐ๊ธฐ ๋๋ฌธ์
๋๋ค. this.state
๋ฅผ ๋ถ๋ณ์ (Immutable)์ธ ๋ฐ์ดํฐ๋ก ์ทจ๊ธํ์ธ์.