
상위(부모) 컴포넌트가 하위(자식) 컴포넌트에 데이터를 전달할 수 있게 해주는 방법
이번 개인과제로 제출한 Todo List의 코드를 가져왔다.
//App.jsx
{goals.map((goal) => (
<li key={goal.id} style={goalStyle}>
<h3>{goal.title}</h3>
<span>{goal.content}</span>
{/* Todo 삭제 및 완료 버튼 */}
<div style={buttonContainerStyle}>
<Button
goal={goal}
goals={goals}
setGoals={setGoals}
doneGoals={doneGoals}
setDoneGoals={setDoneGoals}
isDoneList={false}
/>
</div>
</li>
))}
//Button.jsx
import React from 'react';
const Button = ({ goal, goals, setGoals, doneGoals, setDoneGoals, isDoneList }) => {
// 특정 Todo를 삭제하는 함수
const removeGoal = (id) => {
if (isDoneList) {
setDoneGoals(doneGoals.filter((goal) => goal.id !== id));
} else {
setGoals(goals.filter((goal) => goal.id !== id));
}
};
// Todo의 완료 상태를 변경하는 함수
const changeGoal = (id) => {
const updatedGoals = isDoneList ? doneGoals.filter((goal) => goal.id !== id) : goals.filter((goal) => goal.id !== id);
const targetGoal = isDoneList ? doneGoals.find((goal) => goal.id === id) : goals.find((goal) => goal.id === id);
if (isDoneList) {
setDoneGoals(updatedGoals);
setGoals([...goals, { ...targetGoal, complete: false }]);
} else {
setGoals(updatedGoals);
setDoneGoals([...doneGoals, { ...targetGoal, complete: true }]);
}
};
return (
<>
<button onClick={() => removeGoal(goal.id)} className='deletebtn'>삭제하기</button>
<button onClick={() => changeGoal(goal.id)} className={goal.complete ? 'incomplete-btn' : 'complete-btn'}>
{goal.complete ? "취소" : "완료"}
</button>
</>
);
};
export default Button;
JS 문법 중 하나로 배열이나 객체의 속성을 쉽게 추출하여 개별 변수에 할당할 수 있게 해준다