250x250
๋ฐ˜์‘ํ˜•
arkhyeon
arkhyeon
arkhyeon
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (88)
    • Spring (5)
    • Java (4)
    • React (25)
      • TypeScript (6)
      • JavaScript (1)
      • Jest (9)
    • NEXT (8)
    • SQL (1)
    • React native (1)
    • CSS (3)
    • Web (1)
    • Git (3)
    • ETC (6)
    • ๋น…๋ฐ์ดํ„ฐDB (8)
    • Docker (4)
    • Tool (1)

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

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

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

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • WSS
  • node WebSocket
  • Spring WebSocket
  • jest
  • react19
  • react websocket
  • HIVE
  • react usetransition
  • docker tomcat
  • usetransition
  • react
  • react loading
  • react spring websocket
  • websocket
  • javasciprt websocket
  • kudu
  • javascript wss
  • websocket server
  • react typescript
  • react jest

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

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
arkhyeon

arkhyeon

React

[React19] React 19 ref์™€ React 18 forwardRef ๋น„๊ต

2024. 12. 31. 10:16
728x90
๋ฐ˜์‘ํ˜•
๐Ÿ’กReact๋Š” ์ปดํฌ๋„ŒํŠธ์˜ DOM ์ฐธ์กฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ref๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. React 18๊ณผ 19 ๋ฒ„์ „์—์„œ forwardRef์™€ ref์˜ ์‚ฌ์šฉ ๋ฐฉ์‹์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๊ฐ ๋ฒ„์ „์˜ ์ฃผ์š” ํŠน์ง•์„ ์„ค๋ช…ํ•˜๊ณ , ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ฐจ์ด์ ์„ ๋ช…ํ™•ํžˆ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

React 18์˜ forwardRef

ํŠน์ง•

  1. forwardRef๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ถ€๋ชจ๊ฐ€ ์ „๋‹ฌํ•œ ref๋ฅผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ DOM ์š”์†Œ์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  2. ์ฃผ๋กœ HOC(High-Order Component) ๋˜๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  3. React 18์—์„œ๋Š” ref๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด React.forwardRef๋กœ ๊ฐ์‹ธ์•ผ ํ•˜๋ฉฐ, ์ด ๊ณผ์ •์—์„œ ๋ฐ˜๋“œ์‹œ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ref๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

import React, { forwardRef, useRef } from 'react';

const InputComponent = forwardRef((props, ref) => {
  return <input {...props} ref={ref} />;
});

function App() {
  const inputRef = useRef(null);

  const focusInput = () => {
    if (inputRef.current) {
      inputRef.current.focus();
    }
  };

  return (
    <div>
      <InputComponent ref={inputRef} placeholder="Type here..." />
      <button onClick={focusInput}>Focus Input</button>
    </div>
  );
}

export default App;

์„ค๋ช…

  • InputComponent๋Š” forwardRef๋ฅผ ์‚ฌ์šฉํ•ด ref๋ฅผ input DOM ์š”์†Œ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ App์—์„œ useRef๋กœ inputRef๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ InputComponent์— ์ „๋‹ฌํ•˜์—ฌ DOM ์ฐธ์กฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

React 19์˜ ref

ํŠน์ง•

  1. React 19์—์„œ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์— ์ง์ ‘ ref๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  2. ์ด์ œ forwardRef ์—†์ด๋„ ref๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. React๊ฐ€ ์ž๋™์œผ๋กœ ref๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•ด์ง‘๋‹ˆ๋‹ค.

์˜ˆ์ œ

import React, { useRef } from 'react';

const InputComponent = React.memo((props) => {
  return <input {...props} />;
});

function App() {
  const inputRef = useRef(null);

  const focusInput = () => {
    if (inputRef.current) {
      inputRef.current.focus();
    }
  };

  return (
    <div>
      <InputComponent ref={inputRef} placeholder="Type here..." />
      <button onClick={focusInput}>Focus Input</button>
    </div>
  );
}

export default App;

์„ค๋ช…

  • InputComponent๋Š” ๋ณ„๋„์˜ forwardRef ์—†์ด๋„ ref๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • React 19์—์„œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ref๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€ ์„ค์ • ์—†์ด๋„ DOM ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ์ฐจ์ด์ 

ํŠน์ง• React 18 React 19

forwardRef ํ•„์š” ์—ฌ๋ถ€ ํ•„์š” ๋ถˆํ•„์š”
์ฝ”๋“œ ๊ฐ„๊ฒฐ์„ฑ ๋น„๊ต์  ๋ณต์žกํ•จ ๋” ๊ฐ„๊ฒฐํ•จ
DOM ์ฐธ์กฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ๋ช…์‹œ์ ์œผ๋กœ forwardRef๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ React๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ž๋™ ์ฒ˜๋ฆฌ
๊ธฐ์กด ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ ๋ณ„๋„์˜ ์—…๋ฐ์ดํŠธ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ React 19๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ด์•ผ ํ™œ์šฉ ๊ฐ€๋Šฅ

๊ฒฐ๋ก 

React 19์˜ ์ƒˆ๋กœ์šด ref ๊ธฐ๋Šฅ์€ ์ฝ”๋“œ ๊ฐ„๊ฒฐ์„ฑ๊ณผ ์‚ฌ์šฉ ํŽธ์˜์„ฑ์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „์—์„œ forwardRef๋ฅผ ์‚ฌ์šฉํ•ด ์ž‘์„ฑํ–ˆ๋˜ ์ฝ”๋“œ๊ฐ€ ๋งŽ๋‹ค๋ฉด, React 19๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ›„ ๋” ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ๋กœ ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, forwardRef๋ฅผ ์ด์šฉํ•œ ๊ณ ๊ธ‰ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ์€ ์—ฌ์ „ํžˆ ์œ ํšจํ•˜๋ฏ€๋กœ, ํ•„์š”์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜์„ธ์š”.

728x90
๋ฐ˜์‘ํ˜•

'React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

React 19์˜ useTransition์„ ํ™œ์šฉํ•œ ๋น„๋™๊ธฐ ์ƒํƒœ ์—…๋ฐ์ดํŠธ์™€ UI ๋ฐ˜์‘์„ฑ ํ–ฅ์ƒ  (0) 2025.01.09
React 19 useTransition vs React 18 pending ์ฒ˜๋ฆฌ : ๋กœ๋”ฉ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ฐจ์ด์   (0) 2024.12.31
Unrecognized extension value in extension set ([object Object]).  (0) 2024.06.18
React Labs React 19 - Memoization, useFormState  (0) 2024.03.21
Yarn 4.0 Update .yarnrc.yml npmRegistryServer ์„ค์ •  (0) 2024.03.12
    'React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • React 19์˜ useTransition์„ ํ™œ์šฉํ•œ ๋น„๋™๊ธฐ ์ƒํƒœ ์—…๋ฐ์ดํŠธ์™€ UI ๋ฐ˜์‘์„ฑ ํ–ฅ์ƒ
    • React 19 useTransition vs React 18 pending ์ฒ˜๋ฆฌ : ๋กœ๋”ฉ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ฐจ์ด์ 
    • Unrecognized extension value in extension set ([object Object]).
    • React Labs React 19 - Memoization, useFormState
    arkhyeon
    arkhyeon

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