취뽀 스테이션

  • 게시판을 만들고 있다
  • Toast ui Editor을 이용하여 만들고 있음
  • editor입력 → editorRef.current?.getInstance().getMarkdown() 을 이용하여 content 값을 가져온 후
  • 이를 useState의 setContent함수를 이용하여 넣어 content 내용을 firebase로 보내고 있었다.

문제 발생

  • set함수가 비동기로 동작해서 그런지 최초 onSubmit 함수 실행시 setContent가 제대로 실행되지 않는다.
  • 만일
    • ‘안녕하세요’ 입력 → 작성하기 버튼 누름 → onSubmit 함수 실행 → ‘안녕하세요 값을 가져옴’ → setContent(’안녕하세요’) → console.log(content) → 아무것도 안나옴
    • 그 다음 ‘반갑습니다’ 입력 → 위와 동일 → console.log(content) → ‘안녕하세요’ 출력

원인

  • set함수가 비동기로 동작하기 때문에 발행한 문제가 맞았다.
  • setContent를 통해서 content를 설정했다. (비동기)
  • content를 콘솔에 찍음 (동기)
  • 이렇기에 setContent가 content 설정을 완료하기 전에 console.log이 실행 된 것. 따라서 최초 실행시에는 빈 문자열이, 이후 실행시엔 이전 단계에서 설정한 content 값이 나왔던 것이다.

해결방법

  • useEffect를 사용하였다.
  • useEffect에 dependency를 content로 설정하여 content가 마운트 된 것을 감지하고 나서 함수를 실행하니 잘 해결 되었다.
  • 이번 일을 계기로 useState의 비동기 동작에 대해서 더 잘 이해하게 된 것 같다.

+ Recent posts