시도 1 : 할 일 고유ID는 Todolist.js(리덕스 모듈)에 있으니까 거기서 가져오면 되겠다.
결과 -> 실패
시도 2 : 돔트리를 이용해서 할 일의 아이디를 가져오자. 현재로서는 UI단에서 고유ID에 접근할 수 없으니까 화면에 ID를 그냥 넣어보자.
결과 -> 성공한 듯했으나 실패
결론 : 같이 공부하는 팀원들에게 어려움을 공유했더니 같은 경험을 한 팀원이 있어서 도움을 받았음. 진짜 문제는 할 일의 고유ID를 얻은 로직 자체에 있었음.
이게 시도 2 코드였다.
// 할 일 완료 버튼
<button onClick={handleSwitchButtonClick}
// 위 버튼 클릭 시 호출되는 dispatch 함수
const handleSwitchButtonClick = (event) => {
const id = event.target.previousSibling
dispatch({
type: 'TOGGLE_BTN',
tododata: {
id: id,
},
});
};
->
결과 : id값이 전달은 되지만 string이 아니라 object였음 다른 방법으로 id를 얻어야 했음
그래서 이렇게 했다.
// 할 일 완료 버튼
<button onClick={handleSwitchButtonClick(item.id)}
// 위 버튼 클릭 시 호출되는 dispatch 함수
const handleSwitchButtonClick = (id) => {
dispatch({
type: 'TOGGLE_BTN',
tododata: {
id: id,
},
});
};
->
결과 : dispatch 함수에 item.id를 전달했음에도 해결이 안 됐다. 위 코드 자체에 대한 에러는 안 떴는데, 리듀서 함수 쪽에서 id값 undifined 에러메시지가 떴다.
점점 원인은 미궁으로 가는 듯 했으나, 위 에러를 해결해본 팀원이 도움을 줬다.
// 할 일 완료 버튼
<button onClick={()=>handleSwitchButtonClick(item.id)}
// 위 버튼 클릭 시 호출되는 dispatch 함수
const handleSwitchButtonClick = (id) => {
dispatch({
type: 'TOGGLE_BTN',
tododata: {
id: id,
},
});
};
->
해결!
button onClick={ 뒤에 () => 이것이 없어서였다...
하... 안 되면 에러메시지라도 띄워주던가. 여튼 그런데 왜 저게 없으면 안 될까?
여기 관련 내용이 있다.
그런데 읽어봐도 그 이유가 잘 이해가 되지 않은 상황.
주말에 천천히 다시 한 번 봐야겠다.
리액트 공식 문서 : 이벤트 처리하기