강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

dlwjdgus3217님의 프로필 이미지
dlwjdgus3217

작성한 질문수

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

작성

·

1K

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

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

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

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

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

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

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

dlwjdgus3217님의 프로필 이미지
dlwjdgus3217

작성한 질문수

질문하기