inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

게시글 구현하기

popover

343

song

작성한 질문수 29

0

안녕하세요 제로초님...예제를 조금 변형해 PostCard 를 만드는 작업을 하는 도중에 문제가 생겨서 남깁니다.

기존 action요소 에 있던  <EllipsisOutlined />

extra로 옮기면서 작업하는 도중에 Popover를 사용할 경우에

무한 콜스택으로 들어가는 문제가 생겼습니다. ㅜㅜ

그래서 Popover를 감싸지 않고  <EllipsisOutlined />를 사용해서 onClick으로 출력 해준 결과에는 잘 작동하는 것을 보였습니다. 어떤게 문제인가요? ㅜㅜPopover가 제가 모르는 다른 call을하는건지

1번코드 사진

2번코드 사진

//1번째 코드

import react, { useState, useCallback } from 'react';
import { Card, Popover, Button, List, Comment, Avatar, Skeleton } from 'antd';
import { useSelector } from 'react-redux';
import { RetweetOutlined, HeartOutlined, MessageOutlined, ShareAltOutlined, EllipsisOutlined } from '@ant-design/icons';
import PostImage from './PostImage';
import CommentForm from './CommentForm';
import PropTypes from 'prop-types';
const POSTCARD = ({ post }) => {
    console.log(post.User.id);
    const { me } = useSelector(state => state.user);
    const [commentOpen, setCommentOpened] = useState(false);
    const id = me && me.id;
    console.log(me);
    console.log(id);

    const onClickRetWeet = useCallback(
        () => {

        },
        [],
    )

    const onClickHeart = useCallback(
        () => {

        },
        [],
    )

    const onClickComment = useCallback(
        () => {
            setCommentOpened((pre) => (!pre));
        },
        [],
    )

    const onClickShared = useCallback(
        () => {

        },
        [],
    )

    const onClickmore = useCallback(
        () => {
            console.log("click more");
        },
        [],
    )

    return (
        <>
            <Card
                cover={post.Images[0] && <PostImage images={post.Images} />}

                actions={[
                    <RetweetOutlined key="retweet" onClick={onClickRetWeet} />,
                    <HeartOutlined key="edit" onClick={onClickHeart} />,
                    <MessageOutlined key="message" onClick={onClickComment} />,
                    <ShareAltOutlined key="shared" onClick={onClickShared} />,

                ]}
                extra={
                    // <Popover trigger="click"

                    //     content={(
                    //         <Button.Group>
                    //             {id && id === post.User.id ?
                    //                 <> <Button>수정</Button> <Button>삭제</Button></>
                    //                 :
                    //                 <>< Button>신고 </Button></>}
                    //         </Button.Group>
                    //     )}
                    // >
                    //     <EllipsisOutlined />
                    // </Popover>}
                    <EllipsisOutlined  onClick={onClickmore}/>
                }

            >

                <Card.Meta
                    avatar={<Avatar>{post.User.nickname[0]}</Avatar>}
                    title={post.User.nickname}
                    description={post.content}
                />
            </Card >
            {commentOpen && (

                <>
                    <Card >
                        <CommentForm post={post} />
                        <List style={{ marginTop: "20px" }}
                            header={`${post.Comments.length}개의 댓글`}
                            itemLayout="horizontal"
                            dataSource={post.Comments}
                            renderItem={item => (
                                <List.Item
                                    actions={[<a key="list-loadmore-edit">edit</a>, <a key="list-loadmore-more">more</a>]}
                                >
                                    <Skeleton avatar title={false} loading={item.loading} active>
                                        <List.Item.Meta
                                            avatar={
                                                <Avatar>{item.User.nickname[0]}</Avatar>
                                            }
                                            title={item.User.nickname}
                                            description={item.content}
                                        />
                                    </Skeleton>
                                </List.Item>
                            )}
                        />


                    </Card>


                </>

            )}



        </>


    )

}
POSTCARD.PropTypes = {

    post:PropTypes.shape({
        id: PropTypes.number,
        User: PropTypes.object,
        Comments: PropTypes.arrayOf(PropTypes.any),
        content: PropTypes.string,
        Images: PropTypes.arrayOf(PropTypes.any),
        imagePaths: PropTypes.arrayOf(PropTypes.any)


    })
   
}

export default POSTCARD;


////2번째 코드

import react, { useState, useCallback } from 'react';
import { Card, Popover, Button, List, Comment, Avatar, Skeleton } from 'antd';
import { useSelector } from 'react-redux';
import { RetweetOutlined, HeartOutlined, MessageOutlined, ShareAltOutlined, EllipsisOutlined } from '@ant-design/icons';
import PostImage from './PostImage';
import CommentForm from './CommentForm';
import PropTypes from 'prop-types';
const POSTCARD = ({ post }) => {
    console.log(post.User.id);
    const { me } = useSelector(state => state.user);
    const [commentOpen, setCommentOpened] = useState(false);
    const id = me && me.id;
    console.log(me);
    console.log(id);

    const onClickRetWeet = useCallback(
        () => {

        },
        [],
    )

    const onClickHeart = useCallback(
        () => {

        },
        [],
    )

    const onClickComment = useCallback(
        () => {
            setCommentOpened((pre) => (!pre));
        },
        [],
    )

    const onClickShared = useCallback(
        () => {

        },
        [],
    )

    // const onClickmore = useCallback(
    //     () => {
    //         console.log("click more");
    //     },
    //     [],
    // )

    return (
        <>
            <Card
                cover={post.Images[0] && <PostImage images={post.Images} />}

                actions={[
                    <RetweetOutlined key="retweet" onClick={onClickRetWeet} />,
                    <HeartOutlined key="edit" onClick={onClickHeart} />,
                    <MessageOutlined key="message" onClick={onClickComment} />,
                    <ShareAltOutlined key="shared" onClick={onClickShared} />,

                ]}
                extra={
                    <Popover trigger="click"

                        content={(
                            <Button.Group>
                                {id && id === post.User.id ?
                                    <> <Button>수정</Button> <Button>삭제</Button></>
                                    :
                                    <>< Button>신고 </Button></>}
                            </Button.Group>
                        )}
                    >
                        <EllipsisOutlined />
                    </Popover>}


            >

                <Card.Meta
                    avatar={<Avatar>{post.User.nickname[0]}</Avatar>}
                    title={post.User.nickname}
                    description={post.content}
                />
            </Card >
            {commentOpen && (

                <>
                    <Card >
                        <CommentForm post={post} />
                        <List style={{ marginTop: "20px" }}
                            header={`${post.Comments.length}개의 댓글`}
                            itemLayout="horizontal"
                            dataSource={post.Comments}
                            renderItem={item => (
                                <List.Item
                                    actions={[<a key="list-loadmore-edit">edit</a>, <a key="list-loadmore-more">more</a>]}
                                >
                                    <Skeleton avatar title={false} loading={item.loading} active>
                                        <List.Item.Meta
                                            avatar={
                                                <Avatar>{item.User.nickname[0]}</Avatar>
                                            }
                                            title={item.User.nickname}
                                            description={item.content}
                                        />
                                    </Skeleton>
                                </List.Item>
                            )}
                        />


                    </Card>


                </>

            )}



        </>


    )

}
POSTCARD.PropTypes = {

    post:PropTypes.shape({
        id: PropTypes.number,
        User: PropTypes.object,
        Comments: PropTypes.arrayOf(PropTypes.any),
        content: PropTypes.string,
        Images: PropTypes.arrayOf(PropTypes.any),
        imagePaths: PropTypes.arrayOf(PropTypes.any)


    })
   
}

export default POSTCARD;



express nodejs react redux Next.js

답변 1

1

제로초(조현영)

딱히 코드는 문제될게 없어보이는데 card extra와 popover 사용가능한지를 찾아봐야겠습니다.

이러한 에러를 해결할 때는 처음부터 extra에 모든 걸 넣지마시고 조금씩 넣어보세요.

넥스트 버젼 질문

0

77

2

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

0

89

1

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

0

175

1

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

0

103

2

createGlobalStyle의 위치와 영향범위

0

96

2

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

0

91

2

vsc 에서 npm init 설치시 오류

0

146

2

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

0

158

1

화면 새로고침 문의

0

121

1

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

0

153

2

Next 14 사용해도 될까요?

0

452

1

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

0

349

1

url 오류 질문있습니다

0

211

1

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

0

372

1

sudo certbot --nginx 에러

0

1274

2

Minified React error 콘솔에러 (hydrate)

0

470

1

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

0

247

1

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

0

327

1

npm run build 에러

0

518

1

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

0

381

1

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

0

338

2

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

0

287

1

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

0

237

2

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

0

201

1