mingg IT

[React] React Clean Code 기법 본문

FrontEnd

[React] React Clean Code 기법

mingg123 2022. 7. 25. 00:05

React에서 clean 코드를 작성하는 방법을 소개 하려고 한다.

 

1. Dialog 로직 분리하기

보통 우리가 dialog를 쓸 때

버튼을 만들고, useState를 만들고 이에 따라 dialog를 open 하고 닫는 코드를 사용한다.

 

(리팩토링 전)

Home.tsx

const Home: React.FunctionComponent<IHomeProps> = props => {
  const [open, setOpen] = useState<boolean>(false);
  const onClick = () => {
    setOpen(true);
  };
  const onClose = () => {
    setOpen(false);
  };
  return (
    <div>
      <div>Here is Home </div>
      <Button color="primary" onClick={onClick}>
        Button
      </Button>
      <Dialog open={open} maxWidth={"lg"}>
        <DialogTitle id="homeDialogTitle">Title</DialogTitle>
        <DialogContent>Content</DialogContent>
        <DialogActions>
          <Button onClick={onClose}>close</Button>
        </DialogActions>
      </Dialog>
    </div>
  );
};

보통 이런식으로 사용해왔다. 허나 보면 Home 컴포넌트에서 Dialog를 위해 필요한 open, setOpen 같은 state가 있다.

이럴 필요가 없다.

 

Home.tsx

interface IHomeProps {}

const Home: React.FunctionComponent<IHomeProps> = props => {
  return (
    <div>
      <div>Here is Home </div>
      <HomeDialog />
      <div>End</div>
    </div>
  );
};

 

HomeDialog.tsx

import React, { useState } from "react";
import {
  Button,
  Dialog,
  DialogActions,
  DialogContent,
  DialogTitle,
} from "@material-ui/core";
interface IHomeDialogProps {}

const HomeDialog: React.FunctionComponent<IHomeDialogProps> = props => {
  const [open, setOpen] = useState<boolean>(false);
  const onClick = () => {
    setOpen(true);
  };
  const onClose = () => {
    setOpen(false);
  };
  return (
    <>
      <Button color="primary" onClick={onClick}>
        Button
      </Button>
      <Dialog open={open} maxWidth={"lg"}>
        <DialogTitle id="homeDialogTitle">Title</DialogTitle>
        <DialogContent>Content</DialogContent>
        <DialogActions>
          <Button onClick={onClose}>close</Button>
        </DialogActions>
      </Dialog>
    </>
  );
};

export default HomeDialog;

이런식으로 사용하면된다. 

Dialog에 필요한 컴포넌트를 전부 빼고, 버튼 또한 뺀다. 

 

dialog자체가 position : absolute기 때문에

 

이런식으로 구현하게 되면 컴포넌트에서 필요한 비지니스 로직을 훨씬 편하게 확인할 수 있음. 

Comments