Reputation: 5150
The error I get is Property 'files' does not exist on type 'ChangeEvent<HTMLInputElement>
Why cant I access the files array from the file input?
Is this a case where useRef is ok to use?
import React from 'react';
const Photo: React.FC = () => {
const [state, setState] = useState({
photo: '',
});
const {
photo,
} = state;
const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {
'ChangeEvent<HTMLInputElement>
event.persist();
setState((prev) => ({
...prev,
[event.target.id]: event.target.value,
}));
console.log(state.photo) // returns nothing
console.log(event.files[0]);
// ^
// Property 'files' does not exist on type
};
return (
<div className='photo'>
<label>
Click Me
<input
type='file'
id='photo'
name='photo'
accept='image/png, image/jpeg'
onChange={onChange}
value={photo}
></input>
</label>
</div>
);
};
Upvotes: 28
Views: 87694
Reputation: 179
const [file, setFile] = useState<File | null>(null);
const handleChangeFile = (e: ChangeEvent<HTMLInputElement>) => {
const files = e.currentTarget.files
if (files)
setFile(files[0])
}
<input
type={'file'}
multiple={false}
accept="application/pdf"
onChange={handleChangeFile}
/>
Upvotes: 2
Reputation: 315
I use this way to add files
const onChange = (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
const files = (e.target as HTMLInputElement).files;
if (files) {
setFormData((prevState) => ({
...prevState,
images: files,
}));
}
};
Upvotes: 10
Reputation: 631
console.log(state.photo) // returns nothing
This returns nothing because when you set state its value is available on the next render cycle. So if you select another file with your file input, then, console.log(state.photo)
will log the previous file name.
If you want to log the current selected file, use:
console.log(event.target.value)
Take a look at my example: https://codesandbox.io/s/pensive-cdn-1fnuv
And
console.log(event.files[0]);
will throw error. Don't use it.
Upvotes: 3
Reputation: 38046
files
is property of an input (HTMLInputElement
) and not of the event.
So it should be event.currentTarget.files
Upvotes: 48