2022. 5. 7. 18:24ใReact
React - useRef
https://www.daleseo.com/react-hooks-use-ref/
(ํด๋น ๊ธ์ ์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ์กฐํ์์ต๋๋ค.)
์ด๋ฒ ๊ธ์์๋ ๋ฆฌ์กํธ์์ ํน์ ์ํฉ์์ ์ฌ์ฉํ๋ ์ ์ฉํ ํจ์ ํ ์ธ useRef์ ๋ํด์ ์๊ฐํ๋ ค๊ณ ํ๋ค.
useRef๋ ์ธ์๋ฅผ ๋ฃ์ด ์ ์ํ๋ฉด current ๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ฒ ๋๋๋ฐ ์ด current ๊ฐ์ ์ธ์๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
๋ณดํธ์ ์ผ๋ก useRef๋ฅผ ์ฌ์ฉํ๋ ์ํฉ์ 3๊ฐ์ง๋ก ๋๋๋ค.
1. ํฌ์ปค์ค, ํ ์คํธ ์ ํ์์ญ, ํน์ ๋ฏธ๋์ด์ ์ฌ์์ ๊ด๋ฆฌํ ๋
2. ์ ๋๋ฉ์ด์ ์ ์ง์ ์ ์ผ๋ก ์คํ์ํฌ ๋
3. ์๋ ํํฐ DOM ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ React์ ๊ฐ์ด ์ฌ์ฉํ ๋.
์ ์ธ์ ์ผ๋ก ํด๊ฒฐ๋ ์ ์๋ ๋ฌธ์ (ex. ํ์ดํ ์์ด์ฝ์ ํตํ ์ ์ด)๋ ref ์ฌ์ฉ์ ์ง์ํ๊ณ props๋ฅผ ํตํด ํด๊ฒฐ.
ํ์๋ input ์์์ ์ฐ๊ฒฐ์ํค๋ ๋ฐฉ๋ฒ์ด๋ useRef๋ก ์ธํ ๋ณ์๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ setInterval์ ๊ด๋ จํ ๋ด์ฉ์ ๋ค๋ค๋ณผ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๋ ์๋์ผ๋ก ์นด์ดํธํ๋ ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
๋ ๋๋ง์ด ๋๊ณ ๋ ํ์ ์๋์ด ๋๋ useEffect ๋ด๋ถ์์ count๊ฐ ๋ณํํ๊ฒ ๋๊ณ ์ด๋ state๋ณํ๋ก ์ด์ด์ ธ app ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ ๋๋งํ๊ฒ ๋๋ค. ํ์ง๋ง useEffect์ ๋๋ฒ์งธ ์ธ์๋ ๋น ๋ฐฐ์ด์ด๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ์ ์๋ํ์ง ์๋๋ค.
๊ทธ๋ผ์๋ interValId๋ setInterval์ด DomApI๋ก ์คํ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ์ ๋จ์์ ์ฝ๋ฐฑํจ์๋ฅผ ์คํํ๊ณ ์๋ค.
์๋์ผ๋ก ์นด์ดํธํ๋ ์ฝ๋๋ก๋ ์ข์๋ณด์ด๋ ๋ฐฉ๋ฒ์ด๋ค.
import React, { useState, useEffect } from 'react';
function App() {
const [count, setCount] = useState(0);
console.log(`๋ ๋๋ง... count: ${count}`)
useEffect(() => {
console.log('useEffect');
const interValId = setInterval(() => setCount((count) => count +1), 1000);
return () => clearInterval(interValId);
}, []);
return (
<div>
<p>์๋ ์นด์ดํธ: {count}</p>
</div>
);
}
export default App;
์ด๋ฒ์๋ ์๋์นด์ดํธ ๊ธฐ๋ฅ๊ณผ ๋๋ถ์ด ์นด์ดํธ๋ฅผ ์์ํ๊ณ ์ ์งํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํด๋ณด์.
์ฐ์ intervalId๋ ์นด์ดํธ๋ฅผ ์์์ํค๋ ํจ์์ ์ ์ง์ํค๋ ํจ์ ๋ ๋ค ๋ด๋ถ์์ ์ฌ์ฉํด์ผํ๊ธฐ ๋๋ฌธ์ ์ต์๋จ์์ ์ ์๊ฐ ๋์ด์ผ ํ๋ค. ์ผํ ๋ณด๋ฉด ๋ฌธ์ ๊ฐ ์์ด ๋ณด์ด์ง๋ง intervalId๊ฐ ์ ์๋ ๋ฐฉ์์ ์ดํด๋ณด๋ฉด ๋ฌธ์ ๊ฐ ๋ณด์ธ๋ค.
๋จผ์ startCounterํจ์๋ฅผ ์คํ์์ผฐ์ ๋ ์ฐ๋ฆฌ๋ count state๋ฅผ ์กฐ์ํ๊ฒ ๋๋ค. state๊ฐ ์กฐ์๋๋ฉด ์ฌ๋ ๋๋ง์ด ์ผ์ด๋๊ณ intervalId๊ฐ ๋ค์ ์๋กญ๊ฒ ์ ์๊ฐ ๋๋ค. ์ด๊ฒ์ด ์๋ฏธํ๋ ๊ฒ์ ๊ธฐ์กด์ setInterval์ ๊ฑธ์ด๋์๋ intervalId๊ฐ clear๋์ง ์์์ํ๋ก ๋ธ๋ผ์ฐ์ ์ ๋จ์์์ ๊ฑฐ๋ผ๋ ๊ฒ์ด๋ค. ์์ useEffect์์์์๋ intervalId๊ฐ ์ ์ญ์ผ๋ก ์ ์ธ๋์ด์์ง ์์์ ๋ณํ์ง ์์๋ ๊ฒ ์ด ์์์์๋ ๊ฑธ๋ฆผ๋์ด ๋๋ ๊ฒ์ด๋ค.
import React, { useState, useEffect } from 'react';
function App() {
const [count, setCount] = useState(0);
let intervalId;
const startCounter = () => {
intervalId = setInterval(()=> setCount((count) => count+1), 1000);
};
const stopCounter = () => {
clearInterval(intervalId);
};
return (
<div>
<p>์๋ ์นด์ดํธ: {count}</p>
<button onClick={startCounter}>์์</button>
<button onClick={stopCounter}>์ ์ง</button>
</div>
);
}
export default App;
๊ทธ๋ผ ์ฐ๋ฆฌ๋ ์๊ฐํ๊ฒ ๋๋ค. 'intervalId๊ฐ ๊ณ์ ๋ณํ๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ์ ๋จ๊ฒ๋๋ฉด ๋ณํ์ง ์๊ฒํ๋ฉด ๋์ง ์์๊น?'
๊ทธ๋์ ์ฌ์ฉํ๋ ๊ฒ useRef์ด๋ค.
useRef๋ก ์ ์ ๋ ๋ณ์๋ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ ๋๋งํ ๋ current ์์ฑ์ ๊ฐ์ด ์ ์ค๋์ง ์๋๋ค. ์๋ ์ฝ๋๋ฅผ ๋ณด์.
import React, { useState, useEffect, useRef } from 'react';
function App() {
const [count, setCount] = useState(0);
const intervalId = useRef(null);
console.log(`๋ ๋๋ง ... count: ${count}`);
const startCounter = () => {
intervalId.current = setInterval(() => setCount((count) => count+1), 1000);
console.log(`์์... intervalId: ${intervalId.current}`);
}
const stopCounter = () => {
clearInterval(intervalId.current);
console.log(`์ ์ง... intervalId: ${intervalId.current}`);
}
return (
<div>
<p>์๋ ์นด์ดํธ: {count}</p>
<button onClick={startCounter}>์์</button>
<button onClick={stopCounter}>์ ์ง</button>
</div>
);
}
export default App;
intervalId๋ฅผ useRef๋ก ์ ์ํ ๋ค startCounter ๋ถ๋ถ์์ intervalId.current์ setIntervalํจ์๋ฅผ ๋ฃ์ผ๋ฉด ์ฌ๋ ๋๋ง์ด ๋์ด๋ ์ด๊ธฐ์ ์ ์ฅํด ๋์๋ setInterval DOM API์ ๊ฐ์ ์ ์งํ๊ฒ ๋๋ค. ์ด๋ stopCounterํจ์์ ๋ํด์๋ ์ผ๊ด์ฑ์ ์ฃผ๊ธฐ ๋๋ฌธ์ ์๋ํ๋ setInterval DOM API๋ฅผ ์ง์ธ ์ ์๊ฒ ๋๋ค.
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
State ๋์ด์ฌ๋ฆฌ๊ธฐ (0) | 2022.05.07 |
---|---|
React - ํฉ์ฑ (0) | 2022.05.07 |
React - useEffect, useCallback (0) | 2022.04.11 |