커스텀 훅을 사용해 defultModal을 제작해보자.
커스텀 훅 생성하기
먼저 커스텀 훅'useModal.js'의 코드는 다음과 같다.
import { useState } from "react";
const useModal = () => {
const [isShowing, setIsShowing] = useState(false);
function toggle() {
setIsShowing(!isShowing);
}
return {
isShowing,
toggle
};
};
export default useModal;
useModal이 하는 작업은 다음과 같다.
- useState(isShowing, setIsShowing)를 사용하여 모달의 보이는 상태를 저장
isShowing
상태 값을 반대로 만들어주는 함수toggle
DefaultModal 컴퍼넌트 생성하기
import React from "react";
import ReactDOM from "react-dom";
const Modal = ({ isShowing, hide, message }) =>
isShowing
? ReactDOM.createPortal(
<React.Fragment>
<div>
<div>
<button
type="button"
data-dismiss="modal"
aria-label="Close"
onClick={hide}
>
<span aria-hidden="true">×</span>
</button>
</div>
<p>저는 {message}입니다.</p>
</div>
</React.Fragment>,
document.body
)
: null;
export default Modal;
여기서 createPortal
은 부모 컴포넌트의 DOM 계층 구조 바깥에 있는 DOM 노드로 자식을 렌더링 시킨다.
ReactDOM.createPortal(child, container)
첫 번째 인자(child)는 엘리먼트, 문자열, 혹은 fragment와 같은 어떤 종류이든 렌더링할 수 있는 React 자식이고, 두 번째 인자(container)는 DOM 엘리먼트를 의미한다.
즉 외부에 존재하는 DOM 노드를 React App DOM 계층에 존재하는 것 처럼 연결해준다.
지금 같이 Modal과 같은 기능을 구현 할 때 유용하게 활용할 수 있다.
모달 사용하기
마지막으로 useModal()과 Modal 구성 요소를 함께 묶어준다.
import { useState } from "react";
import useModal from "./hooks/useModal";
import Modal from "./modal/DefaultModal";
import "./styles.css";
export default function App() {
const { isShowing, toggle } = useModal();
const [message, setMessage] = useState();
const handleClick = (info) => {
setMessage(info);
toggle();
};
return (
<div className="App">
<button onClick={() => handleClick("곰")}>Brown</button>
<button onClick={() => handleClick("오리")}>Sally</button>
<Modal isShowing={isShowing} hide={toggle} message={message} />
</div>
);
}
const { isShowing, toggle } = useModal();
app.js에 커스텀 훅을 가져오고,isShowing, toggle를 초기화 시켜준다.
const handleClick = (info) => {
setMessage(info);
toggle();
};
onClick 함수에 toggle();
함수를 넣어준다.
'Front-end > React' 카테고리의 다른 글
[React] Proxy 설정하기 (0) | 2022.09.29 |
---|---|
[Next] create-next-app 분석하기 (0) | 2022.08.14 |
[React] .env로 개발/배포 환경 설정하기 (0) | 2022.07.01 |
[React] Children prop로 컴포넌트에서 다른 컴포넌트를 담기 (0) | 2022.04.23 |
[React] useRef로 이전 state 얻는 법 (1) | 2022.04.08 |