Frontend/react
[ react ] 부모 컴포넌트와 자식 컴포넌트 데이터 전달
IT grow.
2023. 7. 25. 17:45
반응형
- 부모 : Home()
- 자식 : HeaderBar()
현재 상황
Home() 함수는 동기로 api 통신을 하여 데이터를 받아온뒤 posts ( object type ) 에 저장을 하고 ,
props로 {posts}를 받고 있는 형태이며 , 받은 데이터를 return 을 통해 화면에 카드 리스트 형태로 출력되는 상황
기존화면에서 검색 필터 기능이 필요하여 작업하다가
(1) 부모 컴포넌트에서 자식 컴포넌트로 데이터 전달
(2) 자식 컴포넌트에서 부모 컴포넌트로 데이터 전달
(1) + (2) 가 동시에 발생해야 하는 상황이 발생...
그러다가 자식 컴포넌트 props 로 함수 자체를 넘길수 있다는 것을 알게되었다..!! @@@@
export default function Home({posts}) {
const [postState,setPostState] = useState({posts});
useEffect(()=>{
getPostDate(postState);
})
const getPostDate = (postState) =>{
setPostState(postState);
}
return (
<div className={styles.grid}>
<Head>
<title>Create Next App</title>
<meta name="description" content="Generated by create next app" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="/favicon.ico" />
</Head>
<HeaderBar postList = {{posts}} getPostDate = {getPostDate}/>
<main className={styles.main}>
{
postState.posts.length != 0 ?
postState.posts.map((post)=>(
<BlogCard
title = {post.title}
author = {post.author}
coverPhoto = {post.coverPhoto}
key ={post.id}
dataPublished = {post.dataPublished}
slug = {post.slug}
postChk = {"show"}
/>
)) :
<BlogCard
postChk = {"none"}
/>
}
</main>
</div>
);
}
getPostDate 라는 함수를 하나 선언하고 , 이 함수는 부모의 상태관리값을 업데이트하는 함수.
const [postState,setPostState] = useState({posts});
useEffect(()=>{
getPostDate(postState);
})
const getPostDate = (postState) =>{
setPostState(postState);
}
HeaderBar 컴포넌트에 props로 위에서 부모의 상태관리값을 업데이트 해주는 getPostDate 함수 자체를 넘겨준다.
<HeaderBar postList = {{posts}} getPostDate = {getPostDate}/>
HeaderBar 컴포넌트에서는 부모에서 전달해준 props를 getPostDate로 받아준다.
function ResponsiveAppBar ({postList , getPostDate}) {
const [anchorElNav, setAnchorElNav] = React.useState(null);
const [anchorElUser, setAnchorElUser] = React.useState(null);
const [userInput,setUserInput] = useState({
searchItem:"",
});
다음은 부모의 상태값 관리를 업데이트 하는 getPostDate() 를 다음 코드처럼 사용하여 , 부모의 상태값을 업데이트 가능.
const handleChange = (prop) => (event) =>{
if(event.key === 'Enter'){
const searched = postList.posts.filter((post)=>{
return post.title.toLowerCase().includes(event.target.value.toLowerCase());
});
getPostDate({"posts":searched});
}
}
Home() 컴포넌트 내에 useEffect() 내에 getPostDate()를 선언함으로써 마운트 될때 변경된 값이 찍히는것을 확인할 수 있다.
useEffect(()=>{
getPostDate(postState);
})
정리하자면
부모 컴포넌트에서 자식 컴포넌트에 props 로 함수 자체를 전달.
자식 컴포넌트에서는 props 로 받은 함수 자체를 받아 , 부모의 상태값 업데이트.
반응형