1. 들어가며
사이드 프로젝트 하다가 useFunnel 사용한 구조에서 Form 트리거 시키는 방법에 대해 고민하게 되었다.
특히 부모-자식 관계가 아닌 Form을 트리거해야 하는 상황이 생겼는데, 이를 해결하면서 알게 된 방법을 소개한다.
2. button type="submit"
가장 기본적인 방법으로 button에 type을 추가해 가장 가까운 부모 노드의 form을 submit 시키는 방법이다.
<javascript />
function ParentForm() {
return (
<form onSubmit={handleSubmit(onSubmit)}>
<Child />
</form>
);
}
function Child({ register }) {
return <button type="submit">제출</button>;
}
하지만 버튼이 form 안에 있어야 한다는 제한사항이 있다.
3. form id 사용
https://developer.mozilla.org/ko/docs/Web/HTML/Element/button#form]
<button>: 버튼 요소 - HTML: Hypertext Markup Language | MDN
HTML <button> 요소는 클릭 가능한 버튼을 나타냅니다. 버튼은 양식 내부는 물론 간단한 표준 버튼 기능이 필요한 곳이라면 문서 어디에나 배치할 수 있습니다. 기본값의 HTML 버튼은 사용자 에이전
developer.mozilla.org
<javascript />
export const submitIdForm = (formId: string) => {
const formElement = document.getElementById(formId) as HTMLFormElement;
if (formElement) {
formElement.requestSubmit();
} else {
throw new Error("Form element not found");
}
};
이렇게 form에 id 프로퍼티를 넣고 타 컴포넌트에서 해당 HTMLElement를 잡아 submit 시키는 방법으로 form 외부에서 submit처리가 가능하다.
React에서 권장하지 않는 DOM api 사용이지만 snapshot을 반환하는 querySelector와 달리 getElementByID가 반환하는 htmlElement는 실시간 참조이므로 괜찮다. step만 잘 싱크해주면 됨
useFunnel로 step관리, react-hook-form 같이 사용 시 이거보다 좋은 방법을 못 찾겠다.
문제 생기면 추가 포스팅 할 예정..
https://github.com/dust-rabbit/dust-rabbit-frontend/pull/27
next step상단 버튼으로 수정 (feature/move-signup-next-button) by donghyun1998 · Pull Request #27 · dust-rabbit/dust-ra
🔄 변경 사항 기존 하단 버튼에 있던 next-step 로직을 상단 다음 버튼으로 옮겨줬습니다. 일괄 form 관리를 위해 select-gender, mbti step 컴포넌트 form으로 감싸줬습니다. 하단 버튼 삭제했습니다. 이전
github.com
상세 코드는 해당 PR에서 확인 가능
++2/23) DOM api 직접접근은 안티패턴같다 ref로 개선함
https://github.com/dust-rabbit/dust-rabbit-frontend/pull/29
회원가입 스텝 ref, state사용해서 개선 (refactor/signup-step-validation) by donghyun1998 · Pull Request #29 · dust-
2025-02-23.9.08.27-1.mov 🔄 변경 사항 상단 다음 버튼에 form validation에 따라 disable 처리하기 위해 /sign-up 에서 validation state 관리 기존에 formId로 formElement getElementByID로 잡아서 submit시키던 부분 ref로 개
github.com
++2/26) 근데 굳이 이렇게 하는거보다 외부에 있는 form submit button을 form 안에 넣는게 가장 좋은 방법이라는 피드백을 받았다.
생각해보니 그게 맞는듯? 저거 꼴랑 네브바만 안으로 넣으면 되는데 왜 이생각을 못했지..?
그냥 form 외부에서 submit 시키는방법 써보고 싶었던걸로..
'<frontend>' 카테고리의 다른 글
javascript 비동기 순서보장 잡기술 (0) | 2024.09.29 |
---|---|
트레이딩뷰 무료 고급 차트 라이브러리 신청&사용 (1) | 2024.09.29 |
React에서 동적인 key 왜 필요할까? (5) | 2024.09.20 |
styled-component -> tailwindcss migration reset css (4) | 2024.08.01 |