반응 경고 최대 업데이트 깊이를 초과했습니다.
이 질문은 제 문제에 가장 가까운 질문의 후속 질문입니다.
저는 라이브러리를 공부하기 위해 작은 React.js 앱을 만들고 있습니다.경고 메시지가 떴습니다.
최대 업데이트 깊이를 초과했습니다.이 문제는 컴포넌트가 setState inside useEffect를 호출하지만 useEffect에 종속성 배열이 없거나 모든 렌더에서 종속성 중 하나가 변경되었을 때 발생할 수 있습니다.
기능적인 컴포넌트를 입수했습니다.이 컴포넌트에는 다음과 같은 코드가 있습니다.
const propertiesMap2 = new Map([ //There is also propertiesMap1 which has the same structure
["TITLE4",
{
propertyValues: {
myProperty10 : "myVal1",
myProperty11 : "myVal2",
myProperty12 : "myVal3",
},
isOpen: true
}
],
["TITLE5",
{
propertyValues: {
myProperty13 : "myVal4",
myProperty14 : "myVal5",
myProperty15 : "myVal6",
},
isOpen: true
}
],
["TITLE6",
{
propertyValues:{
myProperty16 : "myVal7",
myProperty17 : "myVal8",
myProperty18 : "myVal9",
},
isOpen: true
}
]
]);
const [properties, setPropertiesMapFunc] = useState(new Map());
useEffect(()=>
{
let mapNum = Number(props.match.params.id);
setPropertiesMapFunc(mapNum === 1 ?propertiesMap1 : propertiesMap2);
}, [properties]);
매번 올바른 속성 맵이 선택되지만 앞서 말했듯이 이 오류가 발생합니다.내가 왜 알 수 있지?propertiesMap
아무것도 변하지 않고 일정합니다.properties
에 파라미터로 전달되었습니다.setEffect
그래서 거기서 뭔가 바뀌었을 때만 다시 렌더링 되는 줄 알았어요.
컴포넌트 함수 내부에 맵개체를 작성하기 때문에 모든 렌더에서 맵개체가 다시 작성됩니다.그 때문에, 이펙트는 새로운 맵을 새로운 상태로 설정해, 또 다른 리렌더를 트리거 해, 이펙트를 다시 호출해, 무한 갱신 루프를 발생시킵니다.
맵 객체의 정의를 컴포넌트 외부로 이동하여 수정할 수 있습니다.
properties
는 맵이며 의존관계 배열로 전달되었을 때useEffect
JS의 다른 비프라이머리 타입과 같은 맵은 값이 아닌 참조로 비교되기 때문에 모든 렌더에서 다시 작성됩니다.이 때문에 내부 기능이 발생합니다.useEffect
모든 재시동마다 실행되어야 합니다.
상세 비교 기능으로 정리해야 합니다.https://stackoverflow.com/a/54096391/4468021
언급URL : https://stackoverflow.com/questions/57853288/react-warning-maximum-update-depth-exceeded
'programing' 카테고리의 다른 글
BEGIN_ARRAY가 필요한데 1행 2에 BEGIN_OBJECT가 있었습니다. (0) | 2023.03.15 |
---|---|
MVC 컨트롤러에서 예외를 두지 않고 $.ajax에 오류를 보고하는 방법 (0) | 2023.03.15 |
npm과 함께 "Cannot read dependencies" 오류가 발생하였습니다. (0) | 2023.03.10 |
반응 항법 V2: 항법 간의 차이점푸시 및 네비게이션.이네이블화 (0) | 2023.03.10 |
유지 방법: 버튼 클릭 후 액티브한 css 스타일 (0) | 2023.03.10 |