-
[React Hook] 상태 훅(State Hook)을 내부함수로 정의할 경우 유의사항Javascript & TypeScript 2021. 2. 12. 19:53반응형
이 소스 자체가 올바르다고 보긴 어렵겠지만 나중에 또 뻘짓할수도 있는점을 대비해 정리한 글
useEffect(() => { console.log(`playIndexes : ${playIndexes}`); }, [playIndexes]); useEffect(() => { if(isSuffle) { setPlayIndexes(p => { const rndTargets = [...p.slice(0, currentPlayIdx), ...p.slice(currentPlayIdx + 1, p.length)].sort(p => Math.random() - Math.random()); const result = [...rndTargets.slice(0, currentPlayIdx), p[currentPlayIdx], ...rndTargets.slice(currentPlayIdx, p.length)]; console.log(`suffle result: ${result}`); // playIndexes 의 useEffect 상에 로그와 값이 다르게 표시됨. 구현시 유의할것 return result; }); } else { setPlayIndexes(p => p.sort()); } }, [isSuffle]);
개인 프로젝트에서 음악 재생리스트를 랜덤하게 정렬하는 셔플(Suffle) 기능 구현 중 위와 같이 구현한 코드가 로그상의 순서와 실제 정렬 순서가 다른 점을 깨닫게 되었다.
다르게 찍히는 Index 순서 디버그의 경고 문구에 위와 같이 사용하라는 듯한 문구가 떠서 시키는 대로 했더니 이모양이 되었다. 그래서 아래와 같이 수정했다.
useEffect(() => { console.log(`playIndexes : ${playIndexes}`); }, [playIndexes]); useEffect(() => { if(isSuffle) { const p = playIndexes; const rndTargets = [...p.slice(0, currentPlayIdx), ...p.slice(currentPlayIdx + 1, p.length)].sort(p => Math.random() - Math.random()); const result = [...rndTargets.slice(0, currentPlayIdx), p[currentPlayIdx], ...rndTargets.slice(currentPlayIdx, p.length)]; console.log(`suffle result: ${result}`); setPlayIndexes(result); } else { setPlayIndexes(p => p.sort()); } }, [isSuffle]);
정상적으로 나오는 Index 순서 반응형'Javascript & TypeScript' 카테고리의 다른 글
[NodeJS] 간단히 구현해 본 메일발송 예제 (0) 2021.02.27 [Javascript] moment로 audio 태그의 currentTime 및 duration 값을 mm:ss 형식으로 쉽게 표시하기 (0) 2021.02.13 [React Hook] 상태 훅(State Hook)을 EventListener에 사용시 유의사항 (1) 2021.02.11 [React Hook] 컴포넌트 내 Effect Hook(useEffect) 사용 개념정리 (0) 2021.02.11 [Javascript] React 웹 앱 Firebase에 호스팅하기 (0) 2021.02.04