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
  • kudu
  • react19
  • usetransition
  • javascript wss
  • react
  • Spring WebSocket
  • javasciprt websocket
  • docker tomcat
  • HIVE
  • websocket
  • websocket server
  • react loading
  • react websocket
  • react typescript
  • react spring websocket
  • jest
  • react usetransition
  • node WebSocket
  • react jest

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
arkhyeon

arkhyeon

React

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

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

예제 코드: useTransition을 사용한 비동기 상태 업데이트

1. App.jsx

import { useState, useTransition } from "react";
import Item from "./Item.jsx";
import Total from "./Total.jsx";
import { updateQuantity } from "./data.js";

function App() {
  const [quantity, setQuantity] = useState(1);
  const [isPending, startTransition] = useTransition();

  const updateQuantityAction = async (newQuantity) => {
    startTransition(async () => {
      const savedQuantity = await updateQuantity(newQuantity);
      startTransition(() => {
        setQuantity(savedQuantity);
      });
    });
  };

  return (
    <div className="min-h-screen bg-gray-100 p-6">
      <h1>Checkout</h1>
      <Item action={updateQuantityAction} />
      <hr />
      <Total quantity={quantity} isPending={isPending} />
    </div>
  );
}

export default App;

왜 useTransition 두 번 사용했는가?

  • 한 번 : 서버 요청이 오래 걸릴 경우, 요청 중간에 발생한 모든 상태 변경이 순차적으로 UI에 반영되면서 깜박일 수 있습니다.
  • 두 번 : 요청 중간에 상태 변경이 UI에 반영되지 않고, 마지막 요청 결과만 UI에 반영되므로 여러 번 요청이 발생하거나 서버 요청이 오래 걸리는 경우 더 안정적이고 UI가 깔끔하게 유지됩니다.

2. Item.jsx

export default function Item({ action }) {
  const handleChange = (event) => {
    const newValue = Number(event.target.value);
    action(newValue);
  };

  return (
    <div className="item">
      <span>Eras Tour Tickets</span>
      <label htmlFor="name">Quantity: </label>
      <input type="number" onChange={handleChange} defaultValue={1} min={1} />
    </div>
  );
}

3. Total.jsx

const intl = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
});

export default function Total({ quantity, isPending }) {
  return (
    <div className="total">
      <span>Total:</span>
      <span>
        {isPending ? "🌀 Updating..." : `${intl.format(quantity * 9999)}`}
      </span>
    </div>
  );
}

4. data.js

export async function updateQuantity(newQuantity) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(newQuantity);
    }, 2000);
  });
}
  • startTransition 함수는 updateQuantity 비동기 함수와 setQuantity 상태 업데이트를 래핑하여 낮은 우선순위로 실행합니다.
  • isPending 상태는 useTransition의 상태로, 비동기 작업이 진행 중임을 표시합니다. 이로 인해 사용자는 상태 변경이 진행 중인 동안에도 다른 UI와 상호작용할 수 있습니다.

일반 이벤트와 React 19 useTransition 활용 차이점

  • 일반 : 빠르게 여러 번 업데이트하면, 각 요청마다 즉시 여러번 업데이트 되므로 UI 깜빡입니다.
  • React19 : 빠르게 여러 번 업데이트하더라도 깜빡이지 않고 최종 요청이 완료된 후에 반영됩니다. 요청이 진행되는 동안에도 계속 업데이트할 수 있습니다.
728x90
반응형

'React' 카테고리의 다른 글

React Suspense와 use로 빈 데이터 문제 해결하기  (0) 2025.01.10
React 19 useTransition을 활용한 Axios 데이터 로딩과 상태 업데이트  (0) 2025.01.10
React 19 useTransition vs React 18 pending 처리 : 로딩 상태 관리의 차이점  (0) 2024.12.31
[React19] React 19 ref와 React 18 forwardRef 비교  (0) 2024.12.31
Unrecognized extension value in extension set ([object Object]).  (0) 2024.06.18
    'React' 카테고리의 다른 글
    • React Suspense와 use로 빈 데이터 문제 해결하기
    • React 19 useTransition을 활용한 Axios 데이터 로딩과 상태 업데이트
    • React 19 useTransition vs React 18 pending 처리 : 로딩 상태 관리의 차이점
    • [React19] React 19 ref와 React 18 forwardRef 비교
    arkhyeon
    arkhyeon

    티스토리툴바