마이페이지를 구현하던 중 문제에 직면했다.
(못생긴 ui는 차치하고) 좌측의 사이드바에서 선택한 메뉴에 따라 컨텐츠를 바꿔주고 싶었는데, 구조를 어떻게 짜야할까 고민에 빠졌다.
const MyPage = () => {
return (
<div>
<div>
<Sidebar />
</div>
<div>
<Content />
</div>
</div>
);
};
const MyPage = () => {
return (
<div>
<div>
<!-- 사이드바 선택이 어쩌고 저쩌고 -->
</div>
<div>
<!-- 사이드바 값이 어쩌고면, 컨텐츠 어쩌고 -->
<!-- 사이드바 값이 저쩌고면, 컨텐츠 저쩌고 -->
</div>
</div>
);
};
1안이 깔끔해보였지만, 문제는 사이드바 컴포넌트에서 선택한 정보를 컨텐츠 컴포넌트로 어떻게 넘겨줄 것인가가 문제였다.
How to pass data from one component to other component in ReactJS ? 해당 포스트에서 답을 얻을 수 있었다.
나의 경우 아래와 같이 구성을 해보았다.
const MyPage = () => {
const [menu, setMenu] = useState("info");
const onClickMenu = (id) => {
setMenu(id);
};
return (
<div>
<div>
<Sidebar onClickMenu={onClickMenu} />
</div>
<div>{menu === "info" ? <Info /> : <Post menu={menu} />}</div>
</div>
);
};
const menus = [
{
id: "info",
text: "내정보",
},
{
id: "question",
text: "질문글",
},
{
id: "answer",
text: "답글",
},
{
id: "comment",
text: "댓글",
},
];
const Sidebar = ({ onClickMenu }) => {
const [selectedMenu, setMenu] = useState("info");
const onClick = (id) => {
setMenu(id);
onClickMenu(id);
};
return (
<div>
<ul>
{menus.map((menu) => (
<li
key={menu.id}
className={`${
menu.id === selectedMenu ? `font-bold text-slate-400` : ""
}`}
>
<button onClick={() => onClick(menu.id)}>{menu.text}</button>
</li>
))}
</ul>
</div>
);
};
callback function의 적절한 활용을 통해 동일한 부모 component를 가지고 있다면, 다른 자식 component로 값을 적절히 넘겨줄 수 있다.