[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)
  • 블로그 메뉴

    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.