Efficient way of rendering an image preview from a File
$ yarn add react-preview-file
simple
import FilePreview from 'react-preview-file'; render() { const file = new File(['someBase64'], 'me.png'); return ( <FilePreview file={file}> {(preview) => <img src={preview} />} </FilePreview> ) }
full
import FilePreview from 'react-preview-file'; class App extends React.Component { onInputChange = e => { const { currentTarget: { files } } = e; this.setState({files[0]}); } render() { const {file} = this.state; return ( <div> <input type="file" onChange={this.onChange} /> <FilePreview file={file}> {(preview) => <img src={preview} />} </FilePreview> </div> ) } }
- file: File
- children: (preview: string) => ReactNode
- Avoid multiple re-renders: FilePreview uses URL.createObjectURL instead of FileReader, the first one happens asynchronously and avoids dealing with state and multiple re-renders 👁
- Automatically revoke: FilePreview takes care for you of revoke the created preview. This makes memory usage as efficient as possible 🔥
- Efficient preview generation: Not only createObjectURL is faster than FileReader.readAsDataURL byt it also produces fixed length strings, instead of massive base64 strings ⚡️