이 포스팅에서는 새 윈도우 창을 띄어주는 팝업을 구현한 과정과 이 과정에서 얻은 지식들을 정리해보고자 한다.
구현 과정에서 window.open으로 만들어진 창의 close를 제어하기 위하여 window.open의 반환값을 저장하는 로직이 필요했는데, 이를 useState hook을 사용하여 setState로 저장할 것인지, useRef hook을 사용하여 ref.current에 값을 저장할 것인지 고민이 되었다. 그래서 두 케이스 모두 구현해보고 좋은 쪽을 택하기로 했다.
const closeWindow = useCallback(() => {
if (winObj !== null) {
winObj.close();
}
}, [winObj]);
useEffect(() => {
window.addEventListener('beforeunload', ()=>{
closeWindow()
})
return closeWindow
})
import React, { useCallback, useEffect, useState } from 'react';
function App() {
const [showState, setShowState] = useState(false);
const onBtnClick = () => {
setShowState((showState) => !showState);
};
return (
<div>
<button onClick={onBtnClick}>show Component</button>
{showState && <StateComp />}
</div>
);
}
const StateComp = () => {
const [winObj, setWinObj] = useState<Window | null>(null);
const closeWindow = useCallback(() => {
if (winObj !== null) {
winObj.close();
}
}, [winObj]);
useEffect(() => {
window.addEventListener('beforeunload', () => {
closeWindow();
});
return closeWindow;
}, [closeWindow]);
return (
<div>
<button
onClick={() => {
setWinObj(window.open('https://www.naver.com/', '_blank', 'popup'));
}}
>
Pop up!!
</button>
</div>
);
};
import React, { useCallback, useEffect, useRef} from 'react';
function App() {
const [showState, setShowState] = useState(false);
const onBtnClick = () => {
setShowState((showState) => !showState);
};
return (
<div>
<button onClick={onBtnClick}>show Component</button>
{showState && <RefComp />}
</div>
);
}
const RefComp = () => {
const winRef = useRef<Window | null>(null);
const closeWindow = useCallback(() => {
if (winRef.current !== null) {
winRef.current.close();
}
}, []);
useEffect(() => {
window.addEventListener('beforeunload', () => {
closeWindow();
});
return closeWindow();
}, [closeWindow]);
return (
<div>
<button
onClick={() => {
winRef.current = window.open('https://www.naver.com/', '_blank', 'popup');
}}
>
Pop up!!
</button>
</div>
);
};