문제
해결 방법
input
의 value를 추적하여 마지막 문자가 "@"인지 확인하고, "@"를 감지하면 멘션 모달의 상태를 true
로 변경하여 멘션 모달 컴포넌트가 나타나도록 구현했다.return
처리를 통해 모달이 열리지 않도록 하여, 문장 내에서 "@"를 문자로 사용할 수 있도록 했다.useEffect
훅에서 input
의 value를 의존성 배열로 등록하여, 사용자가 공백을 입력하거나 value.includes("@")
가 false
인 경우 모달의 상태를 false
로 변경해 모달 창을 닫았다.newValue = **value**.**substring**(0, 저장한 커서 위치) + 선택된 사용자 이름 + " "
로 새 값을 만들어 value
에 저장한다.selectedIndex
상태로 관리하며, 해당 인덱스의 항목에 "selected" 클래스를 적용해 시각적으로 강조한다.useEffect
훅 내의 키보드 이벤트 감지 함수에서 ArrowUp과 ArrowDown 키를 감지하여 setSelectedIndex
를 통해 현재 선택된 사용자의 인덱스를 변경한다.scrollIntoView
메서드를 이용해 선택된 인덱스가 항상 모달창 중앙에 위치하도록 조정한다.handleKeyDown
함수에서 스페이스바 (" ")를 감지하여 사용자가 현재 선택된 항목을 선택할 수 있도록 구현했다.userName
을 onMentionClick
함수에 전달하여 멘션을 추가한다.결과
실제 구현한 화면
문제
해결 방법
URL.createObjectURL()
메서드를 사용하여 사용자가 선택한 이미지의 미리보기를 위한 임시 URL을 생성하고, 이를 화면에 렌더링하여 즉시 미리보기를 제공한다.id
를 이용하여 해당 인덱스를 제거한 새로운 배열을 생성하고, 이를 상태로 업데이트하여 선택된 이미지가 화면에서 제거되도록 구현한다.Swiper
라이브러리를 활용하여 여러 이미지를 스와이프하여 볼 수 있는 기능을 구현하여, 사용자에게 직관적인 이미지 탐색 경험을 제공한다.결과
문제
해결 방법
useEffect
훅에 사용자 입력 값을 의존성 배열로 설정하고, setTimeout
메서드를 사용하여 입력이 없던 시간이 0.5초가 넘었을 때만 서버 요청 함수를 실행하도록 구현했다. 사용자가 입력을 0.5초 이내에 변경할 경우, 클린업 함수가 기존의 타이머를 제거하고 새로운 타이머를 설정하여 서버 요청을 지연시킨다.