
😎 서론
안녕하세요! 오늘은 React Hook Form 과 useRef 의 조합을 통해 특정 input 요소에 직접 전근하는 방법에 대해 공유하고자 합니다.
최근 게시판 프로젝트에서 게시글을 열 때 댓글 작성자 필드에 자동으로 포커스를 주고 싶었는데 React Hook Form 도입 시에 이를 구현하는데 어려움을 겪었습니다. 이에 대한 내용과 해결방법을 공유합니다.
🤔 문제상황 왜 ref={commentAuthorInputRef} 로는 동작하지 않을까?
React Hook Form 을 사용할 때, 주요 기능 중 하나는 register 함수입니다. 이 함수는 input 필드를 관리하고, 유효성 검사나 폼 제출 등의 다양한 기능을 제공합니다. 제가 처음에 사용한 방식은 아래와 같았습니다.
const commentAuthorInputRef = useRef(null)
...
useEffect(() => {
commentAuthorInputRef.current.focus();
}, []);
...
<input ref={commentAuthorInputRef} ... />
그런데, 위와 같은 방식으로 구현하면 React Hook Form 의 register 와 ref 와 동시에 연결되지 않아, 입력 값이 undefined 로 반환되는 문제가 발생했습니다.
register 함수는 input 필드를 등록하면서 해당 필드의 참조 ref 를 내부적으로 관리합니다. 그렇기 때문에, 외부에서 별도의 ref 를 연결할 때는 register 와의 연동이 중첩될 수 있습니다. 이 때문에, 내부적으로 폼 값의 상태 관리나 유효성 검사와 같은 기능들이 제대로 동작하지 않게 됩니다.
🌟 해경 방법: ref 를 함수로 정의하기
React Hook Form 의 register 함수는 ref 와 함께 객체를 반환합니다. 이를 입력 요소에 연결하면서 동시에 외부 ref 에도 연결해야 했기 때문에, 함수를 사용하여 이를 해결해야 합니다.
<input
{...commentRegister('author', {
required: '댓글 작성자는 필수 입력입니다.'
})}
ref={(e) => {
commentRegister('author').ref(e); // react-hook-form 을 위한 ref
commentAuthorInputRef.current = e; // 외부 ref
}}
...
/>
위 코드에서 중요한 점은 ref 함수가 두 가지 연결 작업을 동시에 수행한다는 것입니다.
1. React Hook Form 의 ref 에 요소(HTMLInputElement)를 연결
2. 외부 ref에도 동일한 요소(HTMLInputElement)를 연결
이를 통해 React Hook Form 의 기능을 그대로 활용하면서도, 외부에서도 input 요소에 접근할 수 있게되었습니다.🤭
🎬 결론
React Hook Form 은 매우 편리한 도구이지만, 때때로 다른 React 기능과의 조합이 필요할 때가 있습니다. 오늘 소개한 방식은 그러한 경우에도 도움이 될 것입니다. 특히, 외부 ref와 함께 React Hook Form 을 사용하고자 할 때 이 방식이 큰 도움이 될 것입니다.
그럼 오늘도 즐겁게 코딩하세요! 😁
'💻 프로그래밍 > 🆁 React' 카테고리의 다른 글
동적 라우팅 사용 페이지 모드 관리 (0) | 2023.08.20 |
---|---|
React Router 에서 Navigate 함수를 확장하여 사용하기 (0) | 2023.08.17 |
리액트 사용의 이해 (0) | 2022.11.18 |
React 프로젝트에 sass 연결시 Node Sass version 6.0.1 is incompatible with ^4.0.0 || ^5.0.0. 에러 해결 (0) | 2021.07.18 |
React Router, a 태그 (0) | 2021.07.17 |