-
๐ React ๊ณต๋ถํ๊ธฐ | Life cycle Method, setState๋ฆฌ์กํธ 2020. 8. 23. 14:24
๋ผ์ดํ ์ฌ์ดํด์ด๋?
์ธ๊ฐ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋๋๋ค๋ฉด ๋ฐฐ์์ ํ์๊ฐ ์๊ธธ ๋, ์ธ์์์ ํฐ ์ฌ๊ฑด์ ๋ง๋ฌ์ ๋, ์ฃฝ์ ๋๋ก ๋๋ ์ ์์ ๊ฒ ๊ฐ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฆฌ์กํธ์์๋ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋๋ ๋ณผ ์ ์๋ค.
๋ผ์ดํ ์ฌ์ดํด์ ์ด 3๋จ๊ณ๋ก ์ ์ํ ์ ์๋ค.
1. Mounting (์์ฑ)
mounting์ ๋ฆฌ์กํธ์์ ๋ฌด์ธ๊ฐ๊ฐ consturctor์์์ ์์ฑ๋ ๋์ด๋ค(ํ๋ฉด์ ๋ฌด์ธ๊ฐ๊ฐ ๋ ๋๋ง ๋์์ ๋). mounting ๋จ๊ณ์์๋ props๋ state๋ฅผ ๋ณ๊ฒฝํด์๋ ์๋๋ค.
2. Updating (์ ๋ฐ์ดํธ)
updating์ ์ด๋ค ๊ฒ์ด ์์ ๋ ๋๋ฅผ ๋งํ๋ค.
์๋ฅผ ๋ค์ด ์๋ก์ด props๋ฅผ ๋ฐ์ ๋, setState()๋ฅผ ์คํํ ๋๊ฐ ์ด ๋จ๊ณ์ ํด๋น๋๋ค.
3. Unmounting (์ญ์ )
unmounting์ ์ปดํฌ๋ํธ๊ฐ ์ญ์ ๋ ๋์ด๋ค.
๋ผ์ดํ ์ฌ์ดํด ๋ฉ์๋
๋ผ์ดํ ์ฌ์ดํด์ด ๋์๋ ๋๋ง๋ค ๊ฐ๊ฐ์ ์๋ง์ ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋๋ค์ด ์คํ๋๋ค.
1. componentDidmount
์ปดํฌ๋ํธ์์ ๋์จ output์ด DOM์ ๋ ๋๋ง ๋ ํ์ componentDidMount๊ฐ ์คํ๋๋ค.
2. componentDidUpDate
์์ ๋ ๊ฒ์ด ๋ ๋๋ง ๋ ํ์ componentDidUpdate๊ฐ ์คํ๋๋ค.
2. componentWillUnmount
์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง ํ(DOM์์ ์ญ์ ๋ ํ) ์คํ๋๋ค.
๋ผ์ดํ์ฌ์ดํด ์์
์๋ ์์ ๋ class ์ปดํฌ๋ํธ์์ ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ์ด๋ค.
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 />, document.getElementById('root') );
๊ฐ๊ฐ์ ๋ฉ์๋๋ค์ด ํธ์ถ๋์์ ๋ ๋ค์๊ณผ ๊ฐ์ ์ผ์ด ์ผ์ด๋๋ค.
1. [mounting]<Clock /> ์ปดํฌ๋ํธ๊ฐ ReactDOM.render() ํจ์์ ์ ๋ฌ์ด ๋์์ ๋, ๋ฆฌ์กํธ๋ Clock ์ปดํฌ๋ํธ์ constructor๋ฅผ ํธ์ถํ๋ค.
2. [mounting]๋ฆฌ์กํธ๋ Clock ์ปดํฌ๋ํธ์ render()ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๊ณ , ๋ฆฌํด๋ ๊ฐ์ด ํ๋ฉด์ ๋ณด์ฌ์ง๋ค. Clock์์ ๋ ๋๋ง ๋ ๊ฐ๊ณผ, DOM์ ๋น๊ตํด์ DOM์ ์ ๋ฐ์ดํธํ๋ค.
3. [mounting]Clock์์ ๋ ๋๋ง๋ ๊ฐ์ด DOM์ ๋ค์ด๊ฐ๊ฒ ๋์ ๋, ๋ฆฌ์กํธ๋ ComponentDidMount()๋ฅผ ํธ์ถํ๋ค. ComponentDidMount ํจ์๊ฐ ์คํ๋๋ฉด์ tick ํจ์๊ฐ 1์ด์ ํ ๋ฒ์ฉ ์คํ๋๋ค.
4. [updating]๋งค ์ด๋ง๋ค ๋ธ๋ผ์ฐ์ ๋ tick() ๋ฉ์๋๊ฐ ์คํ๋๊ฒ ๋๋ค. Clock ์ปดํฌ๋ํธ์ ui๋ setState()๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์ ๋ฐ์ดํธ ๋๋ค. setState() ๋ฉ์๋ ๋๋ถ์ ๋ฆฌ์กํธ๋ state๊ฐ ๋ณ๊ฒฝ๋์๋ค๋ ๊ฒ์ ์ ์ ์๊ณ , render() ๋ฉ์๋๋ฅผ ๋ค์ ํธ์ถํ๊ฒ ๋๋ค(ํ๋ฉด์ด ๊ณ์ ์ ๋ฐ์ดํธ ๋๋ค).
์ด ๋ render() ํจ์์ ์๋ this.state.date ๊ฐ์ด ๋ฌ๋ผ์ง๊ฒ ๋๊ณ , render์ output์ ์ด๋ฏธ ์ ๋ฐ์ดํธ๋ time์ ๋ ๋๋งํ๊ฒ ๋๋ค. (๊ทธ ํ์ DOM์ ๋ฐ์ดํธ)
5. [unmounting]๋ง์ฝ DOM์์ Clock ์ปดํฌ๋ํธ๋ฅผ ์ญ์ ํ๊ฒ ๋๋ฉด, ๋ฆฌ์กํธ๋ componentWillUnmount() ๋ฅผ ํธ์ถํ๊ฒ ๋๊ณ , ํ์ด๋จธ๋ ๋ฉ์ถ๊ฒ ๋๋ค.
3 things about SetState()
1. state๋ฅผ ์ง์ ์ ์ผ๋ก ๋ณ๊ฒฝํด์๋ ์๋๋ค.
this.state.comment = 'Hello';
๊ทธ ์ด์ ๋ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค(ํ๋ฉด update X).
๋์ setState ์ ์๋ก์ด ๊ฐ์ object์์ ๋ฃ์ด ๋๊ฒจ์ฃผ๋ฉด ๋๋ค.
this.setState({comment: 'Hello'});
2. state๋ ๋น๋๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋ ์ ์๋ค.
this.setState({someField : someValue})
state๋ฅผ ๋ณ๊ฒฝํ ๋๋ ๋ณดํต ์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค. ํ์ง๋ง ์๋์ ๊ฐ์ด ํ์ฌ state์ ๊ฐ์ ์ฌ์ฉํด์ state์ ๊ฐ์ ์ ๋ฐ์ดํธํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
this.setState({ counter : this.state.counter + this.props.increment, });
์์ ์ฝ๋์ ๊ฐ์ด ์ง์ ์ ์ผ๋ก this.state๋ฅผ ๊ฐ์ ธ์ ์ ๋ฐ์ดํธํ๋ ๊ฒฝ์ฐ ์ ๋ฐ์ดํธ์ ์คํจํ ์ ์๋ค. ๋น์ฅ์ ์ ์คํ๋ ์ง ๋ชจ๋ฅธ๋ค. ํ์ง๋ง ์ฌ์ฉ์๊ฐ ๋ง์์ง๊ณ ์ฝ๋๊ฐ ๋ ๋ณต์กํด์ง๋ฉด์ this.setState๋ฅผ ํธ์ถํ๋ ๊ณณ์ด ๋ง์์ง๋ฉด ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ํ๋ฉด์ ์ถ๋ ฅ๋์ง ์์ ์ ์๋ค.
๊ทธ ์ด์ ๋ฅผ ๋ฆฌ์กํธ ํํ์ด์ง์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํ๊ณ ์๋ค.
์ฌ๊ธฐ์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ค๋ ๊ฒ์ด๋ค. this.setState๊ฐ ํธ์ถ ๋ ๋ ์ฆ์ DOM์ด ์ ๋ฐ์ดํธ ๋์ง ์๋๋ค.
์์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํผํ๋ ค๋ฉด ์๋์ ๊ฐ์ด object ๋ณด๋ค ํจ์ ํ์์ ์ฌ์ฉํ๋ฉด ๋๋ค.
this.setState((stete, props) => {( counter : state.counter + props.increment )})
3. state์ ๋ณ๊ฒฝ์ ํฉ์ณ์ง๋ค.
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ด this.state์ ์ฌ๋ฌ ๊ฐ์ด ๋ค์ด์๋ ๊ฒฝ์ฐ๋ฅผ ๋ณด์.
constructor(props){ super(props); this.state = { posts: [], comments : [] }; }
๊ทธ๋ฆฌ๊ณ ๊ฐ๋ค์ ๊ฐ๊ฐ ๋ฐ๋ก ์ ๋ฐ์ดํธํ๋ค.
componentDidMount() { fetchPosts().then(response => { this.setState({ posts: response.posts }); }); fetchComments().then(response => { this.setState({ comments: response.comments }); }); }
this.setState({comments})๋ this.state.posts์ ๊ฐ์ ์ํฅ์ ๋ฏธ์น์ง ์๊ณ ์ ๋ฐ์ดํธ ๋๋ค.
[์ฐธ๊ณ ์๋ฃ]
https://medium.com/@wisecobbler/using-a-function-in-setstate-instead-of-an-object-1f5cfd6e55d1
https://en.reactjs.org/docs/state-and-lifecycle.html
'๋ฆฌ์กํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ