함수 컴포넌트 내부에서 발생하는 연산을 최적화할 수 있다.
렌더링하는 과정에서 특정 값이 바뀌었을 때만 연산을 실행하고, 원하는 값이 바뀌지 않았다면 이전에 연산했던 결과를 다시 사용하는 방식.
import React, { useMemo, useState } from 'react';
const getAverage = (list) => {
console.log('평균값 계산');
if (list == null || list.length === 0) return 0;
let sum = 0;
for (let i = 0; i < list.length; i++) {
sum += list[i];
}
return sum / list.length;
};
//-------------------------------------------------------------------------
const Average = () => {
const [list, setList] = useState([10, 50, 30, 70, 100]);
const [number, setNumber] = useState('');
const onChange = (e) => {
setNumber(e.target.value);
};
const onClick = (e) => {
setList(list.concat(parseInt(number)));
setNumber('');
};
const avg = useMemo(() => {
// POINT) useMemo는 외부에 있는 함수에의해 결과 값을 전달받아서 캐싱을 한 것!
console.log('useMemo작동');
return getAverage(list);
}, [list]);
return (
<div>
<input value={number} onChange={onChange} />
<button onClick={onClick}>등록</button>
<ul>
{list.map((value, index) => (
<li key={index}> {value} </li>
))}
</ul>
<div>
<b>평균값 : </b>
{getAverage(list)}
{/* {avg} */}
</div>
</div>
);
};
export default Average;
- 이유
리턴에서 {getAverage(list)}을 출력할 시
input 태그 안의 값에 onChange 함수를 걸어두어서 input 태그 안의 값이 바뀐 때마다 렌더링이 일어나고 그 때마다 getAverage 함수가 호출된다.
- 이유
리턴에서 {avg}를 출력할 시
useMemo()함수에 의해서 list 배열의 변화가 있을 시에만 getAverage 함수가 호출된다.
다른 onChange 함수의 렌더링마다 호출되던 것과 상반됨
useMemo와 useCallback 비교
- useMemo 는 함수 컴포넌트 "외부"에 있는 함수의 값에 대해 캐싱하는 것이 목적.
- useCallback은 렌더링 될때 "내부"에 있는 함수를 생성하는 것에 대해 캐싱하는것이 목적. 성능이 올라간당
색인 배열 연관배열
색인 배열 [] : 장점이자 목적 =>속도 빠름 (단 순서가 맞아야 한다)
연관배열 {} : 장점이자 목적 =>유연성 (키명이 없어도 됨. 없으면 걍 무시 (undefined) 안쥬금
색인 배열은 인덱스 있어서 순서가 바뀌면 안되지만
연관 배열은 key값만 맞으면 되기 때문에 순서가 상관 없다.
- 성능 vs 유연성 을 놓고 개발자가 선택해야할 문제
=> 키가 변동성이 있는가 없는가
내부적인 함수호출 빈번한 경우에는 : 색인
람다구문 호출되는 함수 반복적으로 많이 호출 : 색인
커스텀 훅을 만들 때
데이터 루틴 분리
커스텀 훅 함수명에는 sueㄹ는 거 쓰기 +> 그래야 훅에과낳ㅁ거 사용가능
비즈니스로직 : 외부에서 접근하 ㄹ수 이쓴 함수 별도의 리턴 타입으로 제공
연관배열의 유연성이 굉장히 좋기 때문에 매칭을 하여 사용
sass
css
로고 회전
9.2.3 예제
변수명, 함수로 스타일 적용했던거
11111
22222
1
2
생성 삭제 useReduce를 사용하여 hook형태의 함수를 만들어서 UI와 dataModeling(처리)에 관한 부분을 분리해 본다.
언니 짱짱!!🥳❤️