inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

react input창 입력 후 button클릭 시 초기화 하는 방법 질문

1066

dlwjdgus3217

작성한 질문수 10

0

댓글 기능 창에서 input에 작성자 비밀번호 내용을 입력하고 등록하기 버튼을 클릭하면 댓글이 잘 생성이 되지만 input창이 비어지지 않습니다.

 

container와 presenter 코드입니다.

import CommentWriteUI from "./BoardComment.presenter";
import { FETCH_COMMENTS } from "../list/BoardCommentList.queries";
import { useRouter } from "next/router";
import { useState } from "react";
import type { ChangeEvent } from "react";
import type { IUpdateBoardCommentInput } from "../../../../../commons/types/generated/types";
import type { ICommentWriteProps } from "./BoardComment.types";
import {
  useMutationCreateComment,
  useMutationUpdateComment,
} from "../../../../commons/hooks/mutations/useMutationBoardComment";

export default function CommentWrite(props: ICommentWriteProps): JSX.Element {
  const [createBoardComment] = useMutationCreateComment();
  const [updateBoardComment] = useMutationUpdateComment();

  const [writer, setWriter] = useState("");
  const [password, setPassword] = useState("");
  const [contents, setContents] = useState("");
  const [star, setStar] = useState(0);

  const router = useRouter();

  function onChangeWriter(event: ChangeEvent<HTMLInputElement>): void {
    setWriter(event.target.value);
  }

  function onChangePassword(event: ChangeEvent<HTMLInputElement>): void {
    setPassword(event.target.value);
  }

  function onChangeContents(event: ChangeEvent<HTMLTextAreaElement>): void {
    setContents(event.target.value);
  }

  const resetFields = () => {
    setWriter("");
    setPassword("");
    setContents("");
  };

  const onClickSubmit = async (): Promise<void> => {
    const result = await createBoardComment({
      variables: {
        createBoardCommentInput: {
          writer,
          password,
          contents,
          rating: star,
        },
        boardId: String(router.query.number),
      },
      refetchQueries: [
        {
          query: FETCH_COMMENTS,
          variables: { boardId: router.query.number },
        },
      ],
    });
    console.log(writer);
    resetFields();
  };

  const onClickEdit = async (): Promise<void> => {
    const updateBoardCommentInput: IUpdateBoardCommentInput = {};
    if (contents !== "") updateBoardCommentInput.contents = contents;
    if (star !== 0) updateBoardCommentInput.rating = star;

    if (typeof props.el?._id !== "string") {
      alert("시스템에 문제가 있습니다.");
      return;
    }
    try {
      const result = await updateBoardComment({
        variables: {
          updateBoardCommentInput,
          password,
          boardCommentId: props.el?._id,
        },
        refetchQueries: [
          {
            query: FETCH_COMMENTS,
            variables: { boardId: router.query.number },
          },
        ],
      });
      console.log(result);
      props.setIsEdit(false);
    } catch (error) {
      if (error instanceof Error) alert(error.message);
    }
  };

  return (
    <CommentWriteUI
      onClickSubmit={onClickSubmit}
      onChangeWriter={onChangeWriter}
      onChangePassword={onChangePassword}
      onChangeContents={onChangeContents}
      setStar={setStar}
      isEdit={props.isEdit}
      onClickEdit={onClickEdit}
      writer={writer}
      el={props.el}
      data={props.data}
    />
  );
}

 

import * as S from "./BoardComment.styles";
import type { ICommentWriteUIProps } from "./BoardComment.types";

export default function CommentWriteUI(
  props: ICommentWriteUIProps,
): JSX.Element {
  return (
    <>
      <S.Wrapper>
        <S.TitleBox>
          <span>댓글</span>
        </S.TitleBox>
        <S.BodyWrapper>
          <S.InfoWrapper>
            <S.Writer
              placeholder="작성자"
              readOnly={Boolean(props.el?.writer)}
              onChange={props.onChangeWriter}
              defaultValue={props.isEdit ? props.el?.writer : ""}
            />
            <S.Password
              placeholder="비밀번호"
              onChange={props.onChangePassword}
              type="password"
            />
            <S.Star
              onChange={props.setStar}
              defaultValue={props.isEdit ? props.el?.rating : 0}
            />
          </S.InfoWrapper>
          <S.ContentWrapper>
            <S.Content
              placeholder="개인정보를 공유 및 요청하거나, 명예 훼손, 무단 광고, 불법 정보 유포시 모니터링 후 삭제될 수 있으며, 이에 대한 민형사상 책임은 게시자에게 있습니다."
              onChange={props.onChangeContents}
              defaultValue={props.isEdit ? props.el?.contents : ""}
            ></S.Content>
            <S.SubmitWrapper>
              <span>0/100</span>
              <S.SubBtn
                onClick={props.isEdit ? props.onClickEdit : props.onClickSubmit}
              >
                등록하기
              </S.SubBtn>
            </S.SubmitWrapper>
          </S.ContentWrapper>
        </S.BodyWrapper>
      </S.Wrapper>
    </>
  );
}


하지만 저 화면에서 등록하기를 누를 시 빈 값이 입력됩니다. 또한 console.log(writer)를 해보면 공란이 나옵니다. 즉, 데이터는 없는데 화면이 리렌더되지 않습니다.

 

 

해결 부탁드립니다!

답변 1

0

인프런 AI 인턴

안녕하세요 dlwjdgus3217 님, 인프런 AI 인턴이에요.

제시해주신 코드를 살펴보니, CommentWrite 컴포넌트에서 resetFields 함수를 만들어 input 필드들을 초기화하고 있습니다. 하지만, resetFields 함수가 어떤 상황에서 호출되는지 확인할 수는 없었습니다.

확인해야 할 사항은 다음과 같습니다:

  1. onClickSubmit 함수 내에서 resetFields 함수가 호출되는지 확인해주세요. console.log(writer) 다음에 위치해야 합니다.
  2. onClickEdit 함수 내에서도 필요한 경우 resetFields 함수를 호출하여 input 필드들을 초기화해주세요.

만약 위 사항을 확인했음에도 계속해서 input 필드들이 초기화되지 않는다면, 다른 부분에서 문제가 발생할 수 있습니다. 이 경우 환경에 따라 다른 코드 수정이 필요할 수 있습니다. 하지만 초기 분석으로는 입력 값이 초기화되도록 코드 작성이 되어야 한다고 보입니다.

문제가 해결되지 않을 경우, 코드를 더 자세히 살펴봐야 할 수도 있습니다. 추가적인 정보가 있으면 도움을 드릴 수 있을 것입니다. 감사합니다!

맥유저 입장의 고려해주세요

2

57

1

케이테스트 서버 운영 방법

2

52

1

수업 잘 들었습니다.

2

23

2

실행과정 질문입니다.

2

11

1