Front/React

[ Vite + React ] Draggable Popup

Yume Dev 2024. 10. 12. 14:50
반응형

이전에 커스텀 메뉴를 눌렀을때 추가와 편집 메뉴를 구성했는데 이때 추가 버튼을 누르면 드래그가 가능한 팝업을 구현


Draggable

Draggable을 사용하기위해 라이브러리 설치

npm install react-draggable

 

Draggable PopupComponent를 생성

부모 컴포넌트에서 버튼을 클릭하면 화면이 나오게 하기 위해서 isOpen 상태와 팝업을 닫기위한 onClose를 설정

isOpen값이 true면 팝업이 열리도록 조건을 추가

import React from 'react';
import Draggable from 'react-draggable';
import './DraggablePopupComponent.scss'
import {observer} from "mobx-react";
import themeStore from "../../store/ThemeStore.ts";

const DraggablePopup = observer(({isOpen, onClose}) => {
    const {isDarkMode} = themeStore

    return (
        <div>
            {isOpen && (
                <div className="popup-overlay">
                    <Draggable>
                        <div className={`popup-content  ${isDarkMode ? 'isDarkMode' : ''}`}>
                            <div className={`popup-button-container ${isDarkMode ? 'isDarkMode' : ''}`}>
                                <button>추가</button>
                                <button onClick={onClose}>닫기</button>
                            </div>
                        </div>
                    </Draggable>
                </div>
            )}
        </div>
    );
});

export default DraggablePopup;

 

이후 ContextMenu 팝업에서 추가 버튼을 누르면 popup을 열기위해 추가 버튼을 누르면 useState로 값을 바꾸며

true값을 전달 DraggablePopup에 전달

 

onClose도 실행시 값을 false로 바꾸며 팝업이 닫히도록 구현

/* ADD HANDLER*/
    const [isAddPagePopup, setIsAddPagePopup] = useState(false);
    const addPageHandler = () => {
        setIsAddPagePopup(!isAddPagePopup)
    }
    
    return (
        <>
            <div className="context_container" onContextMenu={handleContextMenu}>
                {children}
            </div>
            <div id="context_menu" className={`${isDarkMode ? 'isDarkMode' : ''}`}>
                <div className={`context_menu_list ${isDarkMode ? 'dark' : ''}`}>
                    <div onClick={addPageHandler}>추가</div>
                    <div>편집</div>
                </div>
            </div>
            <DraggablePopup isOpen={isAddPagePopup} onClose={addPageHandler}/>
        </>
    );

 

이러면 드래그가 가능한 팝업을 만들 수 있다.

728x90
반응형