-
27. Final project [Trouble Shooting -1]리액트 무한렌더링-불필요한 렌더링을 막는 리액트 훅 useCallback, useMemo (해결중)Java Script & Type Script/Trouble Shooting 2023. 2. 16. 16:12728x90
이 에러 밭 무슨 일이죠?
리렌더링이 너무 많이 일어나서 리액트가 자체적으로 infinite loop을 방지하기 위해 렌더링횟수에 제한을 두고있다고합니다. 그래서 화면이 날아가고 보이지 않습니다... 제 멘탈도 하얗게 날아갔습니다...
const onParticipantsChangeHandler = (e) => { setParticipants(e.target.value); }; const [participantss, setParticipantss] = useState([]); if (participants.length > 0) { setParticipantss(participants); }
문제의 코드...
리렌더링이 되는 케이스
- 부모 컴포넌트가 렌더링 된 경우
- 컴포넌트의 state가 변경된 경우
- 부모로부터 전달받은 props 값이 변경된 경우
useCallback 이용 : useCallback() 안에서 첫번째 매개변수로 구현하고자 하는 함수가 들어오고, 두번째 매개변수자리에는 의존성 배열이 들어옵니다. 의존성 배열의 역할은 useEffect 와 비슷합니다.
const onClickHandler = useCallback(() => { console.log("hello button!"); }, []);
useCallback을 사용하면, 함수가 생성되고 나서 재생성되지 않습니다. 하지만 상황에 따라서는 이 함수를 재생성해줘야 할 때가 있습니다. 그러한 경우 의존성배열에 값을 넣어주면 해당 값이 변경되었을 때 이 함수도 같이 재생성됩니다.
useMemo 이용: useCallback과 똑같은 기능을 하는 훅 입니다. 다만, 대상이 함수가 아니라 배열이나 객체와 같은 값일 때 사용합니다. 사용원리와 방법은 모두 useCallback과 같습니다.
const data = useMemo(() => { return [ { id: 1, title: "react", }, ]; }, []);
- useCallback의 대상은 함수, useMemo의 대상은 객체나 배열과 같은 값이다.
- 원시타입 데이터는 useMemo를 사용하지 않아도 리렌더링하지 않습니다. → useMemo 안써도 됩니다.
그래서 에러 고쳤냐?
못고쳤다~~~~
근데 이거 왜 쓰냐?
내 시행착오 과정을 기록하고싶었습니다....
해결하게되면 이어서 작성하겠습니다...
728x90'Java Script & Type Script > Trouble Shooting' 카테고리의 다른 글
[JS] this 바인딩에대한 고찰... (항해 수료 후 근황, 스파르타 취업준비반) (0) 2023.04.03 38. 3월 16일 (0) 2023.03.16 34. react-datepicker 야무지게 잘 쓰는 법. Feat.datepicker 시차해결. datepicker한국시간표현 (0) 2023.03.04 30. Final Project [trouble shooting-3] - useState비동기문제 함수형 업데이트로 해결! chat GPT야 고마워 (0) 2023.02.23 [JS, TS]TypeError: cannot read properties of undefined (reading 'length') (해결)(+3월 17일 수정) (2) 2023.02.18