인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

홍주미님의 프로필 이미지

작성한 질문수

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

댓글 수정 함수 바인딩이 안되는 것 같습니다.

해결된 질문

작성

·

31

·

수정됨

0

 

 

import BoardCommentWriteUI from "./boardCommentWrite.presenter";
import { ChangeEvent, useState } from "react";
import { useMutation } from "@apollo/client";
import {
  CREATE_BOARD_COMMENT,
  UPDATE_BOARD_COMMENT,
} from "./boardCommentWrite.queries";
import { useRouter } from "next/router";
import { FETCH_BOARD_COMMENTS } from "../list/boardCommentList.queries";

import {
  IMutation,
  IMutationCreateBoardCommentArgs,
  IMutationUpdateBoardCommentArgs,
} from "../../../../commons/types/generated/types";
import { IBoardCommentWriteProps } from "./boardCommentWrite.types";

export default function BoardComment(props: IBoardCommentWriteProps) {
  const [createBoardComment] = useMutation<
    Pick<IMutation, "createBoardComment">,
    IMutationCreateBoardCommentArgs
  >(CREATE_BOARD_COMMENT);

  const [updateBoardComment] = useMutation<
    Pick<IMutation, "updateBoardComment">,
    IMutationUpdateBoardCommentArgs
  >(UPDATE_BOARD_COMMENT);

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

  const router = useRouter();

  const handleChangeWriter = (event: ChangeEvent<HTMLInputElement>) => {
    setWriter(event.target.value);
  };

  const handleChangePassword = (event: ChangeEvent<HTMLInputElement>) => {
    setPassword(event.target.value);
  };

  const handleChangeComment = (event: ChangeEvent<HTMLTextAreaElement>) => {
    setComment(event.target.value);
  };

  const updateComment = () => {
    alert("수정하기 입니다.");
  };

  const onClickSubmitComment = async () => {
    try {
      if (typeof router.query.boardId !== "string") {
        alert("시스템에 문제가 있습니다.");
        return;
      }

      const result = await createBoardComment({
        variables: {
          createBoardCommentInput: {
            writer,
            password,
            contents: comment,
            rating: star,
          },
          boardId: router.query.boardId,
        },
        refetchQueries: [
          {
            query: FETCH_BOARD_COMMENTS,
            variables: { boardId: router.query.boardId },
          },
        ],
      });
    } catch (error) {
      if (error instanceof Error) {
        alert(error.message);
      }
    }
    setWriter("");
    setComment("");
    setPassword("");
    setStar(0);
  };

  return (
    <BoardCommentWriteUI
      handleChangeWriter={handleChangeWriter}
      handleChangePassword={handleChangePassword}
      handleChangeComment={handleChangeComment}
      onClickSubmitComment={onClickSubmitComment}
      updateComment={updateComment}
      setStar={setStar}
      writer={writer}
      comment={comment}
      password={password}
      el={props.el}
    />
  );
}

boardCommentWriter.container.tsx 에서 updateComment 바인딩이 안된것인지

함수가 작동을 안하는 것인지

updateComment의 "수정하기 입니다. " 알림창이 안뜹니다.

수정/삭제 버튼 onClick 내부에서 해봐도 태그 바깥에서 삼항연산자를 써보아도 적용이.. 안됩니다. onClickSubmitComment 함수는 제대로 작동하는데 말이죠 ㅠㅠ 도저히 왜 안되는지 모르겠어요

import * as S from "../../board/commons/style/style";
import * as Own from "./boardCommentWrite.styles";
import { IBoardCommentWriteProps } from "./boardCommentWrite.types";

export default function BoardCommentWriteUI(props: IBoardCommentWriteProps) {
  console.log(props.el);
  return (
    <S.BoardWrapper>
      <S.Row>
        <Own.Writer
          placeholder="작성자"
          onChange={props.handleChangeWriter}
          value={props.editComment ? props.el?.writer : props.writer}
          readOnly={props.editComment}
        />
        <Own.Password
          placeholder="비밀번호"
          onChange={props.handleChangePassword}
          value={props.password}
        />
        <Own.RankWrapper>
          <Own.RateComment
            value={props.editComment && props.el.rating}
            onChange={props.setStar}
          />
        </Own.RankWrapper>
      </S.Row>
      <Own.Comment
        onChange={props.handleChangeComment}
        placeholder="댓글을 입력해주세요."
        value={props.editComment ? props.el.contents : props.comment}
      />
      <Own.BottomComments>
        <S.Row>
          <p>0</p>
          <div>/</div>
          <p>100</p>
        </S.Row>
        {/* <Own.SubmitButton
          onClick={
            props.editComment ? props.updateComment : props.onClickSubmitComment
          }
        >
          {props.editComment ? "수정하기" : "등록하기"}
        </Own.SubmitButton> */}

        {props.editComment ? (
          <Own.SubmitButton onClick={props.updateComment}>
            수정하기
          </Own.SubmitButton>
        ) : (
          <Own.SubmitButton onClick={props.onClickSubmitComment}>
            등록하기
          </Own.SubmitButton>
        )}
      </Own.BottomComments>
    </S.BoardWrapper>
  );
}

 

 

 

답변 1

0

노원두님의 프로필 이미지
노원두
지식공유자

안녕하세요! 룰루리랄라님!

올려주신 코드만 보아서는 오타도 없고, 제대로 작동해야 정상일 것 같아요!

보통, 이렇게 "당연히 돼야하는데 왜 안되지...?" 와같은 문제를 만나게 되시면,
꼭 이 질문 이외에도 아래의 방법을 항상 따라해 보시면 거의 100% 해결되실겁니다!^^

 

 

[대부분의 문제 종류]

  1. node_modules, .next 등의 문제

  2. 알고보니 잘못 작성했던 코드상의 오류

  3. 버전 문제

 

 

[해결방법]

  1. node_modules와 .next 폴더를 삭제하고 yarn install을 다시 해 주시고 실행해보세요!
    => 기존에 실행했던 코드내역이 새로운 코드로 리프레시가 안되었거나, 새롭게 적용되는 과정에서 발생된 문제일 수 있어요!

     

  2. 위 1번으로 해결이 안되었다면, 지금 해결하려는 내용을 제외하고 나머지 모든부분을 주석합니다.(관련된 내용의 함수명/변수명을 조금씩 변경해 보거나, console.log를 활용하여 잘 넘어오는지 체크해 보세요)
    1) 그랬는데 되는 경우: 주석했던 내용을 풀면서 어떤 주석을 풀었을때 문제가 발생하는지 찾아내기
    2) 그랬는데도 안되는 경우: 새로운 next폴더를 create-next-app으로 생성한 다음, 관련 파일만 최소한으로 이동시켜서 실행 => 보통은 여기서 다 해결됩니다(여기서 해결되면 본 프로젝트 폴더에서 app, layout 등 관련된내용 전부다 주석처리하고 하나씩 풀면서 원인을 찾아갑니다)

     

  3. 보통 2번까지 했는데도 안되신다면, 그건 버전문제가 99%이므로, create-next-app을 다른 버전으로 만들거나, 추가로 설치되는 라이브러리를 버전을 바꿔가면서 설치해보시면 결국 해결됩니다!^^