원래 코드:
const placeArray =()=>
roomData
? roomData.accommodationList.map((room) => [
room.latitude,
room.longitude,
room.charge,
])
: [[0, 0, 0]]
);
useEffect(() => {
.
.
.
}, [placeArray]);
상황: <RoomMap />
컴포넌트 안에 placeArray
함수를 선언함. RoomMap컴포넌트가 리렌더링 될 때마다 다시 재생성되기 때문에(새 메모리 주소에 할당) 무조건 useEffect
가 실행되게 된다.
바뀐 코드:
const placeArray = useMemo(
() =>
roomData
? roomData.accommodationList.map((room) => [
room.latitude,
room.longitude,
room.charge,
])
: [[0, 0, 0]],
[roomData]
);
useMemo
로 placeArray를 감싸고, useMemo
의 의존배열에 roomData를 넣어(조건으로 함수에 변화가 생긴지 확인함) 룸데이터가 변하지 않으면 useEffect
가 값을 그대로 갖다줄것이고, 의미없는 렌더링을 방지하게된다.
☝이벤트 핸들링
useRef
를 사용한 방법모달을 감싸는 div에 useRef
를 걸고, useEffect
안에서 이벤트 관련 함수를 하나 만들고, document
객체 에다가 이벤트를 걸어두었다. 즉, 사용자가 다른 창을 눌렀을 때 선언해둔 modalOff 함수를 실행시키도록 했다. e.target을 사용하여 modalElement의 current를 탐색하여 클릭한 타겟 요소를 포함하고 있는지 체크를 하였고, 포함한다면 모달을 끄도록 설정하였다.