🔍 배경 및 궁금증
리액트를 공부하다가 문제점을 맞닥뜨렸다. 바로 메뉴 만들기!
호오... 마치 노션처럼, 미트볼 메뉴를 클릭했을 때, 메뉴를 자유자재로 렌더링시키고 싶었다.
하지만 나는,
div
안에 <미트볼메뉴/>
와 <더보기메뉴/>
를 만든 상태였다.이에 대한 문제점은 다음 2가지였다.
- 모든 유저마다 저 더 보기 메뉴 컴포넌트를 클릭하지 않음에도 달고 있다면, 렌더링이 비효율적이다.
- 마우스 위치와 떨어진 더보기 메뉴는 UX 경험에 있어서도 좋지 않다(추후 버튼이 만약 커진다면)
따라서 이를 해결하기 위해 공식 문서를 찾아보기로 했다.
📢 해결 방법
가설
일단 내가 접근한 아이디어는 다음과 같았다.
- 만약 전체 기준에서 마우스 위치를 기억시켜준다면 → 이벤트
- 위치에 따라서 메뉴를 렌더링시켜준다면 → 전역적인 크기의 컴포넌트가 필요(독립적)
- 결과적으로 마우스 위치에 더 보기 메뉴를 만들어줄 수 있을 것이다.
가설 1. 전체 기준에서 마우스 위치 기억하기
먼저 전체 기준을 잡기 위한 전역적인 크기의 컴포넌트 렌더링
이는 다음과 같았다.
- 첫 번째 인자인
child
는container
의 엘리먼트에 들어갈 하위 요소를 의미한다.
- 두 번째 인자인
container
은 현재 렌더링된,child
의 부모요소가 될 Node를 의미한다.
따라서 이 값을 정확하게 입력 후 도출되는 결과는,
container
안에, child
가 들어가도록 하는 것이다. 어느 위치에서 선언을 했던지 말이다.따라서 이를 이용한다면,
document.body
에서 전체 크기에 맞는 일종의 전체 페이지 크기의 컴포넌트를 생성 가능했다.먼저 엘리먼트를 DOM에 추가시켜주자.
이후, active가 되었다면 이 친구를
el
에 담아서 렌더링시켜줄 수 있다.마우스 위치 기억하기.
먼저 내가 클릭하였을 때 발생하는 이벤트를 뜯어보기로 했다.
내가 만약 클릭한다면, 이벤트 객체에서 clientX와 clientY라는 속성에서 마우스 위치를 도출함을 확인했다.

따라서, 이를, 렌더링할 때마다 감시해주어 위치 상태 값을 변화시켜주면 된다!
이에 대한 코드는 다음과 같다.
이후 논의
useMemo
vs useRef