목표 추가
- 부모 컴포넌트인 App.js에서 CourseInput.js로 목표추가 함수를 onAdd이름으로 내려줌
-> 나중에 CourseInput.js에서 받은 데이터를 실시간 화면 렌더링 해야하므로 상태변경 감지를 위해 setter인 setGoals사용
const App = () => {
const [goals, setGoals] = useState(DUMMY_DATA);
const addGoalHandler = (goalObject) => {
setGoals([...goals, goalObject]);
};
};
return (
<div>
<section id="goal-form">
<CourseInput onAdd={addGoalHandler} />
</section>
</div>
);
- CourseInput.js에서 내려받은 함수에 데이터를 담아 App.js로 다시 올려줌 (상향식)
- 입력값은 input 하나기 때문에 단일값으로 상태관리
-> 입력값에 대한 상태관리를 위해 useState 사용
-> 입력값이 바뀔 때 필요한 이벤트 핸들러 사용
-> 폼을 전송하기위해 필요한 이벤트 핸들러 사용
import React, {useState} from 'react';
import './CourseInput.css';
import Button from '../UI/Button';
const CourseInput = ({ onAdd }) => {
const [enteredText, setEnteredText] = useState('');
const goalAddHandler = e => {
setEnteredText(e.target.value);
}
const formSubmitHandler = e => {
e.preventDefault();
const newGoalObject = {
id: Math.random().toString(),
text: enteredText
};
console.log(newGoalObject);
onAdd(newGoalObject);
setEnteredText('');
}
return (
<form onSubmit={formSubmitHandler}>
<div className="form-control">
<label>나의 목표</label>
<input type="text"
value={enteredText}
onChange={goalAddHandler}
/>
</div>
<Button type="submit">목표 추가하기</Button>
</form>
);
};
export default CourseInput;
목표 삭제
- 부모 컴포넌트인 App.js에서 CourseItem.js로 목표삭제 함수를 onDelete 이름으로 내려줌
-> id가 일치할 경우 삭제하는 것으로 설정
const App = () => {
const [goals, setGoals] = useState(DUMMY_DATA);
const deleteGoalHandler = (id) => {
setGoals(goals.filter(g => g.id != id));
};
import React from 'react';
import './CourseList.css';
import CourseItem from './CourseItem';
const CourseList = ({ items, onDelete }) => {
return (
<ul className='goal-list'>
{
items.map(item => <
CourseItem
key={item.id}
item={item}
onDelete={onDelete}
/>)
}
</ul>
);
};
export default CourseList;
- 자식컴포넌트인 CourseItem.js에서 부모컴포넌트인 App.js로 삭제 대상의 id 데이터를 함수에 담아 올린다.
import React from 'react';
import './CourseItem.css';
const CourseItem = ({ item, onDelete }) => {
const deleteHandler = e => {
console.log('삭제 해줘');
onDelete(item.id);
}
return <li className="goal-item" onClick={deleteHandler}>{item.text}</li>;
};
export default CourseItem;
- 클릭하면 id가 일치시 삭제됨