React 로그인 Modal 만들기 2 - styled-component 사용하기 기존에 style 내용들을 css 파일로 관리해도 문제가 없으나, React에서는 style마저도 js파일로 관리할 수 있도록 지원해주는 다양한 프레임 워크들이 있다. js파일로 관리하게 되면 React의 여러 기능을 사용하기 좋기 때문에 기존에 작성해준 Login 관련 css 내용을 js 파일로 변경하려고 한다.
import styled, { keyframes } from "styled-components" ;export const ModalFade = keyframes`{ from { opacity: 0; margin-top: -50px; } to { opacity: 1; margin-top: 0; } } ` ;export const ModalBackGround = styled.div ` position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; ` ;export const ModalBox = styled.div ` width: 90%; max-width: 400px; margin: 0 auto; border-radius: 0.3rem; background-color: #fff; animation: ${ModalFade} 0.5s; overflow: hidden; ` ;export const LoginHeader = styled.div ` position: relative; padding: 16px 64px 16px 16px; background-color: #f1f1f1; font-weight: 700; & > button { position: absolute; top: 15px; right: 15px; width: 30px; font-size: 21px; font-weight: 700; text-align: center; color: #999; border: 0; } ` ;export const LoginBody = styled.div ` padding: 10px; & > div { padding: 5px; display: flex; align-items: center; justify-content: center; } & > div > input { padding-top: 5px; padding-bottom: 5px; padding-left: 15px; padding-right: 15px; width: 290px; height: 30px; font-size: 14px; border: 1px solid rgb(222, 226, 230); } ` ;export const LoginFooter = styled.div ` border-top: 1px solid rgb(222, 226, 230); padding: 7px 16px; text-align: right; & > button { padding: 6px 12px; color: #fff; background-color: #6c757d; border-radius: 5px; font-size: 13px; } ` ;
Styled-Component 적용하기 import React , { useState, useCallback } from "react" ;import { LoginBody , LoginFooter , LoginHeader , ModalBackGround , ModalBox , } from "../assets/css/login" ; const LoginTemplate = ({ open, close } ) => { const [form, setForm] = useState ({ email : "" , password : "" , }); const onChange = useCallback ( (e ) => { setForm ({ ...form, [e.target .name ]: e.target .value , }); }, [form] ); return open ? ( <ModalBackGround > <ModalBox > <LoginHeader > 로그인 <button className ="close" onClick ={close} > {" "} × {" "} </button > </LoginHeader > <LoginBody className ="login-body" > <div > <input id ="email" name ="email" type ="email" placeholder ="Email" onChange ={onChange} /> </div > <div > <input id ="password" name ="password" type ="password" placeholder ="Password" onChange ={onChange} /> </div > </LoginBody > <LoginFooter > <button onClick ={close} > 닫기</button > </LoginFooter > </ModalBox > </ModalBackGround > ) : null ; }; export default LoginTemplate ;