-
Notifications
You must be signed in to change notification settings - Fork 0
문제 해결
-
Firebase
의onAuthChangeState
라는 함수로 자동 로그인을 처리할 수 있는데,onAuthChangeState
로만 체크하면 처음 접속 시 정보를 받아올 때 딜레이가 생기는 문제가 있었습니다. 그래서recoil-persist
를 이용하여 로컬 스토리지에 atom 형식으로 자동 로그인 정보를 저장하였습니다. (/~https://github.com/firebase/firebase-js-sdk/issues/5722) -
코드 하이라이팅을 위해 여러 하이라이터를 찾다가
react-syntax-highlighter
라는 하이라이터를 사용하게 되었습니다. 테마도 많고, 컴포넌트 형태로 되어 있어 리액트에서 사용하기 적합하다고 판단했습니다. -
코드 에디터 구현 중 처음에는
SyntaxHighlighter
컴포넌트에contenteditable={true}
속성을 주어 코드를 작성 및 수정할 수 있게 하려고 했습니다. 그러나 하이라이팅이 실시간으로 반영되지 않았습니다. 그래서textarea
를 이용하여 텍스트 입력을 받고, 입력값을state
에 저장 후SyntaxHighlighter
컴포넌트와 같은 위치에 겹치는 방식으로 에디터를 구현하였습니다.textarea
와SyntaxHighlighter
는 부모div
에display: absolute
속성을 이용하여 겹친 후textarea
의 배경과 글씨 색을 투명화하여 커서는 보이되 하이라이팅된 글자가 비쳐 보이도록 하였습니다. -
하이라이터에
textarea
를 겹쳐놓았기 때문에textarea
는 스크롤이 되지만 하이라이터는 스크롤이 되지 않는 문제가 있었습니다. 그래서 하이라이터 컴포넌트에useRef
훅을 이용하여 연결한 후scrollTop
값을textarea
의scrollTop
과 맞춰주려고 했으나, 하이라이터 컴포넌트 안에ref
속성이 없어서 생각한대로 되지 않았습니다. 그래서 부모div
에ref
를 연결하고firstElementChild
로 하이라이터 컴포넌트에 접근하여scrollTop
을 맞추는 방법으로 해결하였습니다. (https://stackoverflow.com/questions/56484686/how-do-i-avoid-function-components-cannot-be-given-refs-when-using-react-route) -
코드 카드 컴포넌트에서 설명 부분이 여러 줄일 때 마지막 줄에만 말줄임표를 나타나게 하고 싶어서 방법을 검색하였는데, 웹킷에
line-clamp
라는 설정이 있어서 그를 이용하여 구현하였습니다. (https://css-tricks.com/line-clampin/) -
코드 에디터에서 tab 키를 누르면 포커스 이동이 아니라 들여쓰기가 되게 하고 싶었습니다.
event.preventDefault()
를 사용하여 포커스 이동은 막았으나 들여쓰기는 추가 구현이 필요했습니다. 단순히textarea
의 현재 값에 ”\t”를 더하는 것은 먹히지 않았습니다. 검색을 해보니selectionStart
와selectionEnd
라는 속성을 이용하여 들여쓰기를 구현하는 방법이 있었습니다. 둘 다 처음 보는 속성이었는데 공부할 수 있는 기회가 되었습니다. 그러나 들여쓰기가 생각한 대로 되지 않았고 코드의 중간에서 tab 키를 누를 시 커서 위치도 올바르게 나오지 않았습니다. 그러다setRangeText
라는 속성을 발견하였고, 그를 이용하여 해결하게 되었습니다. (https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setRangeText) -
로딩 컴포넌트를
react-query
의isLoading
을 사용해서 컴포넌트 개별적으로 적용했었는데,useIsFetching
훅을 이용하여 페칭 중일 때 전역으로 적용되게 변경하였습니다. 그러나useIsFetching
의 기본값이isFetching
이었기 때문에 캐싱된 데이터를 보여줄 때도 로딩 컴포넌트가 보이는 문제가 있었습니다. 그래서useIsFetching
에predicate
옵션을 주었더니isLoading
과 같은 효과를 낼 수 있었습니다. -
styled-component
에props
를 넘겨줄 때 파스칼 케이스의 경우에 오류가 떴는데, 에러 메시지에서 제시한 대로props
의 이름을 모두 소문자로 바꾸는 방법도 있긴 했으나 표기법을 통일하고 싶기도 했고 최신이자 깔끔한 방법인transient props
방법을 사용하기로 하였습니다.props
명 앞에 $를 붙여styled-component
에 넘길props
인지 리액트가 분석할 프로퍼티인지 구별하게 하는 방법입니다. (https://styled-components.com/docs/api#transient-props) -
코드 작성, 수정 시 페이지를 벗어나려 하면
react-router-dom
의useHistory
훅을 사용하여 confirm 창을 띄우려 했지만 v5 때에는 있던useHistory
훅이 v6으로 업그레이드되면서 사라져서 다른 방법으로 구현하려고 하는 중입니다. (/~https://github.com/remix-run/react-router/issues/8139)