React.memo -> 부모에게 내려받은 프롭스가 변경되더라도 메모로 감싼 자식컴포넌트가 리랜더링 되지않고 기존의 것을 기억
useMemo -> useMemo(() => {},[의존성배열값])복잡한계산 이후의 최종 값을 기억시킨다. 함수의 계산후 리턴값을 기억
useCallback -> useCallback(() => {},[의존성배열값]) 이벤트함수 사용할때 주로사용, 함수의 실행자체를 기억
→ 무조건적인 사용은 지양, 일반적으로 불필요한 Render가 많이 발생하는 곳에서 사용
const aa = React.memo(component)
const Welcome = ({name}) => {
return <h1> Hello {name} </h1>;
};
export default React.memo(Welcome);
Welcome의 결과를 Memoization해서 이후 props가 변경될때까지 현재 memoized된 내용을 그대로 사용해 리렌더링을 막는다.
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
const memoizedValue = useCallback(computeExpensiveValue(a, b), [a, b]); // 위와 동일
const handleChange = useCallback(
(e) => {setNum(e.target.value)
}, []
) ;
useCallback을 통해 memoized된 함수는 eventhandler로 사용되며 두번째 인자인 [ ] <- 배열인 요소가 변경될때마다 새로운 함수가 생성된다.
const useCallbackPage = () ⇒ {
const [ name, setName ] = useState(’ ’)
const [ id, setId ] = useState(’ ‘)
const [ phone, setPhone ] = useState(’ ‘)
const hadleChangeInput = useCallback((e) => {
const { name, value } = e.target;
name === 'name' ? setName(value)
: name === 'id' ? setId(value)
: setPhone(value)
}, [name, id, phone])
return (
<>
{* React.memo *}
<Input label="이름" type="text" value={name} name="name"
changeCB={handleChangeInput} />
{* React.memo *}
<Input label="아이디" type="text" value={id} name="id"
changeCB={handleChangeInput} >
{* React.memo *}
<Input label="전화번호" type="text" value={phone} name="phone"
changeCB={handleChangeInput} />
</>
)
}
const InputGroupComp = React.memo(({label, type, value, name, changeCB}) => {
return (
<div className="input-group">
<label className="input-labe">
<p> {label} </p>
</label>
<Input className="input-default" type={type} value={value}
changeCB={changeCB} name={name} />
</div>
)
})
//최적화 useCallback 적용
const getProducts = useCallback(async () => {
const url = "http://makeup-api.herokuapp.com/api/v1/products.json?brand=maybelline";
const res = await axios.get(url);
console.log(res.data);
}, []);
useEffect(() => {
getProducts()
},[getProducts])