[React] Edit Page 보완 - defaultValue와 myvariables

2023. 3. 18. 09:56·Front/React

지난번에 만든 등록페이지와 수정페이지

https://sy-blog.tistory.com/103

 

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

BoardWrite()라는 컴포넌트를 만들어서 등록페이지와 수정페이지에서 재사용 할 것이다 등록페이지에 들어갔을때는 등록이라고 뜨고, 수정페이지에 들어갔을 때는 수정이라고 떠야하는데 페이지

sy-blog.tistory.com

여기서 수정하기는 구현했지만 조금의 문제가 있었다..!!

 

 

수정페이지로 이동했을 때 하나의 input 만 채우고 수정해버리면 나머지 내용이 사라진다는 것....

이유는 state! 코드를 살펴보면

const [writer, setWriter] = useState("");
const [title, setTitle] = useState("");
const [contents, setContents] = useState("");

writer, title, contents의 초기값은 공백이다

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

따라서 수정페이지에 입력을 하면 입력한 값만 채워지고 나머지는 공백으로 나온다.

 

두가지를 수정할 건데

1. 수정하기 버튼을 눌러 수정페이지로 이동했을 때 기존에 입력했던 값 보여주기(fetchBoard에서 가져오면 됨)

2. writer, title, contents 중 하나만 수정해도 나머지값들은 그대로 존재해야됨!!

 

첫번째 부분부터 수정해보자

기존에 입력했던 값을 보여주기 위해서는 html에서 기본으로 제공하는 defaultValue를 사용하면 된다.

 

fetchBoard에서 데이터를 가져와야 하기 때문에 import 해주기!

//수정페이지

import BoardWrite from "@/src/components/units/board/08_write/BoardWrite.container";
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) },
  });

  return <BoardWrite isEdit={true} data={data} />;
}

defaultValue 사용

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

다음과 같이 수정페이지로 이동했을 때 데이터가 그대로 보이게 된다. 하지만 defaultValue는 fetchBoard의 값만 보여줄 뿐 실제 데이터가 들어있지 않기 때문에 여전히 수정하기를 누르면 값이 모두 사라져버린다.

 

그렇다면 2. writer, title, contents 중 하나만 수정해도 나머지값들은 그대로 존재해야됨!!

을 구현해보자

 

const myvariables = { number: Number(router.query.number) };
    if (writer) myvariables.writer = writer;
    if (title) myvariables.title = title;
    if (contents) myvariables.contents = contents;

myvariables라는 변수를 만든다음 number는 변해서는 안되기 때문에 초기값으로 둔다.

 

if문은 살펴보면 if(writer) 는 state writer가 빈 값이 아니라면 state writer에 있는 값을 추가한다는 뜻이다

나머지 title과 contents도 마찬가지!

const onClickUpdate = async () => {
    const myvariables = { number: Number(router.query.number) };
    if (writer) myvariables.writer = writer;
    if (title) myvariables.title = title;
    if (contents) myvariables.contents = contents;

    //수정하기 뮤테이션 날리기
    const result = await updateBoard({
      variables: myvariables,
    });
    //2.상세페이지로 이동하기
    alert("수정되었습니다");
    router.push(`/section07/10_boards/${router.query.number}`);
  };

여기서 variables : {myvariables}, 가 되지 않도록 주의!!

 

이렇게 코드를 수정한 후 실행해보면

 

두가지 문제점을 모두 보완했다.

오늘 배운거 잘 복습하고 기억해두자😆

저작자표시 (새창열림)

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

[React] 카카오 지도 구현  (0) 2023.04.24
Next.js 리렌더링하면 Styled-Components 적용 안됨  (0) 2023.04.13
[Error] cSpell Unknown word 무시하기  (0) 2023.03.16
[React] 컴포넌트(Component) 재사용  (0) 2023.03.16
[Error]  (0) 2023.03.12
'Front/React' 카테고리의 다른 글
  • [React] 카카오 지도 구현
  • Next.js 리렌더링하면 Styled-Components 적용 안됨
  • [Error] cSpell Unknown word 무시하기
  • [React] 컴포넌트(Component) 재사용
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)
  • 블로그 메뉴

    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
soyeon26
[React] Edit Page 보완 - defaultValue와 myvariables

개인정보

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

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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