jtwjs Dev Wiki
  • DEV_ROAD
    • πŸ’ͺ🏻 μƒμ‘΄ν•˜κΈ°
    • Week 1
      • 개발 ν™˜κ²½ μ„ΈνŒ…
      • νƒ€μž…μŠ€ν¬λ¦½νŠΈ
      • λ¦¬μ—‘νŠΈ
      • Testing Library
      • Parcel & ESLint
    • Week 2
      • JSX
      • Virtual DOM
    • Week 3
      • React Component
      • React State
    • Week 4
      • Express
      • Fetch API & CORS
      • React Hook
      • useRef & Custom Hook
    • Week 5
      • TDD
      • React Testing Library
      • MSW
      • Playwrite
      • Snapshot
    • Week 6
      • Separtion of Concerns
      • Principle
      • DI, (Dependency Injection)
      • Reflect-metadata
      • TSyringe
      • External Store
      • Follow Redux
      • usestore-ts
      • useSyncExternalStore
    • Week 7
      • Routing
      • Routes
      • Router
      • Navigation
    • Week 8
      • Design System
      • Style Basics
      • CSS-in-JS
      • Styled-Components
      • Global Style & Theme
    • Week 9
      • κ°œλ°œν•˜κΈ° μ „ μ€€λΉ„
      • μƒν’ˆ λͺ©λ‘ νŽ˜μ΄μ§€
      • μƒν’ˆ 상세 νŽ˜μ΄μ§€
      • μž₯λ°”κ΅¬λ‹ˆ νŽ˜μ΄μ§€
    • Week 10
      • 둜그인
      • λ‘œκ·Έμ•„μ›ƒ
      • νšŒμ›κ°€μž…
      • μ£Όλ¬Έ λͺ©λ‘ & μ£Όλ¬Έ 상세
    • Week 11
      • 배솑 정보 μž…λ ₯
      • ν¬νŠΈμ› 결제 μš”μ²­
      • 배솑 및 결제 정보 전달
    • Week 12
      • κ΄€λ¦¬μž μ›Ήμ‚¬μ΄νŠΈκ°œλ°œμ‹œμž‘
  • DEV_NOTE
    • TypeScript
      • 기본적 문법
        • Enum
        • λ‹€ν˜•μ„±
          • Untitled
        • ꡬ쑰적 타이핑
        • μ œλ„ˆλ¦­ νƒ€μž…
        • 컨디셔널 νƒ€μž…
        • ν•¨μˆ˜ λ©”μ„œλ“œ 타이핑
        • infer둜 νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ μΆ”λ‘  직접 ν™œμš©
        • μž¬κ·€ νƒ€μž…
        • ν…œν”Œλ¦Ώ λ¦¬ν„°λŸ΄ νƒ€μž…
        • 좔가적인 νƒ€μž… 검사 satisfies μ—°μ‚°μž
        • νƒ€μž…μŠ€ν¬λ¦½νŠΈ 건망증
        • μ›μ‹œ μžλ£Œν˜•μ—λ„ λΈŒλžœλ”© 기법 μ‚¬μš© κ°€λŠ₯
        • νƒ€μž… 쒁히기
        • μœ μš©ν•œ νƒ€μž… λ§Œλ“€κΈ°
        • λ°μ½”λ ˆμ΄ν„° ν•¨μˆ˜
        • μ•°λΉ„μ–ΈνŠΈ 선언도 μ„ μ–Έ 병합이 λœλ‹€.
        • μ•°λΉ„μ–ΈνŠΈ 선언도 선언병합이 λœλ‹€.
    • Testing
      • Unit Testing
      • λ‹¨μœ„ ν…ŒμŠ€νŠΈμ˜ 두 λΆ„νŒŒ
      • 쒋은 λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό κ΅¬μ„±ν•˜λŠ” 4λŒ€ μš”μ†Œ
      • ν…ŒμŠ€νŠΈ λŒ€μ—­κ³Ό 식별할 수 μžˆλŠ” λ™μž‘
      • λ‹¨μœ„ ν…ŒμŠ€νŠΈ μŠ€νƒ€μΌ
      • κ°€μΉ˜ μžˆλŠ” λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ λ¦¬νŒ©ν† λ§
      • 톡합 ν…ŒμŠ€νŠΈ
      • Cross Browsing Testing
      • κΈ°λŠ₯ ν…ŒμŠ€νŠΈ μ’…λ₯˜
      • React Testing Pattern
      • ν”„λ‘ νŠΈμ—”λ“œ ν…ŒμŠ€νŠΈ μž…λ¬Έ
        • ν…ŒμŠ€νŠΈ λ²”μœ„
        • λ‹¨μœ„ ν…ŒμŠ€νŠΈ 검증
        • Mock
        • UI μ»΄ν¬λ„ŒνŠΈ ν…ŒμŠ€νŠΈ
        • ν…ŒμŠ€νŠΈ 컀버리지
        • μ›Ή 톡합 ν…ŒμŠ€νŠΈ
        • MSW
        • μŠ€ν† λ¦¬λΆ
        • μ‹œκ°μ  νšŒκ·€ ν…ŒμŠ€νŠΈ
        • E2E ν…ŒμŠ€νŠΈ
        • Github Actions μ„€μ •
        • κΉƒν—ˆλΈŒ μ•‘μ…˜μ—μ„œ E2E
      • μ‹œν”„νŠΈ λ ˆν”„νŠΈ
        • ν…ŒμŠ€νŠΈ κΈ°λ³Έμ€‘μ˜ κΈ°λ³Έ
        • λ‹¨μœ„ ν…ŒμŠ€νŠΈ
        • μ½”λ“œ λ³΅μž‘λ„
        • λ¦¬νŒ©ν„°λ§
        • μ½”λ“œ 리뷰
        • 톡합 ν…ŒμŠ€νŠΈ νŒ¨ν„΄
        • μ‹œμŠ€ν…œ ν…ŒμŠ€νŠΈμ˜ μžλ™ν™”
        • 탐색적 ν…ŒμŠ€νŠΈ
      • Test Tip
      • vitest
      • playwright
      • Test Data Generator
      • MSW
    • Algorithm
      • coding test
      • Data Structure
    • Next.js
      • Data Fetching
      • Hydration
      • Next 13
      • Optimization
      • Next 15
    • Tailwind
      • Tailwind CSS
      • Theme
      • Directives
      • Tool
      • Design System
    • Storybook
      • Storybook
      • CSF3
      • CDD
      • Headless Component
    • Funtional Programming
      • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°
      • μ°Έμ‘° 투λͺ…μ„±
      • λΆ€μˆ˜νš¨κ³Ό
      • ν•¨μˆ˜ ν•©μ„±
      • μ œλ„ˆλ¦­ νƒ€μž… ν™œμš©ν•˜κΈ°
      • 암묡적 μž…μΆœλ ₯
      • μ•‘μ…˜κ³Ό 계산, 데이터
      • κ³„μΈ΅ν˜• 섀계
      • 호좜 κ·Έλž˜ν”„
      • ν•¨μˆ˜ν˜• 섀계
      • λΆˆλ³€μ„±
      • 일급 ν•¨μˆ˜
      • ν•¨μˆ˜ν˜• 도ꡬ
    • Git
      • Github Actions
      • Conflict
      • Branch μ „λž΅
    • Contents Format
      • Audio
    • 3D Graphic
      • 3D keyword
      • Three.js
      • Geometry
      • Material
      • Light
      • Camera
      • Decal
      • Rotation
      • Text
      • Shadow
      • Fog
      • Post Processing
      • Animation
      • Math
        • Vector Space
        • λ²‘ν„°μ˜ μ—°μ‚°
        • νšŒμ „ 계산
      • 3D 컨텐츠가 λ§Œλ“€μ–΄μ§€λŠ” κ³Όμ •
      • R3F
      • Env
      • Scene
      • Transform
      • R3F
      • Interaction & Raycast
      • Rendering Algorithnm
      • Blender
      • Blender
    • Accessibility
      • μ ‘κ·Όμ„±μ΄λž€
    • Interactive Web
      • Parallax
      • Canvas
      • requestAnimationFrame
      • Effect
      • HSL
      • React.js + Canvas
      • Matter.js
    • AWS
      • DevOps
      • Amplify
      • S3
      • ν΄λΌμš°λ“œ μ»΄ν“¨νŒ…
        • μ˜¨ν”„λ ˆλ―ΈμŠ€μ™€ ν΄λΌμš°λ“œ
        • ν΄λΌμš°λ“œ λ„μž…νš¨κ³Ό
        • ν΄λΌμš°λ“œ μ»΄ν“¨νŒ…μ˜ λ²”μœ„
        • μ»΄ν“¨νŒ… μ˜΅μ…˜
          • EC2 - Virtual Machin
          • ECS, EKS - Container
          • Lambda - Serverless
        • λ„€νŠΈμ›Œν¬ 가상화
        • μŠ€ν† λ¦¬μ§€
        • λ°μ΄ν„°λ² μ΄μŠ€
        • 데이터 μˆ˜μ§‘
        • λ¨Έμ‹  λŸ¬λ‹ μ˜μ—­
        • IoT μ˜μ—­
        • 블둝체인 μ˜μ—­
      • ν΄λΌμš°λ“œ μ•„ν‚€ν…μ²˜ 섀계
    • Network
      • Web Server & WAS
    • System Design
      • System Design
      • Component
      • μ˜μ‘΄μ„±μ„ λ°°μ œν•œ 개발
      • Error Handling
      • Architecture
        • λͺ¨λ…Έλ‘œν‹± μ•„ν‚€ν…μ²˜
        • Clean Architecture
        • Layered Architecture
        • 이벀트 기반 μ•„ν‚€ν…μ²˜
      • 상황을 νŒŒμ•…ν•˜λŠ” 메타인지
      • 쀑볡 문제 ν•΄κ²°ν•˜κΈ°
      • Monorepo Arhitecture
        • λͺ¨λ…Έλ ˆν¬ 운영과 νŠΈλŸ¬λΈ”μŠˆνŒ…
        • Module Federation
      • μ½”λ“œ 병λͺ©μ§€μ 
      • API λŒ€μ‘
      • 곡톡 μ½”λ“œ
      • Infra ꡬ좕
      • λͺ¨λ“ˆ 기반의 개발 방식
      • Design System
        • μ΅œμ†Œ μˆ˜μ€€μ˜ μ•„ν‚€ν…μ²˜ μ„€μ •
        • 더 효율적인 λ””μžμΈμ‹œμŠ€ν…œ λ§Œλ“€κΈ°
        • λ””μžμΈ μ‹œμŠ€ν…œκ³Ό UI 라이브러리 λͺ©μ 
        • λ””μžμΈ 토큰
      • 효율적인 업무
        • 업무 ν”„λ‘œμ„ΈμŠ€ 병λͺ© νŒŒμ•…
      • Clean Code
      • Design Pattern
        • CQRS Pattern
        • Strangler Fig Pattern
        • λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄
        • μ»€λ§¨λ“œ νŒ¨ν„΄
        • μ „λž΅ νŒ¨ν„΄
        • μ˜΅μ €λ²„ νŒ¨ν„΄
      • A/B ν…ŒμŠ€νŒ…
      • λŒ€κ·œλͺ¨ λ¦¬μ—‘νŠΈ μ›Ήμ•± 개발
        • λ³΅μž‘μ„± 관리
        • λͺ¨λ“ˆμ„±
        • μ„±λŠ₯
        • λ””μžμΈ μ‹œμŠ€ν…œ
        • 데이터 패칭
        • μƒνƒœ 관리
        • κ΅­μ œν™”
        • μ½”λ“œ μ‘°μ§ν™”ν•˜κΈ°
        • κ°œμΈν™” A/B ν…ŒμŠ€νŒ…
        • ν™•μž₯ κ°€λŠ₯ν•œ μ›Ή μ•„ν‚€ν…μ²˜
        • ν…ŒμŠ€νŒ…
        • 툴링
        • 기술적 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜
        • νƒ€μž…μŠ€ν¬λ¦½νŠΈ
        • λΌμš°νŒ…
        • μ‚¬μš©μž 쀑심 API λ””μžμΈ
        • λ¦¬μ•‘νŠΈ 미래
    • Performance
      • React DevTools
      • Component μ΅œμ ν™”
      • Page Load
      • API
    • MFA
      • MSA
      • MFA λ„μž…ν•˜κΈ°
      • Monorepo
        • Monorepo Tool
        • Yarn Berry Workspace
        • Turborepo
      • MFA Composition
      • SPA 톡합
      • Design System
      • Package Manager
        • Yarn
        • pnpm
      • Transpiler & Bundler
        • Babel
        • Rollup
        • esbuild
        • swc
        • Webpack
        • Vite
      • 뢄해와 톡합을 μœ„ν•œ μ—¬λŸ¬ 기술 비ꡐ
    • State Management
      • Zustand
    • React v18
      • Automatic batching
      • Suspense
      • Transition
    • SEO
      • Search Engine Optimization
      • Open Graph Element
      • Metadata
    • FE Develop
      • Scrubbing
      • Clipboard
    • Refactoring
      • λ¦¬νŒ©ν† λ§ 깊게 듀여닀보기
      • κΈ΄ μ½”λ“œ 쑰각내기
      • νƒ€μž… μ½”λ“œ μ²˜λ¦¬ν•˜κΈ°
      • μœ μ‚¬ν•œ μ½”λ“œ μœ΅ν•©ν•˜κΈ°
      • 데이터 보호
      • μ½”λ“œ μΆ”κ°€ 및 제거
    • OAuth 2.0
    • Analytics
      • Mixpanel
    • ETC
      • VSCode
    • React Hook In Action
      • useContext & Provider
      • μ»€μŠ€ν…€ ν›…
      • μ½”λ“œ λΆ„ν• ν•˜κΈ° with Suspense, lazy
      • Suspense와 이미지 μ μž¬ν•˜κΈ°
      • useTransition, uesDeferredValue
      • SuspenseList
Powered by GitBook
On this page
  • λ™μ‹œμ„± λͺ¨λ“œ
  • λ™μ‹œμ„± λ Œλ”λ§
  • useTransition, useDeferredValue ν›…
  • useTransition을 μ‚¬μš©ν•΄ 후퇴 μƒνƒœ ν”Όν•˜κΈ°
  • isPending을 μ‚¬μš©ν•΄ μ‚¬μš©μžμ—κ²Œ ν”Όλ“œλ°± μ œκ³΅ν•˜κΈ°
  • useDeferredValue둜 이전값 μœ μ§€ν•˜κΈ°
  1. DEV_NOTE
  2. React Hook In Action

useTransition, uesDeferredValue

PreviousSuspense와 이미지 μ μž¬ν•˜κΈ°NextSuspenseList

Last updated 4 months ago

  • useTransition 훅을 μ‚¬μš©ν•΄ UI 갱신을 μ§€μ—°μ‹œν‚€λŠ” 방법

  • isPending 뢈린 값을 μ‚¬μš©ν•΄ 일관성 μ—†λŠ” μƒνƒœμ™€ UI에 λŒ€ν•œ ν”Œλž˜κ·Έλ₯Ό λ‚¨κΈ°λŠ” 방법

  • useDefferedValue 훅을 μ‚¬μš©ν•΄ μ˜ˆμ „ κ°’κ³Ό μƒˆλ‘œμš΄ 값을 λ™μ‹œμ— μ‚¬μš©ν•˜λŠ” 방법

  • SuspenseList μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‚¬μš©ν•΄ μ—¬λŸ¬ 폴백 UIλ₯Ό κ΄€λ¦¬ν•˜λŠ” 방법

  • λ™μ‹œμ„± λ Œλ”λ§μ΄ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯ μ΄ν•΄ν•˜κΈ°

Ref

λ™μ‹œμ„± λͺ¨λ“œ

  • λ™μ‹œμ„± λͺ¨λ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λ¦¬μ•‘νŠΈκ°€ λ™μ‹œμ— μ—¬λŸ¬ λ²„μ „μ˜ UIλ₯Ό λ©”λͺ¨λ¦¬μ—μ„œ λ Œλ”λ§ν•˜κ³  ν˜„μž¬ μƒνƒœμ— κ°€μž₯ μ ν•©ν•œ λ²„μ „λ§Œ DOM에 κ°±μ‹ ν•œλ‹€.

  • ν˜„μž¬ μƒνƒœμ˜ 갱신이 μ™„λ£Œλ  λ•ŒκΉŒμ§€ μ‹œκ°„μ΄ 걸렀도 이전 λ²„μ „μ˜ UIλ₯Ό DOM에 ν‘œμ‹œ κ°€λŠ₯

  • μš°μ„ μˆœμœ„κ°€ 더 높은 κ°±μ‹ (μ‚¬μš©μž μΈν„°λ ‰μ…˜)이 μ΄λ€„μ§€λŠ” λ™μ•ˆ λ¦¬μ•‘νŠΈκ°€ λ Œλ”λ§μ„ μΌμ‹œμ€‘λ‹¨ κ°€λŠ₯

  • 이런 μœ μ—°μ„±μ€ μ•±μ˜ λ°˜μ‘μ„±μ„ μœ μ§€ν•˜κ³  μ‚¬μš©μžκ°€ μΈμ§€ν•˜λŠ” μ•±μ˜ μ„±λŠ₯을 κ°œμ„ ν•˜λŠ”λ° 도움이 λœλ‹€.

λ™μ‹œμ„± λͺ¨λ“œλŠ” μ½”λ“œ, 데이터, μžμ›μ„ 더 μ˜λ„μ μœΌλ‘œ λͺ…ν™•νžˆ λͺ©ν‘œλ₯Ό μ •ν•΄ μ μž¬ν• μˆ˜ 있게 ν•΄μ£Όλ©° μ„œλ²„ μΈ‘ λ Œλ”λ§κ³Ό ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ μ»΄ν¬λ„ŒνŠΈμ˜ μˆ˜ν™”λ₯Ό λ”μš± μ›ν™œν•˜κ²Œ ν†΅ν•©ν•΄μ„œ μ»΄ν¬λ„ŒνŠΈκ°€ μ‚¬μš©μžμ™€ μ μ‹œμ— μƒν˜Έμž‘μš© ν•  수 μžˆλ„λ‘ μžμ›μ„ μ£Όμž…ν•  수 있게 ν•΄μ€Œ

λ™μ‹œμ„± λ Œλ”λ§

λ¦¬μ—‘νŠΈκ°€ ν•œ λ²ˆμ— μ—¬λŸ¬ λ²„μ „μ˜ UIμ—μ„œ μž‘λ™ν•˜κ²Œ ν•˜λŠ”λ°, μƒˆ 버전이 쀀비될 λ•ŒκΉŒμ§€ μ™„μ „νžˆ μƒν˜Έμž‘μš©ν•  수 μžˆλŠ” 이전 버전을 ν‘œμ‹œν•œλ‹€.

  • 즉, λ‹¨κΈ°μ μœΌλ‘œ μ΅œμ‹  μƒνƒœκ°€ λΈŒλΌμš°μ €μ˜ ν˜„μž¬ UI와 μΌμΉ˜ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€λŠ” 뜻

  • λ™μ‹œμ„± λͺ¨λ“œλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ 앱이 μ΄ˆκΈ°μ— λΈŒλΌμš°μ €μ— λ Œλ”λ§λ˜λŠ” 방식을 λ³€κ²½ν•΄μ•Ό ν•œλ‹€.

// React ν•œμ •
const root = document.getElementById('root');
ReactDOM.createRoot(root).render(<App />);

λͺ©ν‘œλŠ” μ•±μ˜ μ‚¬μš©μž κ²½ν—˜μ„ ν–₯μƒν•˜κ³  앱이 더 λ°˜μ‘μ μœΌλ‘œ λŠκ»΄μ§€κ²Œ λ§Œλ“€κ³ , 갱신을 μ‘°μœ¨ν•΄ μ‚¬μš©μžκ°€ 무엇이 였래됐고 무엇이 κ°±μ‹  쀑이며 무엇이 μ΅œμ‹  λ‚΄μš©μΈμ§€ μ¦‰μ‹œ 이해할 수 있게 ν•˜λŠ”κ²ƒ

useTransition, useDeferredValue ν›…

μ»΄ν¬λ„ŒνŠΈκ°€ μƒˆ 데이터λ₯Ό μ μž¬ν•˜κ±°λ‚˜ μƒˆ 값을 κ³„μ‚°ν•˜λŠ” λ™μ•ˆ λ¦¬μ•‘νŠΈκ°€ 이전 UIλ‚˜ 이전 값을 계속 ν‘œμ‹œν•˜λ„λ‘ ν—ˆμš©

  • 후퇴 μƒνƒœ(receded state)λ₯Ό λ°©μ§€ν•˜λŠ”λ° 도움이 되기 λ•Œλ¬Έ

    • λ¦¬μ—‘νŠΈκ°€ μœ μš©ν•˜κ³  μƒν˜Έμž‘μš©μ΄ κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ΄μ „μ˜ 적재 쀑 μƒνƒœλ‘œ(μ‹€μˆ˜λ‘œ) μ „ν™˜ν•˜λŠ” 경우 이λ₯Ό 비정상적인 μƒνƒœλΌκ³  말함

    • ex: μ‚¬μš©μž λͺ©λ‘μ—μ„œ μƒˆλ‘œμš΄ μ‚¬μš©μžλ₯Ό μ„ νƒν•˜λ©΄ μ‚¬μš©μž 상세 정보 νŒ¨λ„μ„ μŠ€ν”Όλ„ˆλ‘œ λŒ€μ²΄ν•œλ‹€. μ΄λŠ” μ΄μ „μœΌλ‘œ λ˜λŒμ•„κ°€λŠ” λŠλ‚Œμ΄ λ“€κΈ° λ•Œλ¬Έμ— μ•½κ°„ 좩격적, 이런 μƒνƒœλ₯Ό 후퇴 μƒνƒœλΌ λΆ€λ₯Έλ‹€.

    • μ›μΉ˜ μ•ŠλŠ” λ‘œλ”©μ„ ν‘œμ‹œ X

useTransition을 μ‚¬μš©ν•΄ 후퇴 μƒνƒœ ν”Όν•˜κΈ°

μŠ€ν”Όλ„ˆλ‘œ λ‹€μ‹œ λŒμ•„κ°€μ§€ μ•Šκ³  이전 UI 정보λ₯Ό 계속 ν‘œμ‹œ "startTransition은 UIλ₯Ό Blocking μ•Šκ³  μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•  수 있게 ν•΄μ€λ‹ˆλ‹€."

  • μƒνƒœ λ³€κ²½μœΌλ‘œ 인해 ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈκ°€ μΌμ‹œμ€‘λ‹¨λ  λ•Œ λ¦¬μ—‘νŠΈκ°€ 이전 UIλ₯Ό ν‘œμ‹œν•  수 μžˆλ„λ‘ useTransition 훅을 μ‚¬μš©

const UserPage = () => {
  const [loggedInUser] = useUser();
  const [selectedUser, setSelectedUser] = useState(null);
  const user = selectedUser || loggedInUser;
  const queryClient = useQueryClient();
  const [startTransition] = useTransition(); // startTransition ν•¨μˆ˜ get
  
  const switchUser = (nextUser: User) => {
    startTransition(() => setSelectedUser(nextUser)); // μ‚¬μš©μž μƒνƒœ 변경을 μ „ν™˜μœΌλ‘œ 감쌈
    // queryClient.prefetchQuery('μ‚¬μš©μž 상세 정보 미리 μ½μ–΄μ˜€κΈ°');
    // queryClient.prefetchQuery('μ‚¬μš©μž 이미지 미리 μ½μ–΄μ˜€κΈ°');
  }
  
  return user 
    ? <Susepense fallback={<PageSpinner/>}>
        <UserDetails userID={user.id}/>
      </Suspense>
    : <PageSpinner />  
}
  • useTransition 훅은 ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈκ°€ μΌμ‹œμ€‘λ‹¨λ  수 μžˆλŠ” μƒνƒœ 변경을 κ°μŒ€ λ•Œ μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜κ°€ ν¬ν•¨λœ 배열을 λ°˜ν™˜

  • μƒˆ 데이터 μ μž¬μ— 였랜 μ‹œκ°„μ΄ κ±Έλ¦°λ‹€λ©΄, μ‚¬μš©μžκ°€ 이전 UIλ₯Ό λ³΄λ©΄μ„œ ν˜Όλž€μ— 빠질수 μžˆλ‹€.

    • λ”°λΌμ„œ 앱이 데이터λ₯Ό μ μž¬ν•˜λŠλΌ λ°”μ˜λ‹€λŠ” 사싀을 μ•Œλ €μ£ΌκΈ° μœ„ν•΄ λͺ‡κ°€μ§€ ν”Όλ“œλ°±μ„ μ œκ³΅ν•΄μ•Ό ν•œλ‹€.

const [startTransition] = useTransition();

μƒνƒœ λ³€κ²½ μ‹œ μŠ€ν”Όλ„ˆλ‘œ λ‹€μ‹œ λŒμ•„κ°€μ§€ μ•ŠλŠ” 것은 μƒˆλ‘œμš΄ μƒνƒœ 데이터에 μ μž¬μ— μ‹œκ°„μ΄ 였래 걸리지 μ•ŠλŠ” ν•œ κ°œμ„ μ΄λΌ ν•  수 μžˆλ‹€. (즉, μŠ€ν”Όλ„ˆ 찔끔 ν‘œμ‹œ 같은 상황)

isPending을 μ‚¬μš©ν•΄ μ‚¬μš©μžμ—κ²Œ ν”Όλ“œλ°± μ œκ³΅ν•˜κΈ°

useTransition 훅은 μƒνƒœκ°€ λ³€κ²½λ˜λŠ” λ™μ•ˆ λ¦¬μ•‘νŠΈκ°€ 이전 UIλ₯Ό ν‘œμ‹œν• μˆ˜μžˆκ²Œ ν•΄μ€€λ‹€. κ·ΈλŸ¬λ‚˜, μΌκ΄€λ˜μ§€ μ•Šμ€ UIκ°€ μ§€μ†λ˜λ©΄ ν˜Όλž€μ„ μœ λ°œν•  수 μžˆλ‹€. UIκ°€ 였래된 값을 계속 ν‘œμ‹œν•˜λ”λΌλ„ 변경이 λ°œμƒν•˜λŠ” μ€‘μž„μ„ μ‚¬μš©μžμ—κ²Œ μ•Œλ¦¬λŠ” λͺ‡ κ°€μ§€ ν”Όλ“œλ°±μ„ μ œκ³΅ν•˜λŠ” 것이 μ’‹λ‹€.

  • ex: μ μž¬μ€‘μΈ νŒ¨λ„μ˜ 뢈투λͺ…도λ₯Ό μ€„μ—¬μ„œ μ˜€λž˜λμŒμ„ λ³΄μ—¬μ£ΌλŠ” λ“±..

    • μŠ€ν”Όλ„ˆλ‘œ ν›„ν‡΄ν•˜μ§€ μ•Šκ³  화면에 μ „ν™˜μ€‘μž„μ„ ν‘œμ‹œν•˜λŠ” 방법 쀑 ν•˜λ‚˜

const [isPending, startTransition] = useTransition()
  • 이전 UIλ₯Ό 계속 λ³΄μ—¬μ£Όλ©΄μ„œ isPending trueκ°€ μ„€μ •λ˜κ³  이전에 μΌμ‹œμ€‘λ‹¨λœ λ‹€μŒ μ—…λ°μ΄νŠΈ UIλ₯Ό λ Œλ”λ§ν•œλ‹€.

λ¦¬μ—‘νŠΈ λ¬Έμ„œμ—μ„œλŠ” μ½”λ“œ 기반 전체에 useTransition ν˜ΈμΆœμ„ μ‚½μž…ν•˜λŠ” λŒ€μ‹  useTransition ν˜ΈμΆœμ„ λ””μžμΈ μ‹œμŠ€ν…œμ— ν†΅ν•©ν•˜λŠ” 편이 더 λ‚«λ‹€κ³  μ œμ•ˆν•œλ‹€ (확인 ν•„μš”)

  • ex: λ²„νŠΌμ€ 이벀트 ν•Έλ“€λŸ¬λ₯Ό μ „ν™˜μœΌλ‘œ 감싸기

// λ²„νŠΌμ„ λ Œλ”λ§ν•˜λ©΄μ„œ μ „ν™˜ μ½”λ“œλ„ μΊ‘μŠν™”
// λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ μ „ν™˜μ΄ μ‹œμž‘λ˜κ³ , μ „ν™˜μ΄ μΌμ‹œμ€‘λ‹¨ μƒνƒœμΈ λ™μ•ˆ λ²„νŠΌμ— μŠ€ν”Όλ„ˆ ν‘œμ‹œ

const ButtonPending = ({children, onClick, ...props}) => {
  const [isPending, startTransition] = useTransition();
  
  const handleClick = () => {
    startTransition(onClick); // ν•Έλ“€λŸ¬λ₯Ό transition으둜 감쌈
  }
  
  return (
    <button onClick={handleClick} {...props}>
      {isPending && <Spinner/>
      {children}
      {isPending && <Spinner/>
    </button>
  )
}

μŠ€ν”Όλ„ˆκ°€ λ…ΈμΆœλ˜λŠ” 텀이 μ§§λ‹€λ©΄ CSS둜 μˆ˜λ°±λ°€λ¦¬μ΄ˆ 후에 μŠ€ν”Όλ„ˆκ°€ μ„œμ„œνžˆ λ‚˜νƒ€λ‚˜λ„λ‘ 섀정해봐라

데이터가 λΉ λ₯΄κ²Œ μ μž¬λ˜λŠ” 경우 μŠ€ν”Όλ„ˆλ₯Ό 보지 λͺ»ν• κ²ƒμ΄λ‹€.

useDeferredValue둜 이전값 μœ μ§€ν•˜κΈ°

UI 일뢀 μ—…λ°μ΄νŠΈλ₯Ό μ§€μ—°(deferred)μ‹œν‚¬ 수 μžˆλŠ” ν›…

  • 지연을 λ°œμƒμ‹œμΌœ μƒˆ 값을 UI둜 λ Œλ”λ§ν•  수 μžˆμ„ λ•ŒκΉŒμ§€ 이전값을 μ‚¬μš©

  • 즉, μƒˆ 값은 μ§€μ—°λœλ‹€.

  • λ¦¬μ•‘νŠΈλŠ” 이전 버전(였래된 UI)κ³Ό μƒˆ 버전(μ—…λ°μ΄νŠΈ 이후 UI)의 값을 λͺ¨λ‘ μœ μ§€ν•˜κ³  UIμ—μ„œ 두 버전을 λͺ¨λ‘ μ‚¬μš©ν•œλ‹€.

// deferrredValueλŠ” undefined둜 μ‹œμž‘ν•˜λ―€λ‘œ || user 끝에 μΆ”κ°€ν•΄μ„œ
// 초기 user 값이 μ„€μ •λ˜μžλ§ˆμž λ°”λ‘œ μ‚¬μš©ν•˜λ„λ‘ μ„€μ •
const deferredUser = useDeferredValue(user) || user;
const isPending = deferredUser !== user;

const siwtchUser = (nextUser: User) => {
  setSelectedUser(nextUser)
  // queryClient.prefetchQuery('μ‚¬μš©μž 상세 정보 미리 μ½μ–΄μ˜€κΈ°');
  // queryClient.prefetchQuery('μ‚¬μš©μž 이미지 미리 μ½μ–΄μ˜€κΈ°');
}

return user 
    ? <main>
        <UserList 
          user={user} // μƒˆ μ‚¬μš©μž λͺ©λ‘ 반영
          setUser={switchUser} 
          // λͺ©λ‘ μ‚¬μš©μžκ°€ details μ‚¬μš©μžμ™€ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 사싀을 λͺ©λ‘μ—κ²Œ μ•Œλ¦Ό
          isPending={ispending} 
         />
        <Susepense fallback={<PageSpinner/>}>
          <UserDetails 
          // μƒˆ μ‚¬μš©μžμ˜ 상세 정보λ₯Ό κΈ°λ‹€λ¦¬λŠ” λ™μ•ˆ 이전 μ‚¬μš©μžμ˜ 상세정보 ν‘œμ‹œ
            userID={deferredUser.id} 
            isPending={isPending} // μ‚¬μš©μž 정보가 였래된 μ •λ³΄λΌλŠ” 사싀을 λ„˜κΉ€
          />
        </Suspense>
     </main>
    : <PageSpinner /> 
  • 좔적할 값을 인자둜 useDeferredValueλ₯Ό 호좜

  • 이 훅은 valueλ₯Ό μΆ”μ ν•΄μ„œ valueκ°€ 이전 κ°’μ—μ„œ μƒˆ κ°’μœΌλ‘œ λ³€κ²½λ˜λ©΄ 훅은 두 값쀑 ν•˜λ‚˜λ₯Ό λ°˜ν™˜ν•  수 μžˆλ‹€.

  • λ¦¬μ•‘νŠΈκ°€ μƒˆ 값을 μ‚¬μš©ν•΄ μƒˆ UIλ₯Ό μ„±κ³΅μ μœΌλ‘œ λ Œλ”λ§ν•˜κ³  μžμ† μ»΄ν¬λ„ŒνŠΈ 쀑 λ Œλ”λ§μ΄ μΌμ‹œμ€‘λ‹¨λ˜κ±°λ‚˜ μ§€μ—°λœ μžμ†μ΄ μ—†λ‹€λ©΄ 훅이 μƒˆ 값을 λ°˜ν™˜ν•˜κ³ , λ¦¬μ•‘νŠΈλŠ” UIλ₯Ό κ°±μ‹ ν•œλ‹€.

  • λ¦¬μ•‘νŠΈκ°€ μƒˆ κ°’μœΌλ‘œ λ Œλ”λ§μ„ 마치기 μœ„ν•΄ μ–΄λ–€ ν”„λ‘œμ„ΈμŠ€μ˜ μ™„λ£Œλ₯Ό κΈ°λ‹€λ €μ•Ό ν•˜λŠ” 경우, 훅은 이전 값을 λ°˜ν™˜ν•˜κ³  λ¦¬μ•‘νŠΈλŠ” κΈ°μ‘΄ 값을 μ‚¬μš©ν•΄ UIλ₯Ό ν‘œμ‹œν•œλ‹€.(이와 λ™μ‹œμ— λ©”λͺ¨λ¦¬μƒμ—μ„œ μƒˆ 값을 μ‚¬μš©ν•΄ UI μž‘μ—…μ„ μˆ˜ν–‰)

const deferredValue = useDeferredValue(value);

Transition은 이미 ν‘œμ‹œλœ μ½˜ν…μΈ (μ˜ˆμ‹œ: νƒ­ μ»¨ν…Œμ΄λ„ˆ)λ₯Ό μˆ¨κΈ°μ§€ μ•Šμ„ 만큼만 β€œλŒ€κΈ°β€ν•©λ‹ˆλ‹€. λ§Œμ•½ Posts 탭에 κ°€ μžˆλŠ” 경우 Transition 은 이λ₯Ό β€œλŒ€κΈ°β€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

https://ko.react.dev/reference/react/startTransition
https://ko.react.dev/reference/react/useTransition
https://ko.react.dev/reference/react/useTransition#preventing-unwanted-loading-indicators
https://ko.react.dev/reference/react/useDeferredValue
μ€‘μ²©λœ <Suspense> 경계