S3 배포링크
: 오늘의 운동 기록을 점진적 과부하 사이트로 기록하고 캡쳐해봤다 ㅎㅎ
{
"벤치 프레스" : [["50", "15"], ["60","12"]],
"턱걸이" : [["0","12"],["0","10"],["0","8"]],
"스쿼트" : [["30","15"],["40","15"],["50","12"]]
}
: 위와 같은 형태로 만든 다음에 state로 관리한다. 그래서 만약에 위에 그림에서 +버튼을 누르고1) 처음에 + 버튼을 누르면 위와같은 인풋창이 안뜨는 문제가 생겼었다. 즉, 리렌더링이 안되는 문제가 생겼다. map 안에 이중 map 구조로 해서 그런가? 하는 직관적이고, 비논리적인 생각을 해봤지만 그럴 이유가 없었다. 그래서 setState를 추적하기위해 useEffect를 써서 해당 state가 업데이트 될 때 console.log를 찍도록 했는데, 분명히 제대로 값이 변하고 있었다.. ?! 즉, 내가 위에 만든 자료구조에 예를 들어, 벤치프레스면 해당 키의 값인 배열에 하나의 배열을 제대로 추가하고 있었다는 것!. 근데도 렌더링은 안되기에 뭐가 문제인가 해서 찾아보니 setState를 할 때 만약에 같은 주소값을 참조하는 값을 넣으면 리렌더링이 되지 않는다는 것을 알게 됐다. 물론 이러한 이유로 보통 배열이나 객체를 setState에 넣을 때는 깊은 복사를 해서 진행하는데, 결론적으로 문제는 내 '문법 실수'에 있었다.
const copyObj = Object.assign({}, objTOCopy}
Object.assign(target, ...sources)
위의 코드처럼 assign을 쓸 때는 먼저 빈 객체(새로운 주소값을 쓰기 위함)를 target에 두고, 복사할 요소가 담긴 state 객체인 objTOCopy 객체를 sources에 두면 자동으로 spread 연산자가 붙어서 해당 객체의 소스를 타겟 객체에 복사하게 된다. 그러면 주소값도 새로운, 즉 완전히 새롭고 소스만 같은 객체를 리턴하게 된다.
: 위와 같이 썼어야했는데.. 저걸 그냥 Object.assign(objTOCopy)로 했으니.. 그냥 해당 객체를 얕은 복사했을 뿐이었다. 그래서 setState를 해도 같은 주소값을 가진 객체를 넣으니 리렌더링이 안됐던 것! 아무리 객체의 요소가 바뀌어도 주소값이 안바뀌면 react가 state가 변한지 인식을 못한다는 것을 알아두자
const copyObj = { ...ObjToCopy }
: 이렇게 하는게 훨씬 간단하다. 사실상 Object.assign 이 하는 로직과도 비슷하고!2)
{/ type= number로하면 current.value 안먹힘 /}
: 내가 주석으로 남겨놓은 것인데, useRef를 써서 input의 값을 받아서 어떤 로직을 처리해주려했는데, input type="number"로 해놓으니까 작동을 안하더라. 즉, inputRef.current.value를 했는데, inputRef.current가 null로 떠서 에러가 났다. 근데 지금 이걸 해보면서 다시 시도해보니까 에러가 안난다.. 이건 추후에 또 해보면서 봐야겠다. 중간에 로직이 꼬였었던건가..?