inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

따라하며 배우는 리액트 A-Z[19버전 반영]

모달 창 외부 클릭 시 모달 닫게 만드는 Custom Hooks 생성

강의 잘 듣고 있습니다.

257

ezdar

작성한 질문수 10

0

강의 잘 보고 있습니다. 13:02 부분에 

!ref.current를 어떤 상황을 이유로 추가를 하셨는지 궁금해서 질문 드립니다.. 
 
modal부분이 없는 경우가 어떤 상황인지 전혀 떠오르지 않습니다 ㅠ
그리고 useOnClickOutside hook에서 useEffect를 안써도 잘 잘동이 하는데 왜 썻는지도 너무 궁금합니다 !
 
바쁘신데 죄송합니다 답변 기다리겠습니다 ! ㅠ 
 

tdd react redux typescript Next.js

답변 1

0

John Ahn

안녕하세요 

우선 !ref.current 이부분은 

useOnClickOutside(ref, () => {
setModalOpen(false);
});

만약 이 부분에 잘못된 ref를 넣었거나, ref를 넣지 않았을 때 에러를 막아주는 방어 코드 역할을 합니다.

또한 useEffect 없이 사용한다는 말은 

export default function useOnClickOutside(ref, handler) {
 
const listener = (event) => {
if (!ref.current || ref.current.contains(event.target)) {
return;
}
handler(event);
};
document.addEventListener("mousedown", listener);
document.addEventListener("touchstart", listener);
return () => {
document.removeEventListener("mousedown", listener);
document.removeEventListener("touchstart", listener);
};
}

이렇게 사용하신다는 건가요? 리액트에서 컴포넌트가 시작할 때 리스너를 등록하고 컴포넌트를 더 이상 안 쓰게 될 때 없애주는 걸 해줘야 하는데 useEffect안에서 올바른 타이밍에 리스너 등록하고 없애줄 수 있습니다. 

또한 ref와 handler가 바뀔 때만 새롭게 useEffect안에 함수가 호출되게 해 놓았는데 이 부분도 useEffect가 있어야만 가능합니다. 현재 지금은 만들면서 저희만 로컬에서 테스트하기에 1번 같은 방어 코드의 역할이나 2번 같은 리스너 혹은 의존성의 역할이 큰 거 같지 않아 보이지만 많은 사람들이 사용하게 되면 분명 에러가 발생하게 됩니다 ~ 

그래서 이러한 부분을 신경 써서 코딩해주는 게 좋습니다 감사합니다 ~



0

ezdar

빠르고 구체적인 답변 감사합니다!   정말 많이 배워 갑니다 !

강의 소스 코드 압축 풀기 오류

0

92

1

런타임 에러 ㅠㅠ

0

105

1

강의대로 따라갔는데 에러보다 api키로 들어간 넷플릭스? 그런게 렌더링 되지 않습니다 ㅠ

0

114

1

안녕하세요 개발과 상관없는 질문입니다만

0

123

1

리액트 라우터 관련

0

119

1

react-beatiful-dnd에서 문제가 발생합니다.

0

108

1

react19에서는 react-beautiful-dnd가 설치되지 않습니다.

0

833

1

useEffect로 사용을 해도 되나요?

0

210

1

넷플릭스 오리지널 제외하고 슬라이드가 동작을 안합니다.

0

202

1

react 19의 useActionState가 더이상 isPending은 지원하지 않는 듯합니다

0

287

2

리액트 dockderfile 작성 시 COPY 질문

0

156

1

next.js에서부터는 react query 필요없는지

0

328

1

기능

0

204

1

오류가 안보여요

0

206

1

CSS

0

225

1

local storage

0

224

1

list컴포넌트 생성하기

0

230

1

검색어 입력 후 초기화하는 방법 궁금합니다!

0

343

1

Banner.css에 대해서

0

464

1

플러그인이 추천을 안해줍니다

0

335

1

마이너스버튼 테스트

0

285

2

리액트 서버 실행 오류

0

1170

2

오류메세지는 확인했는데 어떻게 고쳐야 할지 모르겠습니다 ㅠ

0

307

1

creactStore질문이요

1

293

2