221223 - TIL

Junho Yun·2022년 12월 25일
0

TIL

목록 보기
38/81
post-thumbnail
import styled from "styled-components";
import { useDispatch } from "react-redux";
import CustomBtn from "./CustomBtn";
import { deleteBoard } from "../redux/modules/boardSlice";

const BoardItemBox = styled.div`
  border: 1px solid gray;
  border-radius: 20px;

  max-width: 320px;
  min-height: 170px;

  padding: 20px;
`;

const Close = styled.button`
  border: 0px;
  font-size: 24px;
`;

const TitleBox = styled.h2`
  background-color: aqua;
  min-height: 70px;
`;

const BoardItem = () => {
  const dispatch = useDispatch();

  const propsinit = [
    {
      id: "vzSp-jzTXppJSSP3eLZ3k",
      category: "working",
      title: "진행 중 제목",
      content: "보드 내용",
      pw: "보드 비밀번호",
      comments: [
        {
          id: "h-e0M_yaI40OgkHQv_0Yd",
          name: "작성자 이름",
          pw: "작성자 비밀번호",
          comment: "댓글",
        },
      ],
    },
    {
      id: "L1--H0Ob0NOMlfXUHt9r5",
      category: "validate",
      title: "QA 제목",
      content: "보드 내용",
      pw: "보드 비밀번호",
      comments: [
        {
          id: "CP93RdIrJI_xPxj0AVvjd",
          name: "작성자 이름",
          pw: "작성자 비밀번호",
          comment: "댓글",
        },
      ],
    },
  ];

  const onDelete = (id) => {
    dispatch(deleteBoard(id));
  };

  return (
    <BoardItemBox>
      <div> 담당자 </div>
      <TitleBox> {propsinit[0].title} </TitleBox>
      <CustomBtn
        category="progress"
        BoardItemId={propsinit[0].id}
        nameBtn="착수"
      >
        착수
      </CustomBtn>
      <CustomBtn category="back" BoardItemId={propsinit[0].id} nameBtn="번복">
        번복
      </CustomBtn>
      <CustomBtn
        category="validate"
        BoardItemId={propsinit[0].id}
        nameBtn="검토"
      >
        검토
      </CustomBtn>
      <CustomBtn
        category="complete"
        BoardItemId={propsinit[0].id}
        nameBtn="완료"
      >
        완료
      </CustomBtn>
      <CustomBtn
        category="archive"
        BoardItemId={propsinit[0].id}
        nameBtn="저장"
      >
        저장
      </CustomBtn>
      <Close
        onClick={() => {
          onDelete(propsinit[0].id);
        }}
      >
        x
      </Close>
    </BoardItemBox>
  );
};

export default BoardItem;

KANBAN Board에서 board component 를 담당했고 만들었습니다.
대표기능은 axios.patch를 사용한 category update와 exit(x표시 버튼)을 클릭했을 때 사용될 delete 기능 입니다. css는 이후 main page와 합치고 색상 및 layout을 수정할 예정입니다.

CustomBtn을 통해 button을 컴포넌트화 시켰는데 조금 더 간결할 수 있도록 고민해야겠습니다.
어려울 것 같진 않습니다. switching 될 수 있도록 버튼 컴포넌트를 수정하면 될 것 같습니다.

import styled from "styled-components";
import { useDispatch } from "react-redux";
import { toggle } from "../redux/modules/boardSlice";

const CustomBtnStyle = styled.button`
  margin: 5px;
`;

const CustomBtn = ({ nameBtn, BoardItemId, category }) => {
  const dispatch = useDispatch();

  const onToggle = (BoardItemId, category) => {
    dispatch(toggle([BoardItemId, category]));
  }; 

  return (
    <CustomBtnStyle onClick={() => onToggle(BoardItemId, category)}>
      {nameBtn}
    </CustomBtnStyle>
  );
};

export default CustomBtn;

커스텀한 button component 입니다.
useDispatch를 사용해서 toggle 함수 (category를 수정해줄 예정)를 사용합니다.

const boardSlice = createSlice({
  name: "boards",
  initialState,
  reducers: {
    toggle: (state, action) => {
      axios.patch(`http://localhost:3001/boards/${action.payload[0]}`, {
        category: action.payload[1],
      });

      state.boards.forEach((todo) => {
        if (todo.id == action.payload) {
          todo.category = action.payload[1];
        }
      });
    },
    deleteBoard: (state, action) => {
      axios.delete(`http://localhost:3001/boards/${action.payload}`);
      state.todos = state.boards.filter((board) => board.id !== action.payload);
    },
  },
  extraReducers: (builder) => {
   ...
  }
});

slice 부분입니다. reducers에 toggle과 deleteBoaad 를 추가했습니다.
patch를 사용할 때 api가 잘 이해가지 않아서 조금 고생했습니다. (30분정도...)
일단 초기값을 임시로 받아서 사용할 때는 문제가 없습니다. 그러나 자세한 확인은 실제 crud 모두를 구성하고 확인해봐야할 것 같습니다.

위의 기능들을 모두 구성하는데 5시부터 9시까지 걸렸던 것 같습니다. 총 4시간이 걸렸다는 것인데. 2시간이면 뚝딱할 거를 너무 질질 끌었던 것 같습니다. 근본 없는 실력이 문제인듯. 탄탄한 실력이 될 수 있도록 더더더더더더더더더더더더더 노력할 것

profile
의미 없는 코드는 없다.

0개의 댓글