reactjs - React FormEvent<HTMLFormElement> form input props typer
Hur gör man typer för formulärinmatningar?
const Index = () => {
const handleSubmit = async (e: FormEvent<HTMLFormElement>) => {
e.preventDefault()
console.log(e.currentTarget.elements.email)
}
return (
<Layout>
<form onSubmit={handleSubmit}>
<input name='email' type='email' autoComplete='email' required />
<input name='password' type='password' autoComplete='password' required />
<button type='submit'>Login</button>
</form>
</Layout>
)
}
Typfel:
Egenskapen 'email' finns inte på typen 'HTMLFormControlsCollection'.
Svar #1
Här FormEvent<HTMLFormElement> kommer att ge en arraylista som HTMLFormControlsCollection.
Så när du försöker få e-postadressen på detta sätt e.currentTarget.elements.email så kastas felet som,
Egenskapen 'email' finns inte på typen 'HTMLFormControlsCollection'.
Så för att få värdet av e-post måste du hämta e-postelementet inuti en array som
e.currentTarget.elements[0] (eftersom e-post är det första elementet)
Så nu har vi e-postinmatningselementet och låt oss därför tilldela det som HTMLInputElement.. och för att få värdet, använd,
console.log((e.currentTarget.elements[0] as HTMLInputElement).value);
Arbets exempel:
https://codesandbox.io/s/react-with-typescript01-37jc4
Uppdatering:
Som nämnts i kommentarsfältet har jag gjort denna uppdatering som du också kan använda,
console.log((e.currentTarget.elements.namedItem('email') as HTMLInputElement).value);
för att få e-postvärdet.. Men här, för att få e-postvärdet från array-samlingen som jag har beskrivit med [0] ..
Uppdaterad Codesandbox
https://codesandbox.io/s/react-with-typescript01-26www
Svar #2
Om du vill referera till elementet kan du använda e.currentTarget.elements[0] eller e.currentTarget.elements.namedItem('email')
och sedan kan du bara komma åt värdet.
t.ex.
const emailElement = e.currentTarget.elements.namedItem('email') as HTMLInputElement
console.log(emailElement.value)
Referenser: https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/namedItem
