Using the State Hook
Hook์ React 16.8๋ฒ์ ์ ์๋ก ์ถ๊ฐ๋์์ต๋๋ค. Hook์ ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ์ง ์์๋ state์ ๊ฐ์ ํน์ง๋ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Hook ์๊ฐ์์ ์๋ ์์๋ฅผ ํตํด Hook๊ณผ ์นํด์ก์ต๋๋ค.
import React, { useState } from 'react';
function Example() {
// ์๋ก์ด state ๋ณ์๋ฅผ ์ ์ธํ๊ณ , count๋ผ ๋ถ๋ฅด๊ฒ ์ต๋๋ค. const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
์๋์ ํด๋์ค ์์์ ๋น๊ตํ๋ฉฐ Hook์ ํน์ง์ ๋ํด ๋ฐฐ์ธ ์์ ์ ๋๋ค.
Hook๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ ํด๋์ค ์์
React์์ ํด๋์ค๋ฅผ ์ฌ์ฉํด๋ดค๋ค๋ฉด, ์๋์ ์ฝ๋๋ ์ต์ํ ๊ฒ๋๋ค.
class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
render() {
return (
<div>
<p>You clicked {this.state.count} times</p>
<button onClick={() => this.setState({ count: this.state.count + 1 })}>
Click me
</button>
</div>
);
}
}
์ ์ฝ๋์์ state๋ { count: 0 }
์ด๋ฉฐ ์ฌ์ฉ์๊ฐ this.setState()
๋ฅผ ํธ์ถํ๋ ๋ฒํผ์ ํด๋ฆญํ์ ๋ state.count
๋ฅผ ์ฆ๊ฐ์ํต๋๋ค. ์์ ํด๋์ค ์์๋ฅผ ํด๋น ํ์ด์ง์์ ๊ณ์ ์ฌ์ฉํ ์์ ์
๋๋ค.
์ฃผ์
์ข ๋ ํ์ค์ ์ธ ์์๊ฐ ์๋, counter ์์๋ฅผ ์ฌ์ฉํ๋์ง ๊ถ๊ธํ ์ ์์ต๋๋ค. counter ์์๋ฅผ ์ฌ์ฉํ ์ด์ ๋, Hook์ ์ ์ดํดํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฐ์ฅ ๊ธฐ์ด์ ์ธ ๋ด์ฉ์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
Hook๊ณผ ํจ์ ์ปดํฌ๋ํธ
React์ ํจ์ ์ปดํฌ๋ํธ๋ ์ด๋ ๊ฒ ์๊ฒผ์ต๋๋ค.
const Example = (props) => {
// ์ฌ๊ธฐ์ Hook์ ์ฌ์ฉํ ์ ์์ต๋๋ค!
return <div />;
}
๋๋ ์ด๋ ๊ฒ ์๊ฒผ์ต๋๋ค.
function Example(props) {
// ์ฌ๊ธฐ์ Hook์ ์ฌ์ฉํ ์ ์์ต๋๋ค!
return <div />;
}
ํจ์ ์ปดํฌ๋ํธ๋ฅผ โstate๊ฐ ์๋ ์ปดํฌ๋ํธโ๋ก ์๊ณ ์์์ ๊ฒ๋๋ค. ํ์ง๋ง Hook์ React state๋ฅผ ํจ์ ์์์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค.
Hook์ ํด๋์ค ์์์ ๋์ํ์ง ์์ต๋๋ค. ํ์ง๋ง ํด๋์ค๋ฅผ ์์ฑํ์ง ์๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Hook์ด๋?
React์ useState
Hook์ ์ฌ์ฉํด๋ด
์๋ค!
import React, { useState } from 'react';
function Example() {
// ...
}
Hook์ด๋? Hook์ ํน๋ณํ ํจ์์
๋๋ค. ์๋ฅผ ๋ค์ด useState
๋ state๋ฅผ ํจ์ ์ปดํฌ๋ํธ ์์์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค. ๋ค๋ฅธ Hook๋ค์ ๋์ค์ ์ดํด๋ด
์๋ค!
์ธ์ Hook์ ์ฌ์ฉํ ๊น? ํจ์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ์ค state๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ ๋ ํด๋์ค ์ปดํฌ๋ํธ๋ก ๋ฐ๊พธ๊ณค ํ์ ๊ฒ๋๋ค. ํ์ง๋ง ์ด์ ํจ์ ์ปดํฌ๋ํธ ์์์ Hook์ ์ด์ฉํ์ฌ state๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฃผ์
์ปดํฌ๋ํธ ์์์ Hook์ ์ฌ์ฉํ ๋ ๋ช ๊ฐ์ง ํน๋ณํ ๊ท์น์ด ์์ต๋๋ค. ๋์ค์ Hook์ ๊ท์น์์ ์ดํด๋ณด๋๋ก ํ ๊ฒ์!
state ๋ณ์ ์ ์ธํ๊ธฐ
ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋, constructor ์์์ this.state
๋ฅผ { count: 0 }
๋ก ์ค์ ํจ์ผ๋ก์จ count
๋ฅผ 0
์ผ๋ก ์ด๊ธฐํํ์ต๋๋ค.
class Example extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 }; }
ํจ์ ์ปดํฌ๋ํธ๋ this
๋ฅผ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ this.state
๋ฅผ ํ ๋นํ๊ฑฐ๋ ์ฝ์ ์ ์์ต๋๋ค. ๋์ , useState
Hook์ ์ง์ ์ปดํฌ๋ํธ์ ํธ์ถํฉ๋๋ค.
import React, { useState } from 'react';
function Example() {
// ์๋ก์ด state ๋ณ์๋ฅผ ์ ์ธํ๊ณ , ์ด๊ฒ์ count๋ผ ๋ถ๋ฅด๊ฒ ์ต๋๋ค. const [count, setCount] = useState(0);
useState
๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๋ฌด์์ ํ๋ ๊ฑธ๊น์? โstate ๋ณ์โ๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค. ์์ ์ ์ธํ ๋ณ์๋ count
๋ผ๊ณ ๋ถ๋ฅด์ง๋ง banana
์ฒ๋ผ ์๋ฌด ์ด๋ฆ์ผ๋ก ์ง์ด๋ ๋ฉ๋๋ค. useState
๋ ํด๋์ค ์ปดํฌ๋ํธ์ this.state
๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๊ณผ ๋๊ฐ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ผ๋ฐ ๋ณ์๋ ํจ์๊ฐ ๋๋ ๋ ์ฌ๋ผ์ง์ง๋ง, state ๋ณ์๋ React์ ์ํด ์ฌ๋ผ์ง์ง ์์ต๋๋ค.
useState
์ ์ธ์๋ก ๋ฌด์์ ๋๊ฒจ์ฃผ์ด์ผ ํ ๊น์? useState()
Hook์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ ๊ฐ์ state์ ์ด๊ธฐ ๊ฐ์
๋๋ค. ํจ์ ์ปดํฌ๋ํธ์ state๋ ํด๋์ค์ ๋ฌ๋ฆฌ ๊ฐ์ฒด์ผ ํ์๋ ์๊ณ , ์ซ์ ํ์
๊ณผ ๋ฌธ์ ํ์
์ ๊ฐ์ง ์ ์์ต๋๋ค. ์์ ์์๋ ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ์ผ๋ง๋ ๋ง์ด ํด๋ฆญํ๋์ง ์๊ธฐ๋ฅผ ์ํ๋ฏ๋ก 0
์ ํด๋น state์ ์ด๊ธฐ ๊ฐ์ผ๋ก ์ ์ธํ์ต๋๋ค. (2๊ฐ์ ๋ค๋ฅธ ๋ณ์๋ฅผ ์ ์ฅํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด useState()
๋ฅผ ๋ ๋ฒ ํธ์ถํด์ผ ํฉ๋๋ค.)
useState
๋ ๋ฌด์์ ๋ฐํํ ๊น์? state ๋ณ์, ํด๋น ๋ณ์๋ฅผ ๊ฐฑ์ ํ ์ ์๋ ํจ์ ์ด ๋ ๊ฐ์ง ์์ ๋ฐํํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก const [count, setCount] = useState()
๋ผ๊ณ ์ฐ๋ ์ด์ ์
๋๋ค. ํด๋์ค ์ปดํฌ๋ํธ์ this.state.count
์ this.setState
์ ์ ์ฌํฉ๋๋ค. ๋ง์ฝ ์ด๋ฌํ ๋ฌธ๋ฒ์ ์ต์ํ์ง ์๋ค๋ฉด ํ์ฌ ํ์ด์ง์ ๋์์ ์ดํด๋ณผ๊ฒ์.
์ด์ useState
๋ฅผ ์ด์ฉํ์ฌ ๋ง์ ๊ฒ์ ๋ง๋ค ์ ์์ต๋๋ค.
import React, { useState } from 'react';
function Example() {
// ์๋ก์ด state ๋ณ์๋ฅผ ์ ์ธํ๊ณ , ์ด๊ฒ์ count๋ผ ๋ถ๋ฅด๊ฒ ์ต๋๋ค. const [count, setCount] = useState(0);
count
๋ผ๊ณ ๋ถ๋ฅด๋ state ๋ณ์๋ฅผ ์ ์ธํ๊ณ 0
์ผ๋ก ์ด๊ธฐํํฉ๋๋ค. React๋ ํด๋น ๋ณ์๋ฅผ ๋ฆฌ๋ ๋๋งํ ๋ ๊ธฐ์ตํ๊ณ , ๊ฐ์ฅ ์ต๊ทผ์ ๊ฐฑ์ ๋ ๊ฐ์ ์ ๊ณตํฉ๋๋ค. count
๋ณ์์ ๊ฐ์ ๊ฐฑ์ ํ๋ ค๋ฉด setCount
๋ฅผ ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
์ฃผ์
์
createState
๊ฐ ์๋,useState
๋ก ์ด๋ฆ์ ์ง์์๊น์?์ปดํฌ๋ํธ๊ฐ ๋ ๋๋งํ ๋ ์ค์ง ํ ๋ฒ๋ง ์์ฑ๋๊ธฐ ๋๋ฌธ์ โCreateโ๋ผ๋ ์ด๋ฆ์ ๊ฝค ์ ํํ์ง ์์ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง์ ํ๋ ๋์
useState
๋ ํ์ฌ state๋ฅผ ์ค๋๋ค. Hook ์ด๋ฆ์ด ํญ์use
๋ก ์์ํ๋ ์ด์ ๋ ์์ต๋๋ค. Hook์ ๊ท์น์์ ๋์ค์ ์ดํด๋ณด๋๋ก ํ ๊ฒ์.
state ๊ฐ์ ธ์ค๊ธฐ
ํด๋์ค ์ปดํฌ๋ํธ๋ count๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด this.state.count
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
<p>You clicked {this.state.count} times</p>
๋ฐ๋ฉด ํจ์ ์ปดํฌ๋ํธ๋ count
๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
<p>You clicked {count} times</p>
state ๊ฐฑ์ ํ๊ธฐ
ํด๋์ค ์ปดํฌ๋ํธ๋ count
๋ฅผ ๊ฐฑ์ ํ๊ธฐ ์ํด this.setState()
๋ฅผ ํธ์ถํฉ๋๋ค.
<button onClick={() => this.setState({ count: this.state.count + 1 })}> Click me
</button>
๋ฐ๋ฉด ํจ์ ์ปดํฌ๋ํธ๋ setCount
์ count
๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก this
๋ฅผ ํธ์ถํ์ง ์์๋ ๋ฉ๋๋ค.
<button onClick={() => setCount(count + 1)}> Click me
</button>
์์ฝ
์๋ ์ฝ๋๋ฅผ ํ ์ค ํ ์ค ์ดํด๋ณด๊ณ , ์ผ๋ง๋ ์ดํดํ๋์ง ์ฒดํฌํด๋ด ์๋ค.
1: import React, { useState } from 'react'; 2:
3: function Example() {
4: const [count, setCount] = useState(0); 5:
6: return (
7: <div>
8: <p>You clicked {count} times</p>
9: <button onClick={() => setCount(count + 1)}>10: Click me
11: </button>
12: </div>
13: );
14: }
- ์ฒซ ๋ฒ์งธ ์ค:
useState
Hook์ React์์ ๊ฐ์ ธ์ต๋๋ค. - ๋ค ๋ฒ์งธ ์ค:
useState
Hook์ ์ด์ฉํ๋ฉด state ๋ณ์์ ํด๋น state๋ฅผ ๊ฐฑ์ ํ ์ ์๋ ํจ์๊ฐ ๋ง๋ค์ด์ง๋๋ค. ๋ํ,useState
์ ์ธ์์ ๊ฐ์ผ๋ก0
์ ๋๊ฒจ์ฃผ๋ฉดcount
๊ฐ์ 0์ผ๋ก ์ด๊ธฐํํ ์ ์์ต๋๋ค. - ์ํ ๋ฒ์งธ ์ค: ์ฌ์ฉ์๊ฐ ๋ฒํผ ํด๋ฆญ์ ํ๋ฉด
setConut
ํจ์๋ฅผ ํธ์ถํ์ฌ state ๋ณ์๋ฅผ ๊ฐฑ์ ํฉ๋๋ค. React๋ ์๋ก์ดcount
๋ณ์๋ฅผExample
์ปดํฌ๋ํธ์ ๋๊ธฐ๋ฉฐ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋งํฉ๋๋ค.
๋ง์ ๊ฒ๋ค์ด ์๊ธฐ ๋๋ฌธ์ ์ฒ์์๋ ๋ค์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ค๋ช ์ด ์ดํด๊ฐ ์ ์ ๋๋ค๋ฉด, ์์ ์ฝ๋๋ฅผ ์ฒ์ฒํ ๋ค์ ์ฝ์ด๋ณด์ธ์. ํด๋์ค ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ state ๋์ ๋ฐฉ์์ ์๊ณ , ์๋ก์ด ๋์ผ๋ก ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ถ๋ช ํ ์ดํด๊ฐ ๊ฐ ๊ฒ์ ๋๋ค.
ํ: ๋๊ดํธ๊ฐ ์๋ฏธํ๋ ๊ฒ์ ๋ฌด์์ผ๊น์?
๋๊ดํธ๋ฅผ ์ด์ฉํ์ฌ state ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ฒ์ ๋ณด์ จ์ ๊ฒ๋๋ค.
const [count, setCount] = useState(0);
๋๊ดํธ ์ผ์ชฝ์ state ๋ณ์๋ ์ฌ์ฉํ๊ณ ์ถ์ ์ด๋ฆ์ผ๋ก ์ ์ธํ ์ ์์ต๋๋ค.
const [fruit, setFruit] = useState('banana');
์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ โ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํดโ๋ผ๊ณ ํ๊ณ , fruit
๊ณผ setFruit
, ์ด 2๊ฐ์ ๊ฐ์ ๋ง๋ค๊ณ ์์ต๋๋ค. ์ฆ, useState
๋ฅผ ์ฌ์ฉํ๋ฉด fruit
์ด๋ผ๋ ์ฒซ ๋ฒ์งธ ๊ฐ๊ณผ setFruit
๋ผ๋ ๋ ๋ฒ์งธ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์๋์ ์ฝ๋์ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ผ ์ ์์ต๋๋ค.
var fruitStateVariable = useState('banana'); // ๋ ๊ฐ์ ์์ดํ
์ด ์๋ ์์ ๋ฐํ
var fruit = fruitStateVariable[0]; // ์ฒซ ๋ฒ์งธ ์์ดํ
var setFruit = fruitStateVariable[1]; // ๋ ๋ฒ์งธ ์์ดํ
useState
๋ฅผ ์ด์ฉํ์ฌ ๋ณ์๋ฅผ ์ ์ธํ๋ฉด 2๊ฐ์ ์์ดํ
์์ด ๋ค์ด์๋ ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ง๋๋ค. ์ฒซ ๋ฒ์งธ ์์ดํ
์ ํ์ฌ ๋ณ์๋ฅผ ์๋ฏธํ๊ณ , ๋ ๋ฒ์งธ ์์ดํ
์ ํด๋น ๋ณ์๋ฅผ ๊ฐฑ์ ํด์ฃผ๋ ํจ์์
๋๋ค. ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด๋ผ๋ ํน๋ณํ ๋ฐฉ๋ฒ์ผ๋ก ๋ณ์๋ฅผ ์ ์ธํด์ฃผ์๊ธฐ ๋๋ฌธ์ [0]
์ด๋ [1]
๋ก ๋ฐฐ์ด์ ์ ๊ทผํ๋ ๊ฒ์ ์ข์ง ์์ ์ ์์ต๋๋ค.
์ฃผ์
this
๋ฅผ React์ ์๋ฆฌ์ง ์์๋๋ฐ, ์ด๋ป๊ฒ React๊ฐ ํน์ ์ปดํฌ๋ํธ์์useState
๋ฅผ ์ฌ์ฉํ ๊ฒ์ ์๋ ์ง ๊ถ๊ธํดํ ์ ์์ต๋๋ค. ์ด ์ง๋ฌธ๊ณผ ๋ค๋ฅธ ๊ถ๊ธ ์ฌํญ๋ค์ ๋์ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํ: ์ฌ๋ฌ ๊ฐ์ state ๋ณ์๋ฅผ ์ฌ์ฉํ๊ธฐ
[something, setSomething]
์ ์์ฒ๋ผ state ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ฒ์ ์ ์ฉํฉ๋๋ค. ์๋ํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ๋ณ์๋ฅผ ์ ์ธํ ๋ ๊ฐ๊ฐ ๋ค๋ฅธ ์ด๋ฆ์ ์ค ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
function ExampleWithManyStates() {
// ์ฌ๋ฌ ๊ฐ์ state๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค!
const [age, setAge] = useState(42);
const [fruit, setFruit] = useState('banana');
const [todos, setTodos] = useState([{ text: 'Learn Hooks' }]);
์์ ์ฝ๋๋ age
, fruit
, todos
๋ผ๋ ์ง์ญ ๋ณ์๋ฅผ ๊ฐ์ง๋ฉฐ ๊ฐ๋ณ์ ์ผ๋ก ๊ฐฑ์ ํ ์ ์์ต๋๋ค.
function handleOrangeClick() {
// this.setState({ fruit: 'orange' })์ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋
๋๋ค.
setFruit('orange');
}
์ฌ๋ฌ ๊ฐ์ state ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋ฉ๋๋ค. state ๋ณ์๋ ๊ฐ์ฒด์ ๋ฐฐ์ด์ ์ ๊ฐ์ง๊ณ ์์ ์ ์์ผ๋ฏ๋ก ์๋ก ์ฐ๊ด์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฌถ์ ์ ์์ต๋๋ค. ํ์ง๋ง ํด๋์ค ์ปดํฌ๋ํธ์ this.setState
์ ๋ฌ๋ฆฌ state๋ฅผ ๊ฐฑ์ ํ๋ ๊ฒ์ ๋ณํฉํ๋ ๊ฒ์ด ์๋๋ผ ๋์ฒดํ๋ ๊ฒ์
๋๋ค.
๋ ๋ฆฝ์ ์ธ state ๋ณ์ ๋ถํ ์ ๋ํ ์ถ๊ฐ์ ์ธ ๊ถ์ฅ ์ฌํญ์ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ์์ ๋ณผ ์ ์์ต๋๋ค. ์์ฃผ ๋ฌป๋ ์ง๋ฌธ.
๋ค์ ๋จ๊ณ
์ด๋ฒ ํ์ด์ง์์ React์ Hook ์ค ํ๋์ธ useState
์ ๋ํด ๋ฐฐ์ ์ต๋๋ค. useState
๋ฅผ ์ด์ฉํ๋ฉด ํจ์ ์ปดํฌ๋ํธ ์์์ state๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Hook์ ํจ์ ์ปดํฌ๋ํธ์์ React์ ํน์ง์ ๊ฐ๊ฒ ํด์ฃผ๋ ํจ์์
๋๋ค. Hook์ ํญ์ use
๋ผ๋ ํค์๋๋ก ์์ํ๋ฉฐ useState
์ด์ธ์ ์์ง ๋ณด์ง ๋ชปํ ๋ง์ Hook๋ค์ด ์์ต๋๋ค.
๋ค์ ๊ฐ์ข๋ฅผ ์ด์ด์ ํฉ์๋ค. ๋ค์ Hook ๊ฐ์ข: useEffect
. ๋ค์์ ๋ฐฐ์ธ Hook์ ํด๋์ค ์ปดํฌ๋ํธ์ ์๋ช
์ฃผ๊ธฐ์ ๋น์ทํ ํผํฌ๋จผ์ค๋ฅผ ๋ผ ์ ์์ต๋๋ค.