BoardWrite()라는 컴포넌트를 만들어서
등록페이지와 수정페이지에서 재사용 할 것이다

등록페이지에 들어갔을때는 등록이라고 뜨고, 수정페이지에 들어갔을 때는 수정이라고 떠야하는데 페이지 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 | 
