전 장에서 데이터를 추가하고, 삭제해보는 기능까지는 해보았다.
해당 데이터를 수정해서 그 수정한 값을 렌더링 해보자
const DataItem = ({ id, name, content, score }) => {
return (
<div clssName="DataItem">
<h2>
{id}. {name}
</h2>
<div>{content}</div>
<div>점수 : {score}</div>
<div>
<button onClick={handleRemove}>삭제 하기</button>
</div>
</div>
);
};
현재 DataItem
컨포넌트는 데이터를 삭제하는 기능만 있다 이제 수정 할 수 있기 위해선 다음과 같이 진행해보자
- 해당 컴포넌트에서 수정을 하는지 안하는지에 대한 상택값이 필요하다.
false
수정을 하지 않는다면 true
로 상태값을 업데이트한다.
- 수정 여부에 따라 렌더링 되는 내용이 바뀌어야한다.
- 수정을 하고 최종 데이터를 최상위 컴포넌트에 전달해준다.
const DataItem = () => {
const [isEdit, setIsEdit] = useState(false);
};
수정 버튼을 눌렀을 때 해당 useState
값을 true
로 바꿔주면 해당 사용자가 수정을 하구나, 하지 않구나를 알 수 있다.
상태에 따른 렌더링을 하기 위해선 해당 버튼을 눌렀을 때
상태를 바꿔야하고 바꼈다면 업데이트를 해줘야한다.
const DataItem = () => {
const [isEdit, setIsEdit] = useState(false);
const toggleEdit = () => setIsEdit(!isEdit);
const handleQuitEdit = () => {
setIsEdit(false);
};
return (
<div className="DataItem">
<div className="SubjectContent">
{isEdit ? (
<>
<textarea />
</>
) : (
<>{content}</>
)}
</div>
<div className="BtnArea">
{isEdit ? (
<>
<button onClick={handleQuitEdit}>수정 취소</button>
<button>수정 완료</button>
</>
) : (
<>
<button onClick={toggleEdit}>수정 하기</button>
<button onClick={handleRemove}>삭제 하기</button>
</>
)}
</div>
</div>
);
};
export default DataItem;
이제 해당 상태에 따라 버튼 + 수정할 수 있는 textarea
까지 렌더링 되는걸 볼 수 있다.
const DataItem = ({ onEdit }) => {
const [localContent, setLocalContent] = useState(content);
const handleChangeContent = (e) => {
setLocalContent(e.target.value);
};
const handleEdit = () => {
onEdit(id, localContent);
toggleIsEdit();
};
return (
// ...
<button onClick={handleEdit}>수정 완료</button>
// ...
);
};
DataItem
에서 현재 content의 내용 바뀐 content의 내용을
[localContent, setLocalContent]
로 관리를 하고, onEdit
를 통하여
해당 id
, content내용을 전달해준다.
function App() {
const OnEdit = (targetId, newContent) => {
setData(
data.map((it) =>
it.id === targetId ? { ...it, content: newContent } : it
)
);
};
}
수정을 원하는 데이터의 아이디와, 수정된 내용을 매게변수로 받아
수정하고자하는 데이터의 아이디와 일치하면 기존의 데이터에 수정된 데이터를 추가해준다.
처음에 무작정 하다보니까 어려웠었는데 계속 콘솔창 찍어보면서 하다보니까 이제 좀 이해가 되는 듯 하다
데이터 관리는 최상위 컴포넌트에서 관리하고 이벤트는 하위 컴포넌트에서 관리하는 방식