카테고리 없음

20241004 34일차

happyst 2024. 10. 4. 09:54

React Hook

기본

  • useState
  • useEffect
  • useRef
  • useParams
  • useSearchParams
  • useNavigation

최적화

  • useContext
  • useReducer
  • useMemo

----------------------

[useContext]
- 컴포넌트 트리에서 깊이 중첩된 자식 컴포넌트들로 값을 전달할 때 유용함
- props는 하위 컴포넌트로 전달되는 방식이므로 상위 컴포넌트에서 하위 컴포넌트로 불필요한 props를 여러번 전달해야되는 Props drilling이 발생할 수 있음
- 전역 상태를 쉽게 관리함

const MyContext = React.createContext();

function MyComponent() {
  const value = useContext(MyContext); // MyContext의 값을 읽음
  return <div>{value}</div>;
}

 

[useReducer]
- useState: 단순한 상태 업데이트에 적합
- useReducer: 상태와 그 상태를 업데이트하는 로직을 분리할 수 있어 더 복잡한 상태 변화를 관리할 때 유리함
- 코드의 가독성을 높일 수 있음
- 유지보수가 용이함 (App.jsx 수정할 필요 없이 reducer 함수만 수정하면 됨)

const initialState = { count: 0 };

function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return { count: state.count + 1 };
    case 'decrement':
      return { count: state.count - 1 };
    default:
      throw new Error();
  }
}

function Counter() {
  const [state, dispatch] = useReducer(reducer, initialState);
  return (
    <>
      <button onClick={() => dispatch({ type: 'decrement' })}>-</button>
      <span>{state.count}</span>
      <button onClick={() => dispatch({ type: 'increment' })}>+</button>
    </>
  );
}

 

[useMemo]
- 특정 값이나 함수가 다시 계산되지 않도록 메모이제이션함
- 값이나 함수가 바뀌지 않는다면 이전에 계산된 값을 그대로 재사용함
- 불필요한 렌더링을 줄여줌

const expensiveCalculation = (num) => {
  console.log("Calculating...");
  return num * 2;
};

function MyComponent({ number }) {
  const memoizedValue = useMemo(() => expensiveCalculation(number), [number]);

  return <div>{memoizedValue}</div>;
}

----------------------
public의 svg, src.assets의 svg 차이
- public: 매번 읽어옴
- src.assets: 메모리에 올려놓음