interface IInput{
errors?:string[];
name:string
}
export default function Input({errors,name, ...extraProps}:IInput & InputHTMLAttributes<HTMLInputElement>){
<input
name={name}
{...extraProps}
/>
})
coerce를 사용한다.//action.ts
const tokenSchema = z.coerce.number()
export async function smsLogin(prev:any,formData:FormData) {
//여기 들어오는 formData가 모두 string으로 변환됨
}
//두개 다 똑같은 기능이지만 코드만 조금 다름
const phoneSchema = z.string().trim().refine(validator.isMobilePhone,"Wrong phone format")
//특정 지역 번호만 인증 가능하도록 구현 가능
const phoneSchema = z.string().trim().refine(phone => validator.isMobilePhone(pnone,"ko_KR"))
serverAction을 사용하면서 useActionState에서 애를 먹었다. Next15,react19 버전에선 useFormState를 사용하지 못해서 useActionState을 사용하였더니 버튼을 눌렀을때 입력값이 틀린경우 기존에 작성했던 input의 내용이 모두 사라지는 이슈가 발생했다. 강의랑 버전이 다르게 최신버전을 사용하니 이런 이슈들이 발생하는데 단순히 버전을 내리면 문제는 해결되지만 실무에선 버전을 어떻게 쓸지 모르기에 해결을 했지만 버전을 내리는게 좋은건지 문제를 해결하는게 좋은건지는 잘 모르겠다.
문제
버튼을 눌렀을때 입력값이 틀린경우 기존에 작성했던 input의 내용이 모두 사라지는 이슈가 발생했다.
해결
1. action.ts에서 유효성 검사 성공하지 못할시 form데이터를 저장하도록 작업하였다.
2. input에 defaultValue를 작성하여 기본값을 넣어주었다.
//action.ts
const form = {
email:formData.get("email") as string,
username:formData.get("username") as string,
password:formData.get("password") as string
}
if(!result.success){
return {
fieldErrors:result.error.flatten().fieldErrors,
//성공하지 못할시 form데이터 저장
form,
success:false
}
}else{
return {
//성공 할 시 form데이터 초기화
form: { email: "", username: "", password: "" },
fieldErrors: {},
success:true
}
}
//page.tsx
const [state,action] = useActionState(onSubmit,{
form: { email: "", username: "", password: "" },
fieldErrors: {},
success:false
})
<Input name="email" type="email" placeholder="Email" required defaultValue={state?.form?.email}/>
//page.tsx
const [formInput, setFormInput] = useState({
email: '',
username: '',
password: '',
});
const onInputChange = (ev: ChangeEvent<HTMLInputElement>) => {
const {
currentTarget: { name, value },
} = ev;
if (!(name in formInput)) {
return;
}
setFormInput((prevInput) => ({ ...prevInput, [name]: value }));
};
<FormInput
label='Email'
placeholder='email'
name='email'
type='email'
value={formInput.email}
onChange={onInputChange}
errorMessage={state?.errors?.fieldErrors.email}
/>
세상은 넓고 천재는 많다.. 더 열심히 공부해야지 ㅠ