~87일차~
state를 사용 시 state가 변하면 컴포넌트가 다시 렌더링되지만, ref를 사용하면 렌더링 되지 않는다. (생명주기 동안 ref값은 유지)
js에서는 getElementId등을 사용하지만 react에서는 ref사용
엘리먼트에 포커스를 설정하거나 스크롤바 위치를 가져오는 등에서 사용
const Test2 = () => {
//Ref 생성
const inputRef = useRef(null);
const handleClick = () => {
inputRef.current.focus();
};
return (
<div>
// 특정DOM에 ref 값으로 설정
<ChildComponent ref={inputRef} />
<button onClick={handleClick}>클릭</button>
</div>
);
};
import { useEffect } from "react";
export default function useOnClickOutside(ref, handler) {
useEffect(() => {
const listener = event => {
// 클릭 시 ref.current가 없거나, 모달창 안이면 그냥 return
if (!ref.current || ref.current.contains(event.target)) {
return;
}
// 그 외(모달창 외부)에는 hadler(=모달창닫기)실행
handler(event);
};
document.addEventListener("mousedown", listener);
document.addEventListener("touchstart", listener);
//useEffect에서 return은 언마운트될때 호출
return () => {
document.removeEventListener("mousedown", listener);
document.removeEventListener("touchstart", listener);
};
}, [ref, handler]);
}
const ref = useRef(null);
//hadler로 모달 닫는 콜백함수
useOnClickOutside(ref, () => {
setIsModalOpen(false);
});
return (
//중략
<div className="modal" ref={ref}>
//후략
① useRef로 ref 생성한 다음 사용할 모달에 ref 설정
② "mousedown"
의 이벤트 발생 시 listener
가 모달창 외부인지 인식
③ 모달창 외부가 맞으면 handler인setIsModalOpen(false)
(모달창 닫기) 실행