๐ก TIL 20230831 - ๊ธฐ์ ๋ฉด์ ์ง๋ฌธ ์ ๋ฆฌ - ๋ฒ์ธ์ผ ๋/๋ฆฌ์ผ ๋, useRef, useEffect
1. ๋ฒ๊ณผ ๋ฆฌ์ผ ๋์ ์ฐจ์ด
๋จผ์ DOM์ด๋ Document Object Model์ ์ฝ์๋ก ์น ์ดํ๋ฆฌ์ผ์ด์ ์ HTML ์์๋ค์ ๋ ธ๋๋ผ๋ ๋จ์๋ก ๋๋์ด ๋ ธ๋๋ค์ ์ฐ๊ฒฐํ ํธ๋ฆฌ ๊ตฌ์กฐ์ ๊ฐ์ฒด์ ๋๋ค.
์ค์ DOM์ ๋ธ๋ผ์ฐ์ ํ๋ฉด์ ๋ ๋๋งํ ๋ ์ด์ฉํ๋ HTML ์์(๋ ธ๋)๋ค์ ํธ๋ฆฌ ๊ตฌ์กฐ์ด๊ณ , ๊ฐ์ DOM์ ์ค์ DOM์ ๊ฐ๋ฒผ์ด ๋ณต์ฌ๋ณธ์ด๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ์๋ง ์กด์ฌํ๋ ๊ฐ์์ ํธ๋ฆฌ๊ตฌ์กฐ ์ ๋๋ค. ๊ฐ์ DOM์ React.js, Vue.js์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ์์ ์ฌ์ฉ๋ฉ๋๋ค.
๋์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ์ค์ DOM์ ์ผ๋ถ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ ์ฒด DOM์ ํ๊บผ๋ฒ์ ๋ค์ ๋ ๋๋งํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ํ ๋ธ๋ผ์ฐ์ ๋ JS, Html/CSS๋ง ์ฝ์ ์ ์๊ณ JS๋ ๋จ์ผ ์ค๋ ๋ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ์ ์ฒด ํ์ด์ง๋ฅผ ๋ค์ ๋ก๋ํด์ผ ํ๋ค๋ ์ ์ ๋๋ค.
๊ฐ์ DOM์์๋ DOM์ ์ผ๋ถ๋ถ์ด ๋ณ๊ฒฝ๋๋ฉด ์ด์ DOM์ ๊ฒ์ฌํ๊ณ ๋ณ๊ฒฝ๋ ๋ถ๋ถ์ ๊ฒ์ฌํ์ฌ ํด๋น ๋ถ๋ถ๋ง ๋ค์ ๋ ๋๋งํ๊ณ ๋ณ๊ฒฝ๋ DOM์ ํ์ํ๋ "differ"๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ ์คํํ๋ ๊ณผ์ ์ ํตํด, ๋ ํจ์จ์ ์ผ๋ก ๋ ๋๋งํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
2. useRef
๊ณต์ ๋ฌธ์์์์ ์ ์ `useRef` is a React Hook that lets you reference a value that’s not needed for rendering.
๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์์์๋ `useRef`๋ ๋ ๋๋ง์ด ํ์ํ์ง ์์ ๊ฐ์ ์ฐธ์กฐํ ์ ์๋๋ก ํ๋ ๋ฆฌ์กํธ ํ ์ด๋ผ๊ณ ์ ์๋์ด ์์ต๋๋ค. ์ฃผ๋ก ํจ์ํ ์ปดํฌ๋ํธ์์ DOM ์์์ ์ง์ ์ ๊ทผํ๊ฑฐ๋, ์ ์ฅ ๊ณต๊ฐ(๋ณ์ ๊ด๋ฆฌ)๋ฅผ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
import { useEffect, useRef } from 'react'
import './App.css';
function App() {
const inputRef = useRef();
useEffect(() => {
console.log(inputRef);
inputRef.current.focus();
}, [])
const loginAlert = () => {
alert(`ํ์ํฉ๋๋ค. ${inputRef.current.value}`);
inputRef.current.focus();
}
return (
<div className="App">
<header className="App-header">
<input ref={inputRef} type="text" placeholder="id"/>
<button onClick={loginAlert}>Login</button>
</header>
</div>
);
}
export default App;
DOM ์์์ ์ ๊ทผํ๋ ์์๋ก๋ ์ ์ ๊ฐ input ์์๋ฅผ ํด๋ฆญํ์ง ์์๋ ํ๋ฉด์ด ๋ ๋๋ง๋ ๋ ์๋์ผ๋ก ํฌ์ปค์ค๋ฅผ ์ฃผ๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค.
๋ํ useRef๋ ๋ ๋๋ง๊ณผ ๋ฌด๊ดํ ๊ฐ์ ์ ์ฅํ๊ณ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค. ์ปดํฌ๋ํธ์์ ์ ์ฅ ๊ณต๊ฐ, ๋ณ์ ๊ด๋ฆฌ๋ผ๊ณ ํ๋ฉด state๋ฅผ ๋จผ์ ๋ ์ฌ๋ฆด ์ ์์ต๋๋ค. ์ด state์ ๊ฐ์ ๋ฐ๊พธ๊ธฐ ์ํด useState ํ ์ ์ฌ์ฉํ๋๋ฐ, useState๋ฅผ ์ด์ฉํ๋ฉด state ๊ฐ์ด ๋ณํ ๋๋ง๋ค ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ฉด์ ์ปดํฌ๋ํธ ๋ด๋ถ ๋ณ์๋ค์ด ์ด๊ธฐํ ๋ฉ๋๋ค. state ๋์ ref ์์ ๊ฐ์ ์ ์ฅํ๋ฉด, ref์์ ์๋ ๊ฐ์ด ์๋ฌด๋ฆฌ ๋ณํด๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋์ง ์์ผ๋ฉด์ ๋ณ์์ ๊ฐ์ ์ ์งํ ์ ์์ต๋๋ค.
import React, { useRef, useState } from 'react';
function MyComponent() {
const renderCount = useRef(0);
// ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค renderCount๊ฐ ์ฆ๊ฐํ์ง๋ง,
// ์ด๋ ๋ ๋๋ง๊ณผ ๋ฌด๊ดํ๊ฒ ๋ณ๊ฒฝ๋ฉ๋๋ค.
renderCount.current++;
return <div>๋ ๋๋ง ํ์: {renderCount.current}</div>;
}
'โ๏ธ What I Learned > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] JavaScript ๋๊ธฐ, ๋น๋๊ธฐ, ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ํ์์ฑ (0) | 2023.09.09 |
---|---|
[TIL] Tailwind CSS break-all (ํ ์คํธ ์ค๋ฐ๊ฟ ์ ๊นจ์ง๋ ํ์ ํด๊ฒฐ) (1) | 2023.09.07 |
[TIL] react-hook-form mode (0) | 2023.08.30 |
[TIL] ์ผ์์ ์ฌ๊ฐ์ง๋ TDZ(Temporal Dead Zone) (0) | 2023.08.26 |
[TIL] import { useRouter } from โnext/routerโ์ โnext/navigationโ ์ฐจ์ด (0) | 2023.08.24 |