React 사용자 지정 후크 및 Typescript를 사용하여 React Modal 만들기
React 후크는 React의 매우 유용한 기능이며 사용자 정의 React 후크와 함께 이러한 사용자 정의 React 후크는 무한한 가능성을 가지며 컨테이너/프레젠테이션 모델에서 컨테이너 로직을 쉽게 대체할 수 있습니다.
자세한 내용은 여기Patter.dev를 참조하세요.
처음부터 모달 만들기
모달의 프리젠테이션 부분 만들기
여기에서 Modal의 프리젠테이션 부분을 만들어 보겠습니다. 빠르게 코드를 보여드리겠습니다.
import React, { ReactNode } from "react";
interface ModalType {
children?: ReactNode;
isOpen: boolean;
toggle: () => void;
}
export default function Modal(props: ModalType) {
return (
<>
<div className="modal-overlay" >
<div className="modal-box">
{props.children}
</div>
</div>
</>
);
}
이것을 설명하겠습니다. 여기에 전체 너비와 높이를 갖는 두 개의 div an overlay-div
과 a modal-box div
가 있습니다.
따라서 우리는 사용자가 modal-box div
이외의 다른 곳을 클릭하면 모달이 닫히는 아래와 같은 것을 달성하려고 합니다. 그리고 모든 모달 콘텐츠는 모달의 흰색 부분 안에 있습니다.
모달 div에 대한 CSS를 빠르게 설정해 보겠습니다.
.modal-overlay {
z-index: 9999;
width: 100vw;
height: 100vh;
position: absolute;
top: 0;
background: rgba(0, 0, 0, 0.7);
display: flex;
justify-content: center;
align-items: center;
}
.modal-box {
display: block;
background: white;
width: 70%;
height: 70%;
padding: 1rem;
border-radius: 1rem;
}
이 작업이 완료되면 상태가 참인 경우에만 Modal을 렌더링하는 논리 부분에 도달해야 합니다.
커스텀 후크가 필요한 이유는 무엇입니까?
여기서는 모달을 사용하고 모든 파일에 동일한 기능을 추가하려고 할 때 동일한 논리를 반복해서 작성할 필요가 없도록 사용자 지정 후크를 사용했습니다.
후크에 논리 추가
우리의 useModal.tsx
폴더에 새 파일hooks
을 빠르게 만들어 보겠습니다. 이것은 순수한 함수가 될 것이며 지금은 로직만 포함할 것입니다.
// useModal.tsx
import { useState } from "react";
export default function useModal() {
const [isOpen, setisOpen] = useState(false);
const toggle = () => {
setisOpen(!isOpen);
};
return {
isOpen,
toggle
};
}
여기에는 모달을 표시하거나 숨기는 상태isOpen
가 있고 실제로 모달의 가시성을 전환하는 기능이 있습니다.
이제 App.tsx
에서 이 코드를 사용하고 클릭 시 트리거되는 모달을 구현해 보겠습니다.
로직과 프리젠테이션 파트 결합( hooks + Modal 컴포넌트)
Modal 구성 요소 호출 및 useModal
Modal 구성 요소를 가져오고 useModal
App.tsx
연결해 보겠습니다.
import Modal from "./component/modal";
import useModal from "../src/hooks/useModal";
다른 논리를 추가하고 isOpen
및 toggle
를 Modal
구성 요소에 전달합니다.
우리의 App.tsx
는 아래와 같이 보일 것입니다.
export default function App() {
const { isOpen, toggle } = useModal();
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<h2>Start editing to see some magic happen!</h2>
<button onClick={toggle}>Open Modal </button>
<Modal isOpen={isOpen} toggle={toggle}></Modal>
</div>
);
}
Modal 컴포넌트에 로직 추가
이 시점에서 우리가 필요한 것은 Modal 구성 요소에 몇 가지 기본적인 조건부 렌더링 논리를 추가하는 것입니다. 이제 우리가 무엇을 가지고 있는지 봅시다.
// Modal.tsx
import React, { ReactNode } from "react";
interface ModalType {
children?: ReactNode;
isOpen: boolean;
toggle: () => void;
}
export default function Modal(props: ModalType) {
return (
<>
{props.isOpen && (
<div className="modal-overlay" onClick={props.toggle}>
<div className="modal-box">
{props.children}
</div>
</div>
)}
</>
);
}
onClick 이벤트를 추가하고 toggle
함수를 전달하여 모달 외부의 다른 곳을 클릭하면 모달 가져오기가 종료되도록 했습니다.
또한 if isOpen = false
가 아무 것도 반환하지 않도록 구성 요소를 렌더링했습니다.
이 시점에서 우리는 끝났습니다. 이제 어떻게 보이는지 봅시다.
이제 잘 작동합니다 .......... 음 거의 실제로.
내부 div를 클릭해도 전체 모달이 가까워지는 것을 알아차리면 몇 가지 문제가 발생할 수 있으므로 우리가 할 수 있는 일이 아닙니다.
이는 모든 이벤트가 상위 div를 통해 전파되는 Javascript의 이벤트 버블링이라는 현상으로 인해 발생합니다.
버그 해결 및 이벤트 전파 처리.
React에서는 이미 React에서 제공하는 usingevent.stopPropagation()
메소드로 쉽게 해결할 수 있습니다.
사용자가 Inner div를 클릭할 때만 이 메서드를 호출합니다.
이제 코드가 어떻게 보이는지 봅시다
// Modal.tsx
import React, { ReactNode } from "react";
interface ModalType {
children?: ReactNode;
isOpen: boolean;
toggle: () => void;
}
export default function Modal(props: ModalType) {
return (
<>
{props.isOpen && (
<div className="modal-overlay" onClick={props.toggle}>
<div onClick={(e) => e.stopPropagation()} className="modal-box">
{props.children}
</div>
</div>
)}
</>
);
}
이야!!!!!!!!!!! 이제 위의 문제가 해결되었습니다
샌드박스에서 사용해 보시겠습니까?
더 많은 기능을 추가하여 테스트해 보시기 바랍니다.
TL;DR
import React, { ReactNode } from "react";
interface ModalType {
children?: ReactNode;
isOpen: boolean;
toggle: () => void;
}
export default function Modal(props: ModalType) {
return (
<>
<div className="modal-overlay" >
<div className="modal-box">
{props.children}
</div>
</div>
</>
);
}
.modal-overlay {
z-index: 9999;
width: 100vw;
height: 100vh;
position: absolute;
top: 0;
background: rgba(0, 0, 0, 0.7);
display: flex;
justify-content: center;
align-items: center;
}
.modal-box {
display: block;
background: white;
width: 70%;
height: 70%;
padding: 1rem;
border-radius: 1rem;
}
// useModal.tsx
import { useState } from "react";
export default function useModal() {
const [isOpen, setisOpen] = useState(false);
const toggle = () => {
setisOpen(!isOpen);
};
return {
isOpen,
toggle
};
}
import Modal from "./component/modal";
import useModal from "../src/hooks/useModal";
export default function App() {
const { isOpen, toggle } = useModal();
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<h2>Start editing to see some magic happen!</h2>
<button onClick={toggle}>Open Modal </button>
<Modal isOpen={isOpen} toggle={toggle}></Modal>
</div>
);
}
// Modal.tsx
import React, { ReactNode } from "react";
interface ModalType {
children?: ReactNode;
isOpen: boolean;
toggle: () => void;
}
export default function Modal(props: ModalType) {
return (
<>
{props.isOpen && (
<div className="modal-overlay" onClick={props.toggle}>
<div className="modal-box">
{props.children}
</div>
</div>
)}
</>
);
}
React에서는 이미 React에서 제공하는 using
event.stopPropagation()
메소드로 쉽게 해결할 수 있습니다.사용자가 Inner div를 클릭할 때만 이 메서드를 호출합니다.
이제 코드가 어떻게 보이는지 봅시다
// Modal.tsx
import React, { ReactNode } from "react";
interface ModalType {
children?: ReactNode;
isOpen: boolean;
toggle: () => void;
}
export default function Modal(props: ModalType) {
return (
<>
{props.isOpen && (
<div className="modal-overlay" onClick={props.toggle}>
<div onClick={(e) => e.stopPropagation()} className="modal-box">
{props.children}
</div>
</div>
)}
</>
);
}
이야!!!!!!!!!!! 이제 위의 문제가 해결되었습니다샌드박스에서 사용해 보시겠습니까?
더 많은 기능을 추가하여 테스트해 보시기 바랍니다.
TL;DR
이 게시물이 마음에 들면 Twitter에서 연결해 보겠습니다.
이 블로그는 Blogtiple을(를) 사용하여 게시되었습니다.
Reference
이 문제에 관하여(React 사용자 지정 후크 및 Typescript를 사용하여 React Modal 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/theashishmaurya/creating-a-react-modal-with-react-custom-hooks-and-typescript-55ma텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)