티스토리 뷰
react에서 게시글에 댓글을 작성할 수 있는 기능을 개발하고자 했다.
input태그에서 텍스트를 입력하고 게시 버튼을 클릭하면 댓글이 작성되도록 만들었는데 Enter키를 눌렀을때도 같은 동작을 할 수 있도록 하고싶었다.
다른 페이지에서도 이를 활용할 가능성이 있어 Custom hook으로 빼서 개발을 진행하였다.
호출하는 부분
const [comment, setComment] = useState<string>("");
const { buttonRef, handleKeyDown} = useBtnWithEnter(EventCommentCreate); // 커스텀 훅
/* 댓글 달기 Event */
const EventCommentCreate = () =>{
통신하는 부분 ...
setComment(""); // 통신 성공시 초기화
};
/* 댓글 input창 onChange */
const onChangeComment = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
setComment(e.target.value);
}, [comment]);
...
<div>
<input
type="text"
placeholder="댓글 달기"
name="comment"
value={comment}
onChange={onChangeComment}
onKeyDown={(e) => handleKeyDown(e)}
></input>
<ComentSendBtn
ref={buttonRef}
onClick={()=> EventCommentCreate()}
>게시</ComentSendBtn>
</div>
처음 커스텀 훅을 정의할때 EventCommentCreate를 인자로 넘겼다.
input 태그에서는 onKeyDown 이벤트를 사용하여 커스텀 훅에 handleKeyDown을 호출,
게시 button 에서는 onClick 이벤트를 사용하여 EventCommentCreate를 호출하였다.
useBtnWithEnter 커스텀 훅 코드
import { useRef, KeyboardEvent } from "react";
export function useBtnWithEnter(callback: () => void) {
const buttonRef = useRef(null) as React.MutableRefObject<any>;
function handleKeyDown(e : KeyboardEvent<HTMLInputElement>) {
if(e.key === 'Enter' && buttonRef.current){
callback();
}
}
return { buttonRef, handleKeyDown};
};
Enter 키 이벤트가 발생했을 때 HTML 버튼 요소가 존재하면 인자로 넘겼던 callback 함수를 호출하였다.
buttonRef는 없어도 잘 동작하지만 의도하지 않은 동작을 유발할 수 있어 추가하였다.
만약 EventCommentCreate 이벤트에 파라미터가 있다면 handleKeyDown 함수에서 이벤트와 파라미터를 같이 받아 진행하면 된다.
'react' 카테고리의 다른 글
| [React] Swiper 를 이용한 이미지 슬라이드 + style 입히기 (0) | 2023.03.27 |
|---|---|
| [React] 회원가입 상태관리 및 유효성 검사(정규식) (0) | 2023.03.25 |
| [React] 휴대전화 자동 하이푼(-) (0) | 2023.03.25 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 이메일
- 스타일
- input
- 브루트포스
- 알고리즘
- level2
- 프로그래머스
- swiper
- 완전탐색
- 연속 부분 수열 합의 개수
- 모음 사전
- 커스텀훅
- react
- Enter키
- Java
- 할인행사
- 자바
- 비밀번호 일치
- 슬라이드
- 정규식
- 회원가입
- 방문 길이
- 스킬트리
- 배열 자르기
- 기능개발
- 자동 하이푼
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
글 보관함
