inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[리뉴얼] React로 NodeBird SNS 만들기

댓글 수정 기능 추가 문제

710

긴장한 곰

작성한 질문수 25

0

안녕하세요 제로초 선생님. 댓글 수정 기능을 추가하던 도중에 React의 성질과 관련하여 질문이 생겨 질문드립니다.
PostCard.js에서 CommentForm 컴포넌트와 CommentEditForm 컴포넌트 2개로 구성을 바꿨습니다. 그리고 post 데이터를 props로 넘겨주었습니다.
{commentFormOpened && (
                <div>
                    <CommentForm post={post} />
                    <CommentEditForm post={post} />
                </div>
            )}
CommentForm.js는 아래와 같습니다
...

const CommentForm = ({ post }) => {
  const dispatch = useDispatch();

...

  useEffect(() => {
    if (addCommentDone) {
        setCommentText('');
    }
  }, [addCommentDone]);
  
  const onSubmitComment = useCallback(() => {
    console.log(idpost.idcommentText);
    dispatch({
      type: ADD_COMMENT_REQUEST,
      data: { content: commentTextpostId: post.iduserId: id },
    });
  }, [commentTextid]);
  
  return (
      <>
        <Form onFinish={onSubmitComment}>
          <Form.Item style={FormItem}>
            <Input.TextArea 
            rows={4} 
            value={commentText}
            onChange={onChangeCommentText} 
            />
            <Button 
            style={ButtonStyle} 
            type="primary" 
            htmlType="submit"
            loading={addCommentLoading}
            >
              게시
            </Button>
          </Form.Item>
        </Form>
      </>
  );
};

CommentForm.propTypes = {
  post: PropTypes.object.isRequired,
};

export default CommentForm;
CommentEditForm.js는 아래와 같습니다
...

const { TextArea } = Input;
const CommentEditForm = ({ post }) => {
    const dispatch = useDispatch();
    const id = useSelector((state=> state.user.me?.id);
    const [editTextsetEditText] = useState('');
    const [commentEditModesetCommentEditMode] = useState(false);
    const onReviseCommentText = useCallback((e=> {
      setEditText(e.target.value);
    });
    const { reviseCommentLoading } = useSelector((state=> state.post);

    const onReviseComment = useCallback(() => {
        dispatch({
            type: REVISE_COMMENT_REQUEST,
            data: {
                content: editText,
                PostId: post.id,
                UserId: id,
                },
            });
        }, [editTextid]);

    const onClickReviseComment = useCallback(() => {
        setCommentEditMode(true);
    });

    const onCancelReviseComment = useCallback(() => {
        setCommentEditMode(false);
    }, []);

    return (
        <div>
          {commentEditMode
          ? (
            <>
              <TextArea value={editText} onChange={onReviseCommentText} />
              <Button.Group>
                <Button loading={reviseCommentLoading} onClick={onReviseComment}>수정</Button>
                <Button type="danger" onClick={onCancelReviseComment}>취소</Button>
              </Button.Group>        
            </>
          )
          : (
            <List
            header={`${post.Comments.length}개의 댓글`}
            itemLayout="horizontal"
            dataSource={post.Comments || []}
            renderItem={(item=> (
                <li>
                    <Comment
                        actions={[
                        <div style={fontSize: '13px'marginRight: '10px' }}>
                            {moment(item.createdAt).format('MM.DD HH:mm')}
                        </div>,
                        <span style={fontSize: '13px' }} onClick={onClickReviseComment}>
                            수정하기
                        </span>,
                        ]}
                        author={item.User.nickname}
                        avatar={<Link href={`/user/${item.User.id}`} prefetch={false}><a><Avatar>{item.User.nickname[0]}</Avatar></a></Link>}
                        content={item.content}
                    />
                  
            )}
            />
            )}
        </div>
    );
};

CommentEditForm.propTypes = {
    post: PropTypes.object.isRequired,
};
  
export default CommentEditForm;
게시글 수정때와 유사하게 컴포넌트를 만들었는데, 이렇게 만들고 comment를 열려고 하면
이런 오류가 출력됩니다. post.Comments가 undefined라는 것인데, postCard.js은 index.js로부터 post를, CommentEditForm은 postCard.js로부터 post를 전달 받고 있어 index.js -> PostCard.js -> CommentEditForm 이렇게 2개 계층을 걸쳐 post를 전달받고 있기 때문에 이런 문제가 발생하는 것일까요?

redux react nodejs express Next.js

답변 1

0

제로초(조현영)

말 그대로 post.Comments가 안 들어있는 겁니다.

post는 누가 보내주는 건지 생각해보시면 됩니다. post는 서버에서 옵니다. 따라서 post.Comments도 서버에서 오겠죠. 서버에서 post.Comments를 안 넣어준 겁니다. 서버쪽 라우터에서 post에 comments가 include되지 않은 겁니다.

0

긴장한 곰

감사합니다! 근데 추가로 궁금한 것이 생겼는데, 만약에 댓글을 지우거나 수정하려고 하면 댓글의 id가 필수적으로 필요할 것 같은데 이를 찾을 수 있는 방법을 잘 모르겠습니다.

예를 들어, reducer에서

    case REMOVE_COMMENT_SUCCESS: {
      // 지우고자 하는 댓글이 달린 게시글 찾기
      const post = draft.mainPosts.find((v=> v.id === action.data.PostId);
      // 그 게시글의 댓글 찾기 (객체)
      const comment = post.find((v=> v.id === action.data.UserId);
...
   }

여기까지 하면 게시글을 찾고, 그 게시글 안에서 특정 사용자가 작성한 댓글까지는 찾을 수 있을 것 같습니다. 그런데 그 특정 사용자가 댓글을 하나가 아니라 여러개를 달았을 수도 있는데 이를 구분해내는 방법을 생각해내는 데에서 막혔습니다.

    const onRemoveComment = useCallback(() => {
        if (!id) {
            return alert('로그인이 필요합니다');
        }
        return dispatch({
          type: REMOVE_COMMENT_REQUEST,
          data: {
            PostId: post.id,
            UserId: id,
          },
        });
    }, [id]);

현재는 프론트에서 PostId와 UserId만 받아온 뒤에 reducer에서 PostId와 UserId만을 이용해 특정 댓글을 찾아내려고 하고 있는데, 프론트에서 지우려고하는 댓글의 id까지 받아올 수 있는 방법이 있을까요? 

0

제로초(조현영)

댓글 아이디를 action의 data로 넘겨주시면 됩니다.

넥스트 버젼 질문

0

90

2

로그인시 401 Unauthorized 오류가 뜹니다

0

104

1

무한 스크롤 중 스크롤 튐 현상

0

192

1

특정 페이지 접근을 막고 싶을 때

0

116

2

createGlobalStyle의 위치와 영향범위

0

102

2

인라인 스타일 리렌더링 관련

0

97

2

vsc 에서 npm init 설치시 오류

0

157

2

nextjs 15버전 사용 가능할까요?

0

166

1

화면 새로고침 문의

0

129

1

RTK에서 draft, state 차이가 있나요?

0

160

2

Next 14 사용해도 될까요?

0

455

1

next, node 버전 / 폴더 구조 질문 드립니다.

0

359

1

url 오류 질문있습니다

0

214

1

ssh xxxxx로 우분투에 들어가려니까 port 22: Connection timed out

0

391

1

sudo certbot --nginx 에러

0

1293

2

Minified React error 콘솔에러 (hydrate)

0

477

1

카카오 공유했을 때 이전에 작성했던 글이 나오는 버그

0

255

1

프론트서버 배포 후 EADDRINUSE에러 발생

0

337

1

npm run build 에러

0

525

1

front 서버 npm run build 중에 발생한 에러들

0

399

1

서버 실행하고 브라우저로 들어갔을때 404에러

0

350

2

css 서버사이드 랜더링이 적용되지 않아서 문의 드립니다.

0

290

1

팔로워 3명씩 불러오고 데이터 합쳐주는걸로 바꾸고 서버요청을 무한으로하고있습니다.

0

249

2

해시태그 검색에서 throttle에 관해 질문있습니다.

0

206

1