//Skill.tsx
'use client'
interface SkillLoaderProps {
children: React.ReactNode
}
const Skill = ({children}: SkillLoaderProps) => {
const [skillModal, setSkillModal] = useState(false);
const toggleModal = () => {
setSkillModal(!skillModal);
}
return (
<>
<div onClick={toggleModal} className="folder">
<Image src={folder} width={48} height={48} alt='folder-icon' priority />
<p>Skills</p>
</div>
{skillModal && (
<div className='modal'>
...
<div onClick={toggleModal} className='close-modal'>
<Image src={close} width={12} height={12} alt='close-button' />
</div>
{children}
...
//SkillItems.tsx
const SkillItems = async () => {
const skillsResponse = await fetch("api url");
const skillsJson = await skillsResponse.json();
return (
<div className="modal-content modal-skill">
{skillsJson.map((skill: skillProps) => (
<div key={skill.id} className="folder">
<Image src={skill.img} width={43} height={43} alt={skill.title} />
{skill.title}
</div>
))}
</div>
)
}
//page.tsx
<main className={styles.main}>
<Skill>
<SkillItems />
</Skill>
</main>
부모 컴포넌트에서 클라이언트가 데이터로더의 역할을 하면서 서버컴포넌트를 감싸는 형태가 된다. 서버컴포넌트를 클라이언트에서 사용할수 없기 때문에 이렇게 부모를 통하는 방법이 있다. 정적 데이터의 경우, 최대한 훅을 쓰지 않고 서버컴포넌트만 사용하거나 클라이언트 컴포넌트에서 useEffect로 똑같이 데이터를 받는 방법도 있으니 데이터와 코드 구조에 따라 적절히 판단하여 사용하면 되겠다.