하루 하나씩 작성하는 TIL #29
function Home() {
const [selectedMonth, setSelectedMonth] = useState(null);
const [formData, setFormData] = useState({
date: '',
item: '',
amount: '',
description: ''
});
<div>
<form onSubmit={handleSubmit}>
<InputGroup>
<InputLabel>날짜</InputLabel>
<InputField type="text" name="date" value={formData.date} onChange={handleChange} />
</InputGroup>
<InputGroup>
<InputLabel>항목</InputLabel>
<InputField type="text" name="item" value={formData.item} onChange={handleChange} />
</InputGroup>
<InputGroup>
<InputLabel>금액</InputLabel>
<InputField type="text" name="amount" value={formData.amount} onChange={handleChange} />
</InputGroup>
<InputGroup>
<InputLabel>내용</InputLabel>
<InputField type="text" name="description" value={formData.description} onChange={handleChange} />
</InputGroup>
<button type="submit">지출 등록</button>
</form>
</div>
const handleSubmit = (e) => {
e.preventDefault();
};
const validateDate = (date) => {
const datePattern = /^\d{4}-\d{2}-\d{2}$/;
if (!datePattern.test(date)) {
return '날짜는 YYYY-MM-DD 형식이어야 합니다.';
}
const parsedDate = new Date(date);
if (isNaN(parsedDate)) {
return '유효한 날짜를 입력하세요.';
}
return '';
};
const validateAmount = (amount) => {
if (isNaN(amount)) {
return '금액은 숫자여야 합니다.';
}
if (amount < 0) {
return '금액은 0보다 작을 수 없습니다.';
}
return '';
};
const handleSubmit = (e) => {
e.preventDefault();
// 유효성 검사
const dateError = validateDate(formData.date);
const amountError = validateAmount(formData.amount);
if (dateError || amountError) {
// 유효성 검사 실패 시 alert 창으로 오류 메시지 표시
if (dateError) {
alert(dateError);
}
if (amountError) {
alert(amountError);
}
} else {
// 유효성 검사 통과 시 데이터를 처리하는 로직 추가 (예: 서버로 전송, 로컬 상태에 저장 등)
console.log('폼 데이터 제출:', formData);
// 제출 후 폼 초기화
setFormData({
date: '',
item: '',
amount: '',
description: ''
});
}
};
npm install uuid
import { v4 as uuidv4 } from 'uuid';
// 유효성 검사
const dateError = validateDate(formData.date);
const amountError = validateAmount(formData.amount);
if (dateError || amountError) {
// 유효성 검사 실패 시 alert 창으로 오류 메시지 표시
if (dateError) {
alert(dateError);
}
if (amountError) {
alert(amountError);
}
} else {
// 유효성 검사 통과 시 데이터를 처리하는 로직 추가 (예: 서버로 전송, 로컬 상태에 저장 등)
const newExpense = {
...formData,
id: uuidv4() // UUID 라이브러리를 사용하여 고유한 ID 생성
};
console.log('폼 데이터 제출:', newExpense);
참고: 제공해 드린 fakedata 와 같은 형식을 이용하실 필요는 없습니다. 자유롭게 데이터 형식을 택하셔도 무방합니다.
솔직히 유효성 검사 부분 ( /^\d{4}-\d{2}-\d{2}$/;) 은,,, 지피티와 함께 했다.
상세화면 이동 시 클릭한 지출 항목의 id값을 가지고 이동해 주세요.
<ListItem key={index}>
<Link to={`/detail/${item.id}`}> {/*상세화면으로 이동하는 링크*/}
<p>날짜: {item.date}</p>
<p>항목: {item.item}</p>
<p>금액: {item.amount}</p>
<p>내용: {item.description}</p>
</Link>
1) 지출을 수정할 수 있는 UI 표현해 주세요.
<Container>
<h2>지출 수정</h2>
<form onSubmit={handleSubmit}>
<InputGroup>
<InputLabel>날짜</InputLabel>
<InputField type="text" name="date" defaultValue={formData.date} ref={dateRef} />
</InputGroup>
<InputGroup>
<InputLabel>항목</InputLabel>
<InputField type="text" name="item" defaultValue={formData.item} ref={itemRef} />
</InputGroup>
<InputGroup>
<InputLabel>금액</InputLabel>
<InputField type="text" name="amount" defaultValue={formData.amount} ref={amountRef} />
</InputGroup>
<InputGroup>
<InputLabel>내용</InputLabel>
<InputField type="text" name="description" defaultValue={formData.description} ref={descriptionRef} />
</InputGroup>
<button type="submit">수정</button>
<button type="button" onClick={handleDelete}>삭제</button>
<button type="button" onClick={() => navigate('/')}>뒤로 가기</button>
</form>
</Container>
2) 수정할 값을 받는 Input을 만들 때 useRef 를 사용해주세요.
const dateRef = useRef(null);
const itemRef = useRef(null);
const amountRef = useRef(null);
const descriptionRef = useRef(null);
3) 수정, 삭제, 뒤로가기 기능을 넣어주세요.
<button type="submit">수정</button>
<button type="button" onClick={handleDelete}>삭제</button>
<button type="button" onClick={() => navigate('/')}>뒤로 가기</button>
3) 수정 버튼을 누르면, 기존 지출의 데이터를 수정하고 ‘홈’ 으로 이동합니다. 수정된 변경사항이 바로 적용이 되어야 합니다.
❗추가 구현 필요❗
4) 삭제 버튼 클릭 시 즉시 삭제하기 보다는 사용자에게 확인받은 뒤 삭제처리 하도록 해주세요. 삭제 이후에는 홈으로 이동시켜주세요.
❗추가 구현 필요❗
Remind: context 브랜치에서는 redux는 사용하지 않습니다!
git checkout -b context
🟡2024-05-27 10번까지 진행 완료
지출 state 는 context 전역상태로 변경합니다. 이외에도 전역상태 관리하고 싶은 상태가 있으면 자유롭게 context 로 관리해 줍니다.
Remind: redux 브랜치에서는 context 없이 redux만 사용합니다!
git checkout -b redux
Redux-toolkit 을 사용해 리덕스를 구성해 주세요. (ducks 패턴은 사용하지 않습니다.)