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)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
arkhyeon

arkhyeon

React

useDeferredValue 와 useTransition 차이

2025. 1. 13. 14:29
728x90
반응형
useDeferredValue는 상태 값의 지연 렌더링을 처리하고 useTransition은 함수 실행과 연관된 작업들을 비동기적으로 처리합니다. React의 비동기 렌더링 기능 을 활용하여 성능 최적화와 사용자 경험 개선에 기여합니다.

1. useDeferredValue

  • 상태 값(state)의 업데이트를 지연시킵니다.
  • 사용 사례: 상태 값이 즉시 변경되더라도, 비동기 작업이 완료될 때까지 렌더링을 지연 처리하고 싶을 때 사용합니다.
  • 작동 방식:
    • 특정 상태 값이 실제 값보다 늦게 업데이트되도록 만들어 렌더링을 지연시킵니다.
    • React의 비동기 렌더링을 활용하여 성능을 최적화합니다.

컴포넌트 로딩 구현

import { Suspense, useState, useDeferredValue } from 'react';

export default function App() {
  const [query, setQuery] = useState('');
  const deferredQuery = useDeferredValue(query);
  const isStale = query !== deferredQuery;
  
  return (
    <>
      <input value={query} onChange={e => setQuery(e.target.value)} />
      <Suspense fallback={<h2>Loading...</h2>}>
        <div style={{
          opacity: isStale ? 0.5 : 1,
          transition: isStale ? 'opacity 0.2s 0.2s linear' : 'opacity 0s 0s linear'
        }}>
          <SearchResults query={deferredQuery} />
        </div>
      </Suspense>
    </>
  );
}
import { use } from "react";
import { fetchData } from "./data.js";

export default function SearchResults({ query }) {
  if (query === "") {
    return null;
  }
  const albums = use(fetchData(`/search?q=${query}`));
  if (albums.length === 0) {
    return (
      <p>
        No matches for <i>"{query}"</i>
      </p>
    );
  }
  return (
    <ul>
      {albums.map((album) => (
        <li key={album.id}>
          {album.title} ({album.year})
        </li>
      ))}
    </ul>
  );
}

입력 지연 없이 느린 컴포넌트 최적화하기

import { useState, useDeferredValue } from 'react';
import SlowList from './SlowList.js';

export default function App() {
  const [text, setText] = useState('');
  const deferredText = useDeferredValue(text);
  return (
    <>
      <input value={text} onChange={e => setText(e.target.value)} />
      <SlowList text={deferredText} />
    </>
  );
}
import { memo } from 'react';

const SlowList = memo(function SlowList({ text }) {

  let items = [];
  for (let i = 0; i < 250; i++) {
    items.push(<SlowItem key={i} text={text} />);
  }
  return (
    <ul className="items">
      {items}
    </ul>
  );
});

function SlowItem({ text }) {
  let startTime = performance.now();
  while (performance.now() - startTime < 1) {
    // Do nothing for 1 ms per item to emulate extremely slow code
  }

  return (
    <li className="item">
      Text: {text}
    </li>
  )
}

export default SlowList;
  • 결과:
    • inputValue는 입력 즉시 업데이트됩니다.
    • deferredValue는 렌더링이 지연되어, 더 복잡한 작업이나 성능 최적화가 필요한 경우 유용합니다.

2. useTransition

  • 함수 실행을 지연시켜 비동기 작업으로 처리합니다.
  • 사용 사례: 상태 업데이트나 함수 실행이 복잡하여, **사용자 경험(UX)**에 부정적인 영향을 주는 경우 지연 처리를 통해 부드러운 사용자 경험을 제공할 때 사용합니다.
  • 작동 방식:
    • React가 업데이트를 비차단(non-blocking) 작업으로 처리하도록 요청합니다.
    • UI의 로딩 상태를 표시하는 데 유용합니다.
import { useState, useTransition } from "react";

export default function App() {
  const [list, setList] = useState([]);
  const [isPending, startTransition] = useTransition();

  const handleClick = () => {
    startTransition(() => {
      // 큰 데이터 배열을 생성 및 업데이트
      const newList = Array(5000).fill(0).map((_, i) => i);
      setList(newList);
    });
  };

  return (
    <div>
      <button onClick={handleClick} disabled={isPending}>
        {isPending ? "Loading..." : "Update List"}
      </button>
      <ul>
        {list.map((item) => (
          <li key={item}>{item}</li>
        ))}
      </ul>
    </div>
  );
}
  • 결과:
    • handleClick 실행 시 큰 데이터를 업데이트하는 동안 UI가 블록되지 않고 로딩 상태를 보여줍니다.

3. 주요 차이점

기능  useDeferredValue  useTransition
작동 대상 상태 값 (state) 함수 실행 (상태 업데이트 포함)
지연 처리 방식 상태 값의 업데이트를 지연 함수 실행과 관련된 상태 업데이트를 비동기로 처리
주요 목적 상태 값이 변경될 때 렌더링 최적화 복잡한 함수나 상태 업데이트의 부드러운 실행
사용 사례 느린 렌더링 최적화, 값 지연 반영 성능 비용이 큰 업데이트, 로딩 상태 표시

 

 

React 19의 useTransition을 활용한 비동기 상태 업데이트와 UI 반응성 향상

useTransition 은 시간이 걸리는 비동기 작업(예: 데이터 요청, 상태 업데이트)을 낮은 우선순위로 처리하여 UI가 멈추지 않고 계속 반응하여 사용자 경험을 향상시킬 수 있습니다.예제 코드: useTransit

arkhyeon.tistory.com

 

React 19 useTransition을 활용한 Axios 데이터 로딩과 상태 업데이트

useTransition 은 시간이 걸리는 비동기 작업(예: 데이터 요청, 상태 업데이트)을 낮은 우선순위로 처리하여 UI가 멈추지 않고 계속 반응하여 사용자 경험을 향상시킬 수 있습니다.예제 코드: useTransit

arkhyeon.tistory.com

 

728x90
반응형

'React' 카테고리의 다른 글

React 19 Data Caching (map, React Query, swr)  (0) 2025.01.13
React Suspense와 use로 빈 데이터 문제 해결하기  (0) 2025.01.10
React 19 useTransition을 활용한 Axios 데이터 로딩과 상태 업데이트  (0) 2025.01.10
React 19의 useTransition을 활용한 비동기 상태 업데이트와 UI 반응성 향상  (0) 2025.01.09
React 19 useTransition vs React 18 pending 처리 : 로딩 상태 관리의 차이점  (0) 2024.12.31
    'React' 카테고리의 다른 글
    • React 19 Data Caching (map, React Query, swr)
    • React Suspense와 use로 빈 데이터 문제 해결하기
    • React 19 useTransition을 활용한 Axios 데이터 로딩과 상태 업데이트
    • React 19의 useTransition을 활용한 비동기 상태 업데이트와 UI 반응성 향상
    arkhyeon
    arkhyeon

    티스토리툴바