useMemo vs. useEffect + useState
를 사용하면 어떤 이점이 있습니까?useMemo
(예를 들어 부하가 높은 함수 호출의 경우)를 조합하여 사용하는 대신useEffect
그리고.useState
?
여기 첫눈에 딱 맞는 두 개의 커스텀 훅이 있습니다.useMemo
의 반환가치는 다음과 같습니다.null
첫 번째 렌더링:
use Effect & use State
import { expensiveCalculation } from "foo";
function useCalculate(someNumber: number): number | null {
const [result, setResult] = useState<number | null>(null);
useEffect(() => {
setResult(expensiveCalculation(someNumber));
}, [someNumber]);
return result;
}
useMemo
import { expensiveCalculation } from "foo";
function useCalculateWithMemo(someNumber: number): number {
return useMemo(() => {
return expensiveCalculation(someNumber);
}, [someNumber]);
};
둘 다 모수가 나올 때마다 결과를 계산합니다.someNumber
변경사항, 메모화는 어디서 이루어집니까?useMemo
시작했어?
그useEffect
그리고.setState
변경 시마다 추가 렌더링이 발생합니다.첫 번째 렌더링은 오래된 데이터로 "지연"되고 나서 새로운 데이터로 즉시 추가 렌더가 큐잉됩니다.
예를 들어 다음과 같습니다.
// Maybe I'm running this on a literal potato
function expensiveCalculation(x) { return x + 1; };
예를 들어x
초기값은 0 입니다.
- 그
useMemo
버전이 즉시 렌더링합니다.1
. - 그
useEffect
버전 렌더링null
그런 다음 컴포넌트가 효과를 렌더링하고 상태를 변경하고 새 렌더를 큐잉한 후1
.
그럼 우리가 바뀌면x
2:
- 그
useMemo
실행 및3
렌더링 됩니다. - 그
useEffect
버전 실행 및 렌더링1
다시, 효과가 트리거되고 컴포넌트가 올바른 값으로 재실행됩니다.3
.
빈도로 볼 때론expensiveCalculation
동작은 동일하지만,useEffect
다른 이유로 퍼포먼스에 악영향을 미치는 렌더링의 2배의 원인이 되고 있습니다.
게다가,useMemo
IMO, 버전이 더 깔끔하고 읽기 쉬울 뿐입니다.불필요한 가변 상태를 도입하지 않고 움직이는 부분이 적습니다.
그래서 그냥 쓰는 게 낫겠다.useMemo
여기서.
둘 중 하나를 선택할 때 고려해야 할 두 가지 요점이 있다고 생각합니다.
- 함수가 호출된 시간.
useEffect
컴포넌트가 렌더링된 후 호출되므로 이 컴포넌트에서 DOM에 액세스할 수 있습니다.예를 들어 참조를 통해 DOM 요소에 액세스하려면 이 기능이 중요합니다.
- 시멘틱 보증
useEffect
의존관계가 변경되지 않은 경우 부팅되지 않음을 보증합니다. useMemo
그런 보장은 없습니다.
React 문서에서 설명한 바와 같이 useMemo는 순수 최적화 기술로 간주해야 합니다.useMemo 를 통상의 함수 호출로 치환해도, 프로그램은 정상적으로 동작합니다.
useEffect
+useState
를 사용하여 업데이트를 제어할 수 있습니다.순환 의존성을 해소하고 무한 업데이트 루프를 방지합니다.
비동기성 이외에 설계방법에 차이가 있을 수 있습니다.
useEffect
는 비동기 여부에 관계없이 모든 컴포넌트가 렌더링된 후에 수집되는 콜입니다.
useMemo
는 로컬 콜이며 이 컴포넌트와만 관련이 있습니다. 만 하면 요.useMemo
마지막 업데이트의 할당을 사용할 수 있는 이점이 있는 다른 할당문으로 사용합니다.
,, ,,useMemo
급하고, 그 다음에 더 is is is is is isuseLayoutEffect
마지막은 '아예'입니다.useEffect
.
언급URL : https://stackoverflow.com/questions/56028913/usememo-vs-useeffect-usestate
'programing' 카테고리의 다른 글
WordPress의 플러그인 기능 재정의 (0) | 2023.03.05 |
---|---|
Jest URL.create ObjectURL이 함수가 아닙니다. (0) | 2023.03.05 |
Jeest expect.any()가 예상대로 작동하지 않습니다. (0) | 2023.03.05 |
joke console.log 테스트 방법 (0) | 2023.02.23 |
리액트 라우터의 루트에 대한 접근을 제한하는 방법 (0) | 2023.02.23 |