Zoeeey
Stack flows in you
Zoeeey
  • 분류 전체보기 (155)
    • 💡 UXUI (4)
      • UXUI (2)
      • UI (2)
      • UX (0)
    • 🟨 JavaScript (66)
      • 개념 (42)
      • 정리 (2)
      • 문제풀기 (프로그래머스, 코딩애플) (15)
      • 응용하여 자동화or문제해결하기 (2)
      • 기타 (5)
    • ⚛️ React (49)
      • 개념 (27)
      • 개념(Redux) (3)
      • 정리 (4)
      • 문제풀기 (코딩애플: React) (15)
    • 📘 TypeScript (10)
      • 개념 (8)
      • 문제풀기 (코딩애플) (2)
    • 🌐 HTML,CSS (18)
      • 실무에서 자주 발생한 오류들 (10)
      • 뒤늦게 알아서 뼈아픈 유용한 CSS (6)
      • 기타 자주 쓰는 CSS (2)
    • 💻 CS (8)
      • CS (5)
      • 정규표현식 (2)
      • Git,Github (1)

태그

  • 오류
  • JavaScript
  • UXUI
  • Props
  • 코딩애플
  • TypeScript
  • state
  • useEffect
  • redux
  • CSS
  • axios
  • react
  • 프로그래머스
  • object
  • json
  • 삼항연산자
  • array
  • class
  • CS
  • Ajax
전체 방문자
오늘
어제
hELLO · Designed By 정상우.
Zoeeey

Stack flows in you

⚛️ React/개념

React : 18버전 이후 기능들 (automatic batching, useTransition, isPending, useDeferredValue)

2023. 7. 5. 17:10

18버전 이후로 리액트에서 성능을 향상시킬 수 있는 기능들이 생겼다.


automatic batching

batching 기능은 state변경함수들이 여러개 연달아 있는 경우 마지막에서만 한번 재렌더링이 일어나는 기능이다.

17버전까지

ajax나 setTimeout 등 늦게 동작하는 코드들 내부에서는 batching이 일어나지 않아 매번 재렌더링되었다.

18버전 이후

위의 경우에도 모두 batching이 일어난다.


useTransition

아래 코드처럼 데이터가 10000개 들어있는 array자료가 있고.. 그 개수만큼 div가 있고.. input에 타이핑 할 때마다 div들에 데이터가 업데이트된다면 지연시간이 왕창 발생할 것이다.

전

import {useState} from 'react'

let a = new Array(10000).fill(0) // 10000개 데이터가 든 array

function App(){
  let [name, setName] = useState('')
  
  return (
    <div>
      <input onChange={ (e)=>{ setName(e.target.value) }}/> <!-- input 칠 때마다.. -->
      {
        a.map(()=>{
          return <div>{name}</div> <!-- 10000개의 div가 업데이트?! -->
        })
      }
    </div>
  )
}

후

상단에 import해온 후 useTransition()을 쓰면  그 자리에 [변수, 함수]가 남는다. startTransition()함수로 state변경함수를 묶으면 그걸 다른 코드보다 나중에 처리해준다.

import {useState, useTransition} from 'react' // 상단에 import

let a = new Array(10000).fill(0)

function App(){
  let [name, setName] = useState('')
  let [isPending, startTransition] = useTransition() // 이거 작성
  
  return (
    <div>
      <input onChange={ (e)=>{ 
        startTransition(()=>{ <!-- startTransition으로 state변경함수 묶기 -->
          setName(e.target.value) 
        })
      }}/>

      {
        a.map(()=>{
          return <div>{name}</div>
        })
      }
    </div>
  )
}

isPending

isPending은 startTransition()으로 감싼 코드가 처리중일 때 true로 변하는 변수이다. 그래서 아래처럼도 가능하다.

{
  isPending ? "로딩중" :
  a.map(()=>{
    return <div>{name}</div>
  })
}

useDeferredValue

startTransition()과 용도가 똑같지만 useDeferredValue는 state나 변수를 넣을 수 있게 되어있다. 해당 변수에 변동사항이 생기면 그 변동사항을 늦게 처리해준다.

상단에 import해온 후 useDeferredValue()안에 state를 집어넣는다. 그 처리결과는 let state1안에 저장해준다.

import {useState, useTransition, useDeferredValue} from 'react' // 상단에 import

let a = new Array(10000).fill(0)

function App(){
  let [name, setName] = useState('')
  let state1 = useDeferredValue(name) // ()안에 state 넣어주고 let 변수에 작성
  
  return (
    <div>
      <input onChange={ (e)=>{ 
          setName(e.target.value) 
      }}/>

      {
        a.map(()=>{
          return <div>{state1}</div> <!-- 처리결과 -->
        })
      }
    </div>
  )
}

출처 : 코딩애플 https://codingapple.com/

저작자표시 비영리 동일조건

'⚛️ React > 개념' 카테고리의 다른 글

React : 불변성 유지하기 (concat, slice)  (0) 2023.07.20
React : module css (전체 적용되는/컴포넌트별 css)  (0) 2023.07.06
React : memo로 재렌더링 막기 (memo, useMemo)  (0) 2023.07.05
React : lazy로 로딩속도 향상시키기 (lazy, Suspense)  (0) 2023.07.04
React : 개발자도구 크롬 확장프로그램 (React/Redux Developer Tools)  (0) 2023.07.04
    '⚛️ React/개념' 카테고리의 다른 글
    • React : 불변성 유지하기 (concat, slice)
    • React : module css (전체 적용되는/컴포넌트별 css)
    • React : memo로 재렌더링 막기 (memo, useMemo)
    • React : lazy로 로딩속도 향상시키기 (lazy, Suspense)
    Zoeeey
    Zoeeey
    길게 생각하고 짧게 그리기

    티스토리툴바