[React] 컴포넌트(Component) 재사용

2023. 3. 16. 06:40·Front/React

BoardWrite()라는 컴포넌트를 만들어서

등록페이지와 수정페이지에서 재사용 할 것이다

 

vscode의 창을 이렇게 분할해서 쓰면 편하다

 

등록페이지에 들어갔을때는 등록이라고 뜨고, 수정페이지에 들어갔을 때는 수정이라고 떠야하는데 페이지 2개를 만들 필요없이 컴포넌트를 재사용해서 만들 수 있다.

 

export default function BoardWriteUI(props) {

  return (
    <div>
      <h1>{props.isEdit ? "수정" : "등록"}페이지</h1>
      작성자: <RedInput type="text" onChange={props.onChangeWriter} /> <br />
      제목: <input type="text" onChange={props.onChangeTitle} /> <br />
      내용: <input type="text" onChange={props.onChangeContents} /> <br />
      <BlueButton
        onClick={props.isEdit ? props.onClickUpdate : props.onClickSubmit}
        color={props.mycolor}
      >
        {props.isEdit ? "수정하기" : "등록하기"}
      </BlueButton>
    </div>
  );
}

 

props를 이용하면 된다.

{props.isEdit ? "수정하기" : "등록하기"} 에서 isEdit가 true면 수정하기 false면 등록하기가 뜬다.

 

 

 

 

여기서 주의할 점은 number 인데

등록하기 버튼을 눌렀을 때 실행되는 onCliclSubmit 함수를 보면

 

const onClickSubmit = async () => {
    const result = await createBoard({
      variables: {
        writer: writer,
        title: title,
        contents: contents,
      },
    });
    alert(result.data.createBoard.message);
    router.push(`/section07/10_boards/${result.data.createBoard.number}`);
  };

 

router.push(`/section07/10_boards/${result.data.createBoard.number}`);

라우터를 이용해서 페이지를 이동하는 것을 확인 할 수 있다. 여기서 result.data.createBoard.number는 graphql에서 받아온 데이터이다.

export const CREATE_BOARD = gql`
  mutation createBoard($writer: String, $title: String, $contents: String) {
    createBoard(writer: $writer, title: $title, contents: $contents) {
      _id
      number
      message
    }
  }
`;

 

다음과 같이 createBoard를 실행했을 때 DB에서 number를 받아올 수 있다. 이를 확인하기 위해 등록하기 버튼을 누르면

 

 

number를 확인할 수 있다. 그러면 이제 result.data.createBoard.number가 아니라 router.query.number를 사용할 수 있다.

 

section07/10_boards/[number]

//상세페이지

import { FETCH_BOARD } from "@/src/components/units/board/08_write/BoardWrite.queries";
import { useQuery } from "@apollo/client";
import { useRouter } from "next/router";

export default function BoardNewPage() {
  const router = useRouter();

  const { data } = useQuery(FETCH_BOARD, {
    variables: { number: Number(router.query.number) },
  });

  const onClickEdit = () => {
    router.push(`/section07/10_boards/${router.query.number}/edit`);
  };

  return (
    <div>
      <h1>상세페이지</h1>
      <div>작성자: {data?.fetchBoard.writer}</div>
      <div>제목: {data?.fetchBoard.title}</div>
      <div>내용: {data?.fetchBoard.contents}</div>
      <div>{router.query.number}번 페이지로 이동되었습니다.</div>
      <button onClick={onClickEdit}>수정하기</button>
    </div>
  );
}

 

 

BoardWrite.container.js

const onClickUpdate = async () => {
    //수정하기 뮤테이션 날리기
    const result = await updateBoard({
      variables: {
        number: Number(router.query.number),
        writer: writer,
        title: title,
        contents: contents,
      },
    });
    //2.상세페이지로 이동하기
    router.push(`/section07/10_boards/${router.query.number}`);
  };

 

이렇게 router.query.number를 사용한 걸 확인할 수 있다.

여기서 주의할점은

router.push(`/section07/10_boards/${result.data.createBoard.number}`);

으로 number를 push 해주지 않은 채 사용하게 되면 undefined 값을 받기 때문에 꼭 push 해주고 쓰기!!!

저작자표시 (새창열림)

'Front > React' 카테고리의 다른 글

[React] Edit Page 보완 - defaultValue와 myvariables  (0) 2023.03.18
[Error] cSpell Unknown word 무시하기  (0) 2023.03.16
[Error]  (0) 2023.03.12
[React] 초기 셋팅 Nodejs, npm, yarn 이해  (0) 2023.03.11
[React] Component 와 State  (0) 2023.03.08
'Front/React' 카테고리의 다른 글
  • [React] Edit Page 보완 - defaultValue와 myvariables
  • [Error] cSpell Unknown word 무시하기
  • [Error]
  • [React] 초기 셋팅 Nodejs, npm, yarn 이해
soyeon26
soyeon26
  • soyeon26
    개발 일지
    soyeon26
  • 전체
    오늘
    어제
    • 분류 전체보기 (107)
      • Web (22)
        • Web (1)
        • HTTP (0)
      • Language (29)
        • Java Script (3)
        • Type Srcipt (1)
        • Java (25)
      • Front (19)
        • HTML+CSS (4)
        • React (15)
      • Back (41)
        • Spring(Springboot) (9)
        • JSP (21)
        • Database (5)
        • NestJS (6)
      • Devops (6)
        • Docker (1)
        • Git & SVN (5)
      • App (7)
        • Android (7)
      • IT 정보 (3)
  • 블로그 메뉴

    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자바스크립트set
    데이터베이스 강의
    인프런
    React
    과학기술인 등록
    프론트엔드
    sql강의
    강의 후기
    java의 정석
    Next.js 필요성
    javascript
    Java
    React Next.js
    springboot
    과학기술인 번호 발급
    과학기술인 등록번호 발급
    강의후기
    Next.js
    과학기술인등록번호 조회
    중복제거
    백엔드
    Spring
    csrvsssr
    서블릿
    SSR
    김영한
    스프링부트
    csr과ssr의 차이
    과학기술인번호 조회
    SQL강의 추천
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
soyeon26
[React] 컴포넌트(Component) 재사용
상단으로

티스토리툴바