January 08, 2021
๋ฌด์ธ๊ฐ ์ซ์๋ฅผ ํ๋ ์ฌ๋ฆฌ๊ณ ๋ํ๋ ๊ธฐ๋ฅ์ ์ฅ๋ฐ๊ตฌ๋ ๋ผ๋ ์ง ๋ง์ด ์ธ๋ฒํ ๊ธฐ๋ฅ์ด๋ค.
๊ทธ๋์ ์ค์ตํด ๋ณด์๋ค.
import React, { Component } from 'react'
class Counter extends Component {
constructor(props) {
super(props)
this.state = {
count: 1,
}
}
render() {
const { count } = this.state
return (
<>
<h1>
{count === 0
? `๋ ์ด์ ${count} ์์ ๋บ ์ ์์ด์.`
: `ํ์ฌ ๊ฐ์๋ โฉ ${count}`}
</h1>
<button onClick={() => this.setState({ count: count + 1 })}>Add</button>
<button
onClick={() => {
if (this.state.count !== 0) {
this.setState(
prevState => ({ count: prevState.count - 1 }),
() => console.log('๋ฐฉ๊ธ setState ๊ฐ ํธ์ถ๋์ด ํ๋ ๋บ์ต๋๋ค.')
)
}
}}
>
Subtract
</button>
</>
)
}
}
export default Counter
ํด๋์คํ ์ปดํฌ๋ํธ์์ state ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ this.state ๋ก ์ ๊ทผํด์ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ render ๋ด์ ์ํ๋ฅผ ์ ๋ฌํ๊ฑฐ๋ jsx ๋ด์ ๋ณด์ฌ์ง๊ฒ ํ ํ ๋ฐ, ๋งค๋ฒ this.state.count, this.state.movies โฆ ์ฝ๋๊ฐ ๊ธธ์ด์ง๋ค.
๊ทธ๋์ ์ด ๋ํ ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ํตํด state ๋ณ์๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ ์ ์ธํด ๋์ผ๋ฉด ์ฝ๋๊ฐ ์งง์์ง๊ณ ๊ฐ์ ธ๋ค ์ฐ๊ธฐ ์ข๋ค.
const { count } = this.state
๋ํ setState ๋ฅผ ํธ์ถ ํ ๋, ๋ด๋ถ ์ธ์๋ก ๊ฐ์ฒด ์์ฒด๊ฐ ์ฌ ์๋ ์๊ณ ์๋ ํจ์๊ฐ ์ฌ ์๋ ์๋ค.
๊ฐ์ฒด๊ฐ ์ฌ ๋๋ ๋ง์ฝ state ๊ฐ ๋ฐฐ์ด๋ก ๋ฐ๋๋ค ๊ฐ์ ํ๋ฉด Spread Operator ๋ฅผ ํตํด ์ด์ ๋ฐฐ์ด์ ๊ฐ์ ์ถ๊ฐํด ๋๊ฐ ์๋ ์์ ๊ฒ์ด๋ค.
๋ด๋ถ ์ธ์๋ก ํจ์๊ฐ ์ฌ ๋๋ prevState ๋ฅผ ์ฒซ๋ฒ์งธ ์ธ์๋ก ๋ฐ๋ ์ฝ๋ฐฑํจ์๊ฐ ์์ฑ๋๋ค.
if (this.state.count !== 0) {
this.setState(
prevState => ({ count: prevState.count - 1 }),
() => console.log('๋ฐฉ๊ธ setState ๊ฐ ํธ์ถ๋์ด ํ๋ ๋บ์ต๋๋ค.')
)
}
์ต์ ์ผ๋ก๋ค๊ฐ ๋๋ฒ์งธ ์ธ์์ ์ฝ๋ฐฑํจ์๋ฅผ ๋ฃ์ด ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์คํํ ํจ์๋ฅผ ์์ฑํ ์๋ ์๋ค.
์์ง hooks ์ ๋ํด ์ ๋๋ก ์์ง๋ ๋ชปํ์ง๋ง ์ผ๋จ ์๊ณ ์๋ ์ ์์ ํ๋ฒ ์จ๋ดค๋ค.
import React, { useState } from 'react'
const CounterFunc = () => {
const [count, setCount] = useState(1)
return (
<>
<h1>
{count === 0
? `๋ ์ด์ ${count} ์์ ๋บ ์ ์์ด์.`
: `ํ์ฌ ๊ฐ์๋ โฉ ${count}`}
</h1>
<button onClick={() => setCount(count + 1)}>Add</button>
<button
onClick={() => {
if (count !== 0) {
setCount(count - 1)
}
}}
>
Subtract
</button>
</>
)
}
export default CounterFunc