13-8. 덧글 렌더링하기

이제 덧글을 렌더링 할 차례입니다.

덧글의 생김새는 위와 같이 생겼습니다. 위 스타일대로, Comment 컴포넌트를 생성해주세요.

Comment 컴포넌트 만들기

src/components/Shared/PostList/Comment.js

import React from 'react';
import styled from 'styled-components';
import oc from 'open-color';

const CommentWrapper = styled.div`
    font-size: 0.9rem;
    & + & {
        margin-top: 0.25rem;
    }
`;

const User = styled.span`
    font-weight: 500;
    margin-right: 0.25rem;
    color: ${oc.gray[9]};
    text-decoration: none;
`;

const Text = styled.span`
    color: ${oc.gray[6]};
`;

const Comment = ({username, text}) => (
    <CommentWrapper>
        <User>{username}</User>
        <Text>{text}</Text>
    </CommentWrapper>
);

export default Comment;

CommentList 컴포넌트 만들기

그 다음에는 덧글 배열을 컴포넌트 배열로 변환해줄 CommentList 컴포넌트를 만들겠습니다.

나중에 덧글이 5개 이상이 되면, 5개씩 끊어서 보여주는 작업을, 여기에서 진행 할 것이기에 state 를 사용 할 수 있는 클래스형 컴포넌트로 선언을 하겠습니다.

src/components/Shared/PostList/CommentList.js

import React, { Component } from 'react';
import styled from 'styled-components';
import oc from 'open-color';
import Comment from './Comment';

const CommentListwrapper = styled.div`
    margin-top: 0.75rem;
`;

class CommentList extends Component {
    render() {

        const { comments } = this.props;
        if (comments.size === 0) return null; // 덧글이 비어있다면 아무것도 렌더링하지 않습니다.

        const commentList = comments.map(
            (comment) => (
                <Comment {...comment.toJS()} key={comment.get('_id')}/>
            )
        );

        return (
            <CommentListwrapper>
                {commentList}
            </CommentListwrapper>
        );
    }
}

export default CommentList;

CommentBlockContainer 에서 comments 전달해주기

props 에서 전달받은 posts 의 comments 를 CommentBlock 에 전달하세요.

src/containers/Shared/PostList/CommentBlockContainer.js

(...)
    render() {
        const { status, post } = this.props;
        const { visible, value } = status ? status.toJS() : { }; // status 가 존재하지 않는 경우를 위한 예외 케이스
        const { handleChange, handleKeyPress } = this;

        if(!visible) return null; // visible 이 false 면 아무것도 렌더링하지 않기

        return (
            <CommentBlock 
                value={value}
                onChange={handleChange}
                onKeyPress={handleKeyPress}
                comments={post.get('comments')}
            />
        );
    }
(...)

CommentBlock 에서 CommentList 렌더링

src/components/PostList/CommentBlock.js

import React from 'react';
import styled from 'styled-components';
import oc from 'open-color';
import CommentList from './CommentList';

(...)

const CommentBlock = ({onChange, onKeyPress, value, comments}) => (
    <Wrapper>
        <InputWrapper>
            <Input 
                value={value} 
                onChange={onChange} 
                onKeyPress={onKeyPress}
                placeholder="덧글을 입력 후 [Enter] 를 눌러 작성하세요"/>
            <CommentList comments={comments}/>
        </InputWrapper>
    </Wrapper>
);

export default CommentBlock;

Post 에서 PostFooter 로 comments 전달

덧글의 수가 제대로 나타나도록, comments 값을 PostFooter 에 전달하세요.

src/components/PostList/Post.js

(...)
const Post = ({post, onToggleLike, onCommentClick}) =>{
    const {
        _id,
        count,
        username,
        content,
        likesCount,
        liked,
        createdAt,
        comments
    } = post.toJS();

    const toggleLike = () => onToggleLike({
        postId: _id,
        liked
    });

    const commentClick = () => onCommentClick(_id);

    return (
        <Wrapper>
            <PostHead>
                <UserThumbnail image={`/api/users/${username}/thumbnail`}/>
                <Username>{username}</Username>
                <Count>#{count}번째 생각</Count>
                <Time><TimeAgo date={createdAt} formatter={formatter}/></Time>
            </PostHead>
            <Content>
                {content}
            </Content>
            <PostFooter 
                likesCount={likesCount} 
                liked={liked} 
                onToggleLike={toggleLike} 
                onCommentClick={commentClick}
                comments={comments}
            />
            <CommentBlockContainer post={post}/>
        </Wrapper>
    )
}

export default Post;

여기까지 코드 수정을 하고 나면 화면에 덧글이 잘 렌더링 될 것입니다. 하지만 덧글의 갯수가 많아지면 카드가 너무 길어지겠지요.

다음 섹션에서는, 덧글을 5개씩 끊어서 보여주는 더보기 기능을 구현해보겠습니다.

results matching ""

    No results matching ""