useState โญ๏ธ
- React์ state๋ ์ปดํฌ๋ํธ ๋ด๋ถ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ ํ ๊ฐ์ด๋ค.
- ํจ์ํ ์ปดํฌ๋ํธ์์ useState ํ ์ ์ฌ์ฉํด ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค.
import React, { useState } from 'react';
function App() {
const [number, setNumber] = useState(0);
return (
<div>
<h1>{number}</h1>
</div>
);
}
export default App;
- React ํจํค์ง์์ useState๋ฅผ ๋ถ๋ฌ์ import ํ ์ฌ์ฉํ ์ ์๋ค.
- useState์ ์ธ์์๋ ์ด๊ธฐ๊ฐ์ ํ ๋นํ๋ค. (๋ถ๋ฆฌ์ธ์ด๋ ๋ฐฐ์ด, ๊ฐ์ฒด๋ ํ ๋น ๊ฐ๋ฅ)
- useState๋ ๋ฐฐ์ด์ ๋ฐํํ๋๋ฐ ์ด๋ ์ฒซ๋ฒ์งธ number๋ ์์์ ํ์ฌ ์ํ, ๋๋ฒ์งธ ์์๋ Setterํจ์๋ฅผ ๋ฐํํ๋ค.
setState ๐
import React, { useState } from "react";
function App() {
const [number, setNumber] = useState(0);
const onIncrease = () => {
setNumber(number + 1);
};
const onDecrease = () => {
setNumber(number - 1);
};
return (
<div>
<h1>{number}</h1>
<button onClick={onIncrease}>+1</button>
<button onClick={onDecrease}>-1</button>
</div>
);
}
export default App;
- setNumber๋ฅผ ์ฌ์ฉํด ๊ฐ์ ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ ํ๋ฉด์ ๋ค์ ๋ ๋๋ง ๋์ด์ ํ๋ฉด์ด ์ ๋ฐ์ดํธ ๋๋ค.
- ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด setNumber์ ์ธ์๋ก ์ง์ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์๋๋ฐ ์ด๋ฐ ๋ฐฉ๋ฒ์ ๋ฌธ์ ๊ฐ ์๊ธธ์๋ ์๋ค.
- ๊ทธ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ๋ฒ์ผ๋ก ์ฝ๋ฐฑํจ์๋ฅผ ์ด์ฉํ๋ ํจ์ํ ์ ๋ฐ์ดํธ, useEffect๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
setState์ ๋์ ๋ฐฉ์
import React, { useState } from "react";
function App() {
const [number, setNumber] = useState(0);
const onIncrease = () => {
setNumber(number + 1);
setNumber(number + 1);
setNumber(number + 1);
};
const onDecrease = () => {
setNumber(number - 1);
setNumber(number - 1);
setNumber(number - 1);
};
return (
<div>
<h1>{number}</h1>
<button onClick={onIncrease}>+1</button>
<button onClick={onDecrease}>-1</button>
</div>
);
}
export default App;
- ์ด๋ ๊ฒ setterํจ์๋ฅผ ํ๋ฒ์ ์ฌ๋ฌ๋ฒ ํ์๊ฒฝ์ฐ 3์ด +- ๋ ๊ฒ ๊ฐ์ง๋ง 1๋งํผ๋ง ๋ณ๊ฒฝ๋๋ค. ์ด๊ฑด setState๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ํด๋ฆญ์ด๋ฒคํธ ๋ฐ์ -> setNumber ์คํ -> ๋น๋๊ธฐ๋ก์ง์ผ๋ก ์์ ๋ค๋ก ๋ฐ๋ ค๋จ -> ๋ค๋ฅธ ๋๊ธฐ์ ๋ก์ง๋ค ์คํ -> ๋ค์ ๋ชจ๋ setNumber ํ๋ฒ์ ์คํ -> ๋์์ ์คํํ๊ธฐ์ ์ด์ number ๊ฐ์ธ 0์ ๊ฐ๊ฐ ํ ๋น ์ฆ, 0 + 1 ์ 3๋ฒ ํ๋๊ผด
- ์ด๋ ๊ฒ ๋์ํ๋ ์ด์ ๋ ๋ฆฌ์กํธ์ state๊ฐ ๋ณ๊ฒฝ์ด ๋๋ฉด ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋๋๋ฐ ๊ฐ๊ฐ์ state๋ฅผ ํ๋ํ๋ ๋ ๋๋ง์ ํด์ค๋ค๋ฉด ์ฑ๋ฅ์ ์ผ๋ก๋ ํจ์จ์ ์ผ๋ก๋ ๋ฌธ์ ๊ฐ ๋๊ธฐ ๋๋ฌธ์ react์ setState๋ ํด๋น ๋ก์ง์ ํ๋ฒ์ batch update๋ฅผ ํ๋ค.
- ํ์ธํ๋ ๋ฐฉ๋ฒ์ onIncrease ํจ์๋ด์ setNumber๋ฅผ ์คํ ์ดํ ํจ์์์์ console.log(number)๋ฅผ ํด๋ณด๋ฉด ๋ณ๊ฒฝ๋๊ธฐ ์ ๊ฐ์ธ 0์ด ๋์ค๊ฒ ๋๋ค.
- ์ด์ ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด ๋ช๊ฐ์ง ์๋ค.
react batch update
- state ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ํด๋น ์ปดํฌ๋ํธ์ ๊ทธ ์์์ปดํฌ๋ํธ๋ค์ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋๋ค.
- state๊ฐ ์ฌ๋ฌ๊ฐ ์์ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ ์ ๋ฐ์ดํธ๋ฅผ ํ๊ฒ ๋๋ค๋ฉด ๋ฆฌ๋ ๋๋ง์ด ์ฌ๋ฌ๋ฒ ์ผ์ด๋์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น๊ฒ๋๋ค.
- ์ด๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ผ๋ก React batch updating ์ด ์๊ฒผ๋๋ฐ ์ด๋ ์ปดํฌ๋ํธ์ ๋ ๋๋ง ํ์๋ฅผ ์ต์ํํ๋ ๋ฐฉ๋ฒ์ผ๋ก์ State๋ฅผ ๊ฐ๊ฐ ์ ๋ฐ์ดํธ ํ๋ ๊ฒ์ด ์๋ ์ผ๊ด ์ ๋ฐ์ดํธ๋ก ํ๋ฒ์ ์ฒ๋ฆฌํ์ฌ ๋ ๋๋ง ํ์๋ฅผ ์ต์ํํ ์ ์๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
ํจ์ํ ์ ๋ฐ์ดํธ
import React, { useState } from "react";
function App() {
const [number, setNumber] = useState(0);
const onIncrease = () => {
setNumber((prev)=> prev + 1);
setNumber((prev)=> prev + 1);
setNumber((prev)=> prev + 1);
};
const onDecrease = () => {
setNumber((prev)=> prev - 1);
setNumber((prev)=> prev - 1);
setNumber((prev)=> prev - 1);
};
return (
<div>
<h1>{number}</h1>
<button onClick={onIncrease}>+1</button>
<button onClick={onDecrease}>-1</button>
</div>
);
}
export default App;
- setState์ ์ธ์๋ก ์ฝ๋ฐฑ ํจ์๋ฅผ ๋๊ธฐ๊ฒ ๋๋ฉด ๊ทธ ์ฝ๋ฐฑํจ์์ ์ธ์์๋ state๊ฐ์ ์ธ์๋ก ๋ฐ์ ์ ์๋ค.
- ์ด๋ ๊ฒ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ด์ฉํ๋ฉด ์ ๋ฐ์ดํธ ๋ ์ต์ ์ state์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
- ํจ์๋ก ์ ๋ฌํ๊ฒ ๋๋ฉด ์ ๋ฌ๋ฐ๋ ํจ์๋ค์ด ํ์ ์์๋๋ก ์ ์ฅ๋๊ณ FIFO(Fisrt In First Out)๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ํ์์๋ ๋จผ์ ๋ค์ด์จ ํจ์๋ฅผ ์คํํ๋ฏ๋ก ํญ์ ์ต์ ์ state๋ฅผ ์ ์งํ ์ ์๋ค.
useEffect ํ์ฉ
import React, { useEffect, useState } from "react";
function App() {
const [number, setNumber] = useState(0);
useEffect(() => {
console.log(number);
}, [number]);
const onIncrease = () => {
setNumber(number + 1);
};
const onDecrease = () => {
setNumber(number - 1);
};
return (
<div>
<h1>{number}</h1>
<button onClick={onIncrease}>+1</button>
<button onClick={onDecrease}>-1</button>
</div>
);
}
export default App;
- useEffect๋ฅผ ์ด์ฉํด์ ์์กด์ฑ๋ฐฐ์ด์ number๋ฅผ ์ถ๊ฐํ๋ฉด number์ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ฌ ์ฆ์ ์ ๋ฐ์ดํธ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] ์ฌ๊ท ์ปดํฌ๋ํธ (1) | 2023.10.15 |
---|---|
[React] debounce (feat. lodash) (0) | 2023.01.24 |
[React]useLocation (0) | 2022.11.02 |
[React]CustomHook (์ฌํ์ฉ์ฑ form๋ง๋ค๊ธฐ) (0) | 2022.08.19 |
[React]useMemo, useCallback (0) | 2022.08.19 |