์ธํ๋ฐ ์ ๋ก์ด๋์ NodeBrid ๊ฐ์ ๋ฃ๊ณ ๊ณต๋ถํ ๋ด์ฉ์ ๋๋ค.
const PostCard = ({ post }) => {
//์๋์๋ ์๋ฌธ์ผ๋ ?. ๋ฅผ ์ฌ์ฉ (?. = ์ ์๋ฌธ๋ฒ)
const id = useSelector((state) => state.user.me?.id);
props์ post๋ผ๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๋ค. ์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์๋จ์๋ import PropTypes from "prop-types"; ๋ฅผ ๋ถ๋ฌ์ค๊ณ ๋งจ ํ๋จ์๋
PostCard.propTypes = {
post: PropTypes.shape({
id: PropTypes.number,
User: PropTypes.object,
content: PropTypes.string,
createdAt: PropTypes.object,
Comments: PropTypes.arrayOf(PropTypes.any),
Images: PropTypes.arrayOf(PropTypes.any),
}),
};
const id = useSelector((state) => state.user.me?.id);
useSelector๋ import { useSelector } from "react-redux"; ์ด๋ ๊ฒ ๋ถ๋ฌ์ค๊ณ ์ด๋ ๋ฆฌ์กํธ ๋ฆฌ๋์ค๊ฐ ์ ๊ณตํ๋ค.
์ฌ๊ธฐ์ ์ฐ์ธ ?. ๋ ์ด๋ฒ์ ์๋ก์๊ธด ๋ฌธ๋ฒ์ผ๋ก ๋ฌด์จ๋ป์ ์๋ฏธํ๋๋ฉด, me.id๊ฐ ์์ผ๋ฉด id๊ฐ ๋ค์ด๊ฐ๊ณ ์์ผ๋ฉด undefined๋ก ๋ฐ๊ฟ์ฃผ๋ ์ต์ ๋ ์ฒด์ด๋ ์ฐ์ฐ์๋ค. ์ด๊ฒ ์์๋๋ผ๋ฉด
const id = useSelector((state) => state.user.me && state.user.me.id);
์ด๋ ๊ฒ && ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ ์ฝ๋๋์ด ๊ธธ์ด์ง๊ฒ ํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.ใ ์๋ ์๋ ์์ฌ๋๋ ๋ถ๋ถ์๋ ์ต์ ๋ ์ฒด์ด๋์ ์ฌ์ฉํ๋ฉด ์ข ๋ ํธํ๊ฒ ์ธ ์ ์์!
toggle ๊ธฐ๋ฅ์ ๊ตฌํํด๋ณด๊ณ ์ถ์ ๋๋, useState๋ก ํ์ฌ ์ํ์ ๋ฐ๋ ์ํ๋ฅผ ์ง์ ํด ์ค์ผํ๋ค. (์๋จ์ ์ํดํธ ์์ผ์ฃผ๋ ๊ฑฐ ์์ง๋ง๊ธฐ) ๊ทธ๋ฆฌ๊ณ ์ฒซ ์ํ๋ ํ ๊ธ๊ธฐ๋ฅ์ ๋ฃ๊ธฐ ์ ์ ์ํ๋ก ๋ณด์ฌ์ผ๋๊ธฐ ๋๋ฌธ์ false๋ก ํด์คฌ๋ค. ํ ๊ธ ํ ์ ์ด๋ป๊ฒ ๋ณํ๋ฅผ ์ค ๊ฒ์ธ์ง์ ๋ํ ๊ฒ์ useCallback์ ์ฌ์ฉํ๋ฉด ๋๋ค.
const [liked, setLiked] = useState(false);
const [commentFormOpened, setCommentFormOpened] = useState(false);
const onToggleLike = useCallback(() => {
setLiked((prev) => !prev);
}, []);
const onToggleComment = useCallback(() => {
setCommentFormOpened((prev) => !prev);
}, []);
๐ toggle ํ ๋, ๋ฐ๋ ์ํ๋ฅผ useCallback ํตํด ํํํด ์ค๋ค. ์ด๋ ์กฐ๊ฑด์ ํ ๊ธ๊ธฐ๋ฅ์ด๋ on,off๋ฅผ ๊ตฌํํด ์ค์ผ๋๊ธฐ ๋๋ฌธ์ false๋ true๋ก true๋ false๋ก ๋ง๋ค์ด ์ฃผ๋ ค๋ฉด ์ ์ฝ๋์ฒ๋ผ prev๋ฅผ ์ฌ์ฉํด์ฃผ๋ฉด ๋๋ค. ๐
return (
<div>
<Card
style={{ marginBottom: "20px" }}
cover={post.Images[0] && <PostImages images={post.Images} />}
actions={[
<RetweetOutlined key="retweet" />,
liked ? (
<HeartTwoTone
twoToneColor="#eb2f96"
key="heart"
onClick={onToggleLike}
/>
) : (
<HeartOutlined key="heart" onClick={onToggleLike} />
),
<MessageOutlined key="message" onClick={onToggleComment} />,
<Popover
key="ellipsis"
content={
<Button.Group>
{id && post.User.id === id ? (
<>
<Button>์์ </Button>
<Button type="denger">์ญ์ </Button>
</>
) : (
<Button>์ ๊ณ </Button>
)}
</Button.Group>
}
>
<EllipsisOutlined />
</Popover>,
]}
>
{/* ๊ฒ์๊ธ */}
<Card.Meta
avatar={<Avatar>{post.User.nickname[0]}</Avatar>}
title={post.User.nickname}
description={post.content}
/>
</Card>
<Card
style={{ marginBottom: "20px" }}
cover={post.Images[0] && <PostImages images={post.Images} />}
actions={[
<RetweetOutlined key="retweet" />,
liked ? (
<HeartTwoTone
twoToneColor="#eb2f96"
key="heart"
onClick={onToggleLike}
/>
) : (
<HeartOutlined key="heart" onClick={onToggleLike} />
),
<MessageOutlined key="message" onClick={onToggleComment} />,
๋ด์ฉ๋ฌผ์ ๊ฐ์ธ๊ณ ์๋ ์ปดํฌ๋ํธ์ cover๋ post ์์ ์ด๋ฏธ์ง๊ฐ ์๋ ๊ฒฝ์ฐ, PostImages๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ. ๋ฒํผ์ ์ด 4๊ฐ๋ฅผ ๋ฃ์ ๊ฒ์ธ๋ฐ actions ์์๋ค๊ฐ ์ฌ๋ฌ๊ฐ๋๊น ๋ฐฐ์ด๋ก ๋ฃ์ด์ฃผ๋ฉด ๋๋ค. ๋จผ์ [๋ฆฌํธ์๋ฒํผ, ํํธ๋ฒํผ, ๋ฉ์์ง๋ฒํผ,popover] ์ด๋ ๊ฒ ํ์๋ค. (Popover๋ ๋ฐ์ ์์) ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด์ ๊ผญ key๊ฐ์ ๋ฃ์ด์ค์ผ ํ๋ค. ์์ง๋ง๊ณ ๊ณ ์ ์ ๊ฐ์ผ๋ก ๋ฃ์ด์ฃผ๊ธฐ.
ํํธ ๋ฒํผ๊ณผ ๋ฉ์์ง ๋ฒํผ์ ํ ๊ธ ๊ธฐ๋ฅ์ ๋ฃ์ด์ค์ผ ๋๋๋ฐ, ํํธ๋ฅผ ๋๋ ์ ๋ ํฌํค์ปฌ๋ฌ๊ฐ ๋ณ๊ฒฝ๋๊ฒ ์ปดํฌ๋ํธ ์์ ์คํ์ผ ์ ์ฉํด์ฃผ๊ณ ์๋ ์์๋ ๊ทธ๋ฅ ํํธ ์์๋ผ์ธ๋ง ๋ณด์ฌ์ง๊ฒ ! ํํธ, ๋ฉ์์ง ๋ฒํผ์ ๊ฐ์ onToggleLike ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ค.
<Popover
key="ellipsis"
content={
<Button.Group>
{id && post.User.id === id ? (
<>
<Button>์์ </Button>
<Button type="denger">์ญ์ </Button>
</>
) : (
<Button>์ ๊ณ </Button>
)}
</Button.Group>
}
>
<EllipsisOutlined />
</Popover>,
opover์ด๋ผ๋ ์ปดํฌ๋ํธ๋ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ค๋จ์ ๋ ํ์ ์ฐฝ์ด ๋จ๋ ์ปดํฌ๋ํธ๋ค. ์ด ์ปดํฌ๋ํธ์ content๋ก๋ antd์์ ์ ๊ณตํด์ฃผ๋ <Button.Group>์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋๋ฐ ์กฐ๊ฑด์ id๊ฐ ์๊ณ ๋ด ์์ด๋๋ ๊ฒ์๊ธ ์์ฑ์์ ์์ด๋๊ฐ ๊ฐ์ผ๋ฉด ๋ง์ฐ์ค๋ฅผ ๋ฒํผ์์ ์ฌ๋ ค๋จ์ ๋ ์์ ๊ณผ ์ญ์ ๋ฒํผ์ด ๋ณด์ฌ์ง๋๋ก, ๊ทธ๊ฒ ์๋๋ผ๋ฉด ์ ๊ณ ๋ฒํผ๋ง ๋ณด์ด๋๋ก ์กฐ๊ฑด์ ๋ ๋๋ง์ ์ค์ ํ ๊ฒ์ด๋ค.
์กฐ๊ฑด์์ ์ฌ์ฉํด์ค ๋๋ { } ์ค๊ดํธ ์์๋ค๊ฐ js ์ฒ๋ผ ์ค์ ํด์ฃผ๊ณ , ํ๋์ ๊ฐ์ฒด๋ค์ ( ) ์๊ดํธ๋ก ๋ฌถ์ด์ ํํํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ์ผํญ ์ฐ์ฐ์๋ฅผ ์จ์ ๋ง์ผ๋ฉด (?) ์์ ์ญ์ , ๊ทธ๊ฒ ์๋๋ผ๋ฉด (:) ์ ๊ณ ๋ฒํผ ๋ณด์ด๊ฒ ์๋ฃ.
<Card.Meta
avatar={<Avatar>{post.User.nickname[0]}</Avatar>}
title={post.User.nickname}
description={post.content}
/>
๊ฒ์๊ธ ๋ด์ฉ๋ฌผ์ avatar์ ์ปดํฌ๋ํธ๋ฅผ ๋ฃ๊ณ post์ User ๋๋ค์์ ์ฒซ๊ธ์๋ง ๋ฐ์ ๋ณด์ฌ์ง๊ฒ๋ ํ๋ค.