해시태그를 구현해 보려고 함
📝 형식
- 해시태그 글자의 수는 10글자 이하
- 엔터키로 넣기
- 최대 5개 => 더 입력하려고하면 modal이나 alert 띄워주기
- 태그한 목록 띄워주기
- 해시태그 지울 수 있게 하기
엔터일 때만 값을 추가 해야 되기때문에 e.key === "Enter"를 넣었다.
const tagDown = (e) => {
if (e.key === "Enter" && tagLists.length === 5) {
setInputValue("");
console.log("5개임 바이");
} else if (e.key === "Enter") {
setTagLists([...tagLists, inputValue]);
setInputValue("");
}
};
<>
<div className="input-container">
<label htmlFor="tag">태그</label>
<div className="input-wrap">
<input
type="text"
id="tag"
maxLength="10"
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
placeholder="태그할 글자를 입력해주세요."
onKeyDown={tagDown}
/>
</div>
</div>
<div className="hashtag-lists">
<ul>
{tagLists.map((tag, index) => (
<li key={index}>{tag}</li>
))}
</ul>
</div>
</>
이렇게 해서 잘 나오는 가 봤더니 영어를 입력하면 한개씩 잘 나오는데 한글을 입력하면 2개씩 나오는 문제 발생...
해결 : 한글 입력은 자음과 모음을 조합하는 과정에서 여러 'keydown' 이벤트를 발생시킬 수 있어서 Enter키가 여러번 처리되는 문제가 발생할 수 있다. e.nativeEvent.isComposing은 현재 텍스트 입력이 진행중인지 여부를 판단 할 수 있는데 이 속성이 false일때만 Enter 키 이벤트를 처리하도록 했다.
const tagDown = (e) => {
if (e.key === "Enter" && tagLists.length === 5) {
setInputValue("");
console.log("5개임 바이");
}
// 수정 부분
else if (e.key === "Enter" && !e.nativeEvent.isComposing) {
setTagLists([...tagLists, inputValue]);
setInputValue("");
}
};
해시태그를 다섯개보다 더 입력하려고 하면 모달이 나오게 했는데 useRef말고 그냥 useState로 띄워줬다.
const [showTagModal, setShowTagModal] = useState(false);
const tagDown = (e) => {
if (e.target.value === "") return;
if (e.key === "Enter" && tagLists.length === 5) {
setInputValue("");
setShowTagModal(true);
setTimeout(() => {
setShowTagModal(false);
}, 600);
} else if (e.key === "Enter" && !e.nativeEvent.isComposing) {
setTagLists([...tagLists, inputValue]);
setInputValue("");
}
};
{showCompleteModal === true ? (
<div className="modal">
<span>채팅방이 생성되었습니다.</span>
</div>
) : null
}
해시태그를 지우는 것은 'splice'메서드를 사용해서 updateTagLists배열에서 index 위치부터 1개를 제거하도록 했다.
그 후에 다시 tagLists 상태를 새로운 배열인 updateTagLists로 바꿔줬다.
const onClickRemove = (index) => {
const updateTagLists = [...tagLists];
updateTagLists.splice(index, 1);
setTagLists(updateTagLists);
};
<ul className="hashtag-lists">
{tagLists &&
tagLists.map((tag, index) => (
<li className="hashtag" key={index}>
<span>#{tag}</span>
<button
className="remove-btn"
onClick={() => onClickRemove(index)}
>
X
</button>
</li>
))}
</ul>
320x100
'프로젝트 > 팀프로젝트' 카테고리의 다른 글
(React) 카카오 로그인 - 2 (0) | 2024.04.22 |
---|---|
(React) 카카오 로그인 - 1 (1) | 2024.01.29 |
위드콘 - 1주차 회고 (0) | 2024.01.22 |
5~6주차 회고 (0) | 2023.07.07 |
React Query (0) | 2023.07.06 |