리액트
24. 05. 30 TIL (props-drilling-4)
효ㄷi
2024. 5. 30. 21:12
8. DetailPage
이 파일은 각 리스트를 클릭했을 때 이동하는 상세 페이지다.
먼저
const { detailId } = useParams();
url에서 detailId ( 현재 항목의 고유 id)를 가져온다.
그리고 입력 상자에 접근하기 위해 useRef를 사용한다.
const dateRef = useRef(null);
const itemRef = useRef(null);
const amountRef = useRef(null);
const descriptionRef = useRef(null);
첫 기본 값은 null로 설정한다.
그리고 이동해야하므로
const navigate = useNavigate();
페이지를 이동할 수 있는 함수를 만든다.
이제 항목을 찾아야 하는데
클릭한 것 하나만 가져오므로 이번엔 find를 돌려 가져온다.
const filterId = itemList.find((item) => {
return item.id === detailId;
});
일단 내부 값을 가져와본다.
<Container>
<Container2>
<Box>
<label htmlFor="date">날짜</label>
<Input
type="date"
id="date"
defaultValue={filterId.date}
ref={dateRef}
/>
</Box>
<Box>
<label htmlFor="item">항목</label>
<Input
type="text"
id="item"
placeholder="항목"
defaultValue={filterId.item}
ref={itemRef}
/>
</Box>
<Box>
<label htmlFor="amount">금액</label>
<Input
type="number"
id="amount"
placeholder="금액"
defaultValue={filterId.amount}
ref={amountRef}
/>
</Box>
<Box>
<label htmlFor="description">내용</label>
<Input
type="text"
id="description"
placeholder="지출 내용"
defaultValue={filterId.description}
ref={descriptionRef}
// value={descriptionValue}
/>
</Box>
<BtnBox>
<EditBtn onClick={editClickBtn}>수정</EditBtn>
<DelBtn onClick={delClickBtn}>삭제</DelBtn>
<BackBtn onClick={backClickBtn}>뒤로 가기</BackBtn>
</BtnBox>
</Container2>
</Container>
ref와 defaultValue를 작성해준다. 그리고 기본값은 filterId로 찾은 값을 보이도록 넣어준다.
이제 수정 버튼을 클릭하면 함수가 실행되는데
이 함수는
function editClickBtn() {
const editInput = {
date: dateRef.current.value,
item: itemRef.current.value,
amount: amountRef.current.value,
description: descriptionRef.current.value,
id: detailId,
};
setItemList((prev) =>
prev.map((item) => (item.id === detailId ? editInput : item))
);
navigate('/');
}
ref를 업데이트한 객체를 만들어서, setItemList에 다시 배열을 돌리는데
map은 각 항목을 검사해서 변경된 내용이 있면 detailId와 같은 id를 가진 항목을 editInput으로 변경한다.
그리고 navigate를 넣어 홈으로 이동한다.