react-dropzone React component for handling the dragging and dropping of files. react-dropzone Simple React hook to create a HTML5-compliant drag'n'drop zone for files. Documentation and examples at https://react-dropzone.js.org. Source code at https://github.com/react-dropzone/react-dropzone/.
Install react-dropzone:
npm install --save react-dropzone
src/index.js
//src/index.js import React from 'react'; import ReactDOM from 'react-dom'; import App from './App'; ReactDOM.render( <App />, document.getElementById('root') )public/index.html
//public/index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>ReactJS </title> </head> <body> <div id="root"></div> </body> </html>src/App.js
//src/App.js import DropzoneComponent from './DropzoneComponent'; function App() { return ( <div className="App"> <DropzoneComponent /> </div> ); } export default App;src/DropzoneComponent.js
//src/DropzoneComponent.js import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useDropzone } from 'react-dropzone'; const baseStyle = { display: 'flex', flexDirection: 'column', alignItems: 'center', padding: '20px', borderWidth: 2, borderRadius: 2, borderColor: '#eeeeee', borderStyle: 'dashed', backgroundColor: '#fafafa', color: '#bdbdbd', transition: 'border .3s ease-in-out' }; const activeStyle = { borderColor: '#2196f3' }; const acceptStyle = { borderColor: '#00e676' }; const rejectStyle = { borderColor: '#ff1744' }; function DropzoneComponent(props) { const [files, setFiles] = useState([]); const onDrop = useCallback(acceptedFiles => { setFiles(acceptedFiles.map(file => Object.assign(file, { preview: URL.createObjectURL(file) }))); console.log(acceptedFiles); }, []); const { getRootProps, getInputProps, isDragActive, isDragAccept, isDragReject } = useDropzone({ onDrop, accept: 'image/jpeg, image/png' }); const style = useMemo(() => ({ ...baseStyle, ...(isDragActive ? activeStyle : {}), ...(isDragAccept ? acceptStyle : {}), ...(isDragReject ? rejectStyle : {}) }), [ isDragActive, isDragReject, isDragAccept ]); const thumbs = files.map(file => ( <div key={file.name}> <img src={file.preview} alt={file.name} width="500" height="500"/> </div> )); // clean up useEffect(() => () => { files.forEach(file => URL.revokeObjectURL(file.preview)); }, [files]); return ( <section> <div {...getRootProps({style})}> <input {...getInputProps()} /> <div>Drag and drop your images here.</div> </div> <aside> {thumbs} </aside> </section> ) } export default DropzoneComponent;