일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- JavaScript
- kubernetes
- 자바스크립트
- 쿠버네티스
- k8s
- 백엔드
- HTML
- 타입스크립트
- CSS
- react
- 백준
- es6
- 클라우드
- docker
- VUE
- 프론트엔드
- 파이썬
- next.js
- 가상화
- 이더리움
- TypeScript
- BFS
- AWS
- 솔리디티
- 컴퓨터공학
- 리액트
- 블록체인
- 웹
- 알고리즘
- 이슈
Archives
- Today
- Total
즐겁게, 코드
React 19의 form submit 동작 개선사항 본문
이틀 전 React 19의 stable 버전이 배포되었는데, 여러 번경사항들 중에서 크게 두 가지가 피부에 와닿았다.
하나는 더이상 ref를 하위 컴포넌트에 전달할 때 forwardRef
를 사용하지 않아도 된다는 것이고, 다른 하나는 form submit의 동작이 살짝 변했다는 것이다.
💡 만약 폼에서 다루는 데이터 및 검증 구조가 복잡해지거나, 컴포넌트 구조가 중첩된다면 react-hook-form을 도입해볼 것을 권해드립니다.
먼저 React 18 이하에서는 폼 제출 코드를 다음과 같이 작성한다.
// React @^18
import { FormEventHandler } from "react";
const App = () => {
const handleSubmit: FormEventHandler<HTMLFormElement> = (e) => {
// submit 이벤트는 기본적으로 새로고침을 유발한다.
e.preventDefault(); // (개인적으로) 불필요하다고 느끼는 부분 (1)
const formData = new FormData(e.currentTarget); // 불필요하다고 느끼는 부분 (2)
const id = formData.get("id");
const password = formData.get("password");
console.log("아이디:", id);
console.log("비밀번호:", password);
};
return (
<div>
<form onSubmit={handleSubmit}>
<div>
<label htmlFor="id">아이디</label>
<input id="id" name="id" />
</div>
<div>
<label htmlFor="password">비밀번호</label>
<input id="password" />
</div>
<button type="submit">로그인</button>
</form>
</div>
);
};
export default App;
질 알려진 것처럼 submit 이벤트는 기본적으로 새로고침을 발생시키기 때문에, 기본 동작을 수행하지 않도록 최상단에 preventDefautl()
메서드를 호출하는 모습이다.
그런데, React 19에서는 해당 문법이 보다 사용하기 쉽게 변했다.
// React @^19
const App = () => {
const handleSubmit = (formData: FormData) => {
const id = formData.get("id"); // "id" 필드의 값 추출
const password = formData.get("password"); // "password" 필드의 값 추출
console.log("아이디:", id);
console.log("비밀번호:", password);
};
return (
<div>
<form action={handleSubmit}> // onSubmit 대신 action 속성에 메서드를 전달한다.
<div>
<label htmlFor="id">아이디</label>
<input id="id" name="id" />
</div>
<div>
<label htmlFor="password">비밀번호</label>
<input id="password" />
</div>
<button type="submit">로그인</button>
</form>
</div>
);
};
export default App;
먼저 preventDefault()
메서드를 호출하지 않아도 페이지가 새로고침되지 않도록 변했다.
또 폼 내부 값을 추출하기 위해 명시적으로 formData
인스턴스를 생성할 필요도 없고, event.currentTarget
을 추출하지 않아도 된다.
개인적으로는 onSubmit 핸들러는 그대로 유지해 breaking change를 만들지 않으면서, 간만에 서버 컴포넌트가 아닌 기본적인 웹 개발 경험을 끌어올려줄 수 있는 React 팀의 작은 선물처럼 느껴져 반가웠던 것 같다. 🙂
반응형
'🎨 프론트엔드 > React.js' 카테고리의 다른 글
React 18의 "Property 'children' does not exist..." 이슈 (0) | 2022.06.26 |
---|---|
이벤트 핸들러, 제대로 제거하고 계셨나요? (1) | 2021.12.31 |
미리 만나보는 automatic batching (0) | 2021.12.27 |
ReactNode, ReactChild, ReactElement 타입 비교 (0) | 2021.10.16 |
야, 너도 상태관리 할 수 있어 2편 : 리코일 사용하기 (0) | 2021.08.25 |
Comments
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆