근데 보통 컴포넌트가 느리다면 ajax 요청한 서버 api가 이상할 가능성이 큽니다.
크롬에서 설치하면 redux 스토어, 변경함수 다 알려줍니다.
상단에서 lazy import해와여합니다.
하지만! 단점도 있는데, Detail 페이지에 접속할때 잠시 로딩될수도있다.
해결방안 -> Suspense
<Suspense>
태그로 전체 routes 태그를 감싸준다.
많이 쓰일 일은 없지만...
자식컴포넌트의 재랜더링을 막고싶엉!
컴포넌트가 재렌더링되면 거기 안에 있는 자식컴포넌트는 항상 함께 재렌더링됩니다.
평소엔 별 문제가 없겠지만 자식컴포넌트가 무거운 컴포넌트라면...?
그럴 땐 자식을 memo로 감싸놓으면 됩니다. !!!
memo는 props가 변할때만 재렌더링해줍니다.
why?
👀 memo로 감싼 컴포넌트는 헛된 재렌더링을 안시키려고버튼을 누르면 Cart 컴포넌트가 재렌더링된다.
부모 Cart 컴포넌트가 재렌더링될시 자식 Child컴포넌트도 재렌더링이된다.
자식컴포넌트가 꼭 필요할때만 재렌더링 하라고 말하고싶다면
===> memo
로 컴포넌트 감싸기!
memo는 props가 변할때 재렌더링 해준다고 했죠?
이렇게 Child 컴포넌트에 count 프롭스를 넘겨주고, 버튼을 누르면 count 프롭스가 변하므로 이땐 Child 컴포넌트를 재렌더링 해줍니다.
useEffect와 비슷합니다!
useMemo 안에 넣어두면 컴포넌트 로드시 1회만 실행됩니다.
재렌더링마다 동작안함.
useEffect 처럼 dependency도 넣을 수 있어서
특정 state, props가 변할 때만 실행할 수도 있습니다.
import {useMemo, useState} from 'react'
function 함수(){
return 반복문10억번돌린결과
}
function Cart(){
// let result = 함수() <--원래 Cart가 재렌더링 될때마다 실행됨
✨ let result = useMemo(()=>{ return 함수() }, []) ✨
return (
<Child />
<button onClick={()=>{ setCount(count+1) }}> + </button>
)
}
예를들어 state변경함수가 성능저하를 일으킨다면 , startTransition()
함수로 state변경함수 같은걸 묶으면 묶여진코드를 다른 코드들보다 나중에 처리해줍니다. 그래서 빨라지는것처럼 보입니다.
import {useState, useTransition} from 'react'
let a = new Array(10000).fill(0)
function App(){
let [name, setName] = useState('')
let [isPending, startTransition] = useTransition()
return (
<div>
<input onChange={ (e)=>{
startTransition(()=>{
setName(e.target.value)
})
}}/>
{
a.map(()=>{
return <div>{name}</div>
})
}
</div>
)
}
위의 코드에서, input에 무언가 입력할때마다 div가 10000개씩 생성이된다.
setName(e.target.value)
에서 성능저하가 일어난것이므로, 이를 startTransition()
로 감싸면, 더 빨라진걸 확인할 수 있다.
startTransition()
이 처리중일때 true로 변함.useTransition과 비슷합니다.
state 아니면 변수하나를 집어넣을 수 있음.
그래서 그 변수에 변동사항이 생기면 그걸 늦게 처리해줍니다.