본문 바로가기
Front-End Study/React.js

최적화

by 코딩기 2024. 2. 21.
728x90

웹 서비스의 구현에 필수적인 항목(서버 성능 개선, 로딩 속도 개선, 불필요한 재연산 방지, etc…)

  • useMemo
    특정 함수 호출 시 정해진 조건을 만족해야 호출될 수 있도록 하는 Hook
// ex)
// 첫번째 인수로 callback 함수를 넣고, 리렌더를 원하지 않는 연산을 작성
const {totalCount, doneCount, notDoneCount} = useMemo(() => {
    const totalCount = todos.length;
    const doneCount = todos.filter((todo) => todo.isDone).length;
    const notDoneCount = totalCount - doneCount;
    return {
      totalCount,
      doneCount,
      notDoneCount,
    };
  }, [todos]); // 두번째 인수로 리렌더를 원하지 않는 상황 or 조건을 명시

-> 복잡한 컴포넌트를 불필요하게 리렌더 시 성능 저하 야기

  • memo
    최적화된 컴포넌트를 받아와 할당하는 Hook
// ex)
import { memo } from 'react';

function Header(){

  return <div className="Header">
    <h1>
      {new Date().toDateString()}
    </h1>
  </div>
}
// 최적화시킬 컴포넌트를 인수로 작성
export default memo(Header);

컴포넌트를 할당 받은 변수는 어떠한 props도 받지 않기 때문에, 리렌더 대상에서 제외 가능
🚫단, 원시값과 같은 변화되지 않는 값이 아닌 참조 자료형이 변경되는 경우 리렌더 대상

import { memo } from 'react';

function TodoItem(
  {id, isDone, createdDate, content, onUpdate, onDelete}
) {

  const onChangeCheck = () => {
    onUpdate(id);
  }

  const onClickDeleteBtn = () => {
    onDelete(id);
  }

  const addClassName = isDone ? 'checked' : '';

  return <div className="TodoItem">
    <input onChange={onChangeCheck} type="checkbox" checked={isDone}/>
    <div className={`content ${addClassName}`}>{content}
      </div>
    <div className='date'>{new Date(createdDate).toLocaleDateString()}</div>
    <button onClick={onClickDeleteBtn}>삭제</button>
  </div>
}

export default memo(TodoItem); // 원래 정상적으로 작동해야하나, onUpdate와 onDelete는 App 컴포넌트로부터 가져온 참조 자료형이므로 App이 리렌더 될때마다 같이 리렌더됨 -> 제외 불가
  • useCallback
    함수의 재생성을 방지하는 리액트 Hook
import { useCallback } from 'react';

// 첫번째 인수로 재생성을 방지할 함수, 두번째 인수로 의존성 배열 추가
const onUpdate = useCallback( (targetId) => {
    dispatch({
      type: "UPDATE",
      data: targetId
    })
  }, []);

  const onDelete = useCallback( (targetId) => {
    dispatch({
      type:"DELETE",
      data: targetId
    })
  }, []);

-> Deps에 아무것도 넣지 않을시, mount 함수 구현의 로직과 비슷하게 한번 생성 후 추가 생성X

'Front-End Study > React.js' 카테고리의 다른 글

페이지 라우팅  (0) 2024.02.22
useReducer  (0) 2024.02.20
React Custom Hooks  (0) 2024.02.20
리액트의 라이프 사이클  (1) 2024.02.17
State로 사용자 입력 관리하기, Ref로 요소 지정하기  (0) 2024.02.15