Post

리액트에서 귀찮았던 모달을 간편하게 만들어보자

리액트에서 귀찮았던 모달을 간편하게 만들어보자

React로 개발하다보면, DropDown 이나 Modal같은 것들을 굉장히 자주 만들게 됩니다. 근데 항상 매번 비슷한 코드를 반복하다 보면 귀찮고 지겹고 좀 더 깔끔하게 만드는법이 없을까 생각이 들죠

오늘은 제가 자주 사용하는 방법들을 소개할려고 합니다.


  1. 상태관리 최소화 하는 훅 만들기 ```jsx const useToggle = () => { const [open, setOpen] = useState(false);

    const toggleHandler = useCallback(() => setOpen(prev => !prev), []); const openHandler = useCallback(() => setOpen(true), []); const closeHandler = useCallback(() => setOpen(false), []);

    return {open, toggleHandler, openHandler, closeHandler} }

const Modal = () => { const {openHandler} = useToggle(); return <button type=”button” onClick={openHandler}>열기</button> }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
이렇게 하면 똑같은 코드를 자주 짤 필요없이 필요할때만 useToggle()을 불러오면 되겠죠

---
2. 외부 클릭 close
```jsx
const useOutside = (fn) => {
    const ref = useRef();

    useEffect(() => {
        const handleClick = (e)=> {
            if(ref.current && !ref.current.contains(e.target)) {
                fn();
            }

            document.addEventListener('mousedown', handleClick);
            return () => document.removeEventListener('mousedown', handleClick);
        }
    },[fn]);
}

const Main = () => {
    const {openHandler, closeHandler} = useToggle();

    return <Modal closeHandler={closeHandler}/>

}

const Modal = ({closeHandler}) => {
    const modalRef = useOutside(closeHandler);

    return (
        <div className="modal">
            <div ref={modalRef} className="modal-content">
                모달
            </div>
        </div>
    );
}

이런식으로 사용해서 외부 클릭으로도 닫히게 할수있죠 나머지는 confirm을 만들던지 등 여러가지 활용을 할 수 있겠죠


또한 직접 만들면 커스텀은 좋지만 검증된 라이브러리를 사용하는방법도 있습니다

react-modal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import Modal from 'react-modal';

function App() {
  const [isOpen, setIsOpen] = useState(false);
  
  return (
    <Modal
      isOpen={isOpen}
      onRequestClose={() => setIsOpen(false)}
      contentLabel="Example Modal"
    >
      <h2>모달 제목</h2>
      <button onClick={() => setIsOpen(false)}>닫기</button>
    </Modal>
  );
}

@radix-ui/react-dialog
shadcn

이런 컴포넌트 라이브러리를 사용해도 좋은 방법입니다.

요약

|방법|장점 |—|—| |useToggle|상태 관리 간소화 |useOutsideClick|외부 클릭 처리 자동화 |useModal| Promise 기반 간편 사용 |라이브러리| 검증된 기능, 접근성

방법은 여러가지가 있고 결국 본인이 제일 편한 방법을 사용하는것이 제일 좋을것입니다. 여러가지 사용해보고, 결정하는것도 좋은 방법이죠

저는 커스텀이 간편한 직접 구현하는 방식을 많이 사용합니다.

This post is licensed under CC BY 4.0 by the author.

© Banal. Some rights reserved.