안녕하세요. 리액트 작업을 하다가 도저히 해결이 안되어 질문올립니다!
전체해제라는 체크박스에 체크를 하면 li에 있는 체크박스들이 전부 해제되게끔 구현하고 싶은데
setList(copyList)를 주었는데도 리렌더링이 안돼서 화면상에 바뀌는 부분이 없습니다.
우선 list가 기본값이긴 한데 데이터 불러오면 list 데이터가 유저가 기존에 저장했던 값으로 바뀌기 때문에 따라서 a1이 true일 수도 있고 전부true거나 전부false거나 할 수도 있는 상황이라 그냥 버튼누르면 전부 check상태가 false로 바꾸고 싶었습니다.
구글링을 해보니까 같은 값을 넣어줘서 리액트가 리렌더링을 안시키는거라고 해서
setList([…copyList])도 해보고 여러방법을 시도해봤는데 바뀌는게 없는거같습니다 ㅠㅠ
list === copyList는 분명히 false가 나오는데 말이에요
copyList 배열의 마지막 객체를 삭제하면 또 갱신이 되는데
저는 다른 a1,b1,c1 객체 전부 넣고 딱 check를 전부 false로 바뀌어서 업데이트 되게 하고싶습니다
왜냐하면 list는 레퍼런스 타입이라서 setList(copyList)를 하면 useEffect의 dependency는 새로운 어레이를 만들고 있다고 생각할거에요. 그래서 useEffect는 어? 새로운 어레이 받으니까 상태가 변하네? 어? 그러면 리렌더링해야겠네? 무한반복이죠. 그래서 어레이 안에 있는 오브젝트의 value로 dependency를 써야 deep equity check가 되어서 무한루프에 안빠지게 될거에요.
useEffect(() => {
setList(…)
}, '[list에 있는 오브젝트의 id']) // dependency에 들어갈 코드를 말로 풀었어요 ^^;;