โœ๏ธ What I Learned/TIL

[TIL] ๊ธฐ์ˆ ๋ฉด์ ‘ ์งˆ๋ฌธ ์ •๋ฆฌ - ๋ฒ„์ธ„์–ผ ๋”/๋ฆฌ์–ผ ๋”, useRef

2023. 8. 31. 23:44
๋ชฉ์ฐจ
  1. 1. ๋ฒ„๊ณผ ๋ฆฌ์–ผ ๋”์˜ ์ฐจ์ด
  2. 2. useRef

๐Ÿ’ก 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
  1. 1. ๋ฒ„๊ณผ ๋ฆฌ์–ผ ๋”์˜ ์ฐจ์ด
  2. 2. useRef
'โœ๏ธ What I Learned/TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [TIL] JavaScript ๋™๊ธฐ, ๋น„๋™๊ธฐ, ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•„์š”์„ฑ
  • [TIL] Tailwind CSS break-all (ํ…์ŠคํŠธ ์ค„๋ฐ”๊ฟˆ ์‹œ ๊นจ์ง€๋Š” ํ˜„์ƒ ํ•ด๊ฒฐ)
  • [TIL] react-hook-form mode
  • [TIL] ์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€ TDZ(Temporal Dead Zone)
Jiwon()
Jiwon()
Jiwon()
jiwondev.log
Jiwon()
์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
  • ์ „์ฒด๋ณด๊ธฐ (86)
    • โœ๏ธ What I Learned (52)
      • TIL (41)
      • ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… (8)
    • ๐Ÿ’ป Programming (31)
      • Algorithm (12)
      • React (1)
      • JS, TS (7)
      • HTML, CSS (7)
      • ๊ธฐํƒ€ (4)
    • ๐Ÿ–Š๏ธ ์ผ๊ธฐ (3)
      • ์ผ์ƒ๊ธฐ๋ก (2)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ์ฝ”๋”ฉ
  • css
  • Prisma
  • javascript
  • ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…
  • nextjs
  • ํ”„๋ก ํŠธ์—”๋“œ
  • HTML
  • React-Hook-Form
  • ์›น๊ฐœ๋ฐœ
  • ๋ฆฌ์•กํŠธ
  • React
  • TypeScript
  • slice
  • ํด๋ฆฐ์ฝ”๋“œ
  • tailwindcss
  • Next.js
  • ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„
  • transition
  • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
  • reduxtoolkit
  • SSR
  • recoil
  • Til
  • Redux
  • Firebase
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ChatGPT
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

hELLO ยท Designed By ์ •์ƒ์šฐ.
Jiwon()
[TIL] ๊ธฐ์ˆ ๋ฉด์ ‘ ์งˆ๋ฌธ ์ •๋ฆฌ - ๋ฒ„์ธ„์–ผ ๋”/๋ฆฌ์–ผ ๋”, useRef
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.