A simple images uploader applied Render Props pattern with react

Sep 02, 2020
A simple images uploader applied Render Props pattern with react


The simple images uploader applied Render Props pattern that allows you to fully control UI component and behaviors.

View Demo View Github

The simple images uploader applied Render Props pattern. (You can read more about this pattern here).

This approach allows you to fully control UI component and behaviours.



npm install --save react-images-uploading


yarn add react-images-uploading


You can check out the basic demo here:


import React from 'react'; import ImageUploading from 'react-images-uploading'; export function App() { const [images, setImages] = React.useState([]); const maxNumber = 69; const onChange = (imageList, addUpdateIndex) => { // data for submit console.log(imageList, addUpdateIndex); setImages(imageList); }; return ( <div className="App"> <ImageUploading multiple value={images} onChange={onChange} maxNumber={maxNumber} dataURLKey="data_url" > {({ imageList, onImageUpload, onImageRemoveAll, onImageUpdate, onImageRemove, isDragging, dragProps, }) => ( // write your building UI <div className="upload__image-wrapper"> <button style={isDragging ? { color: 'red' } : undefined} onClick={onImageUpload} {...dragProps} > Click or Drop here </button> &nbsp; <button onClick={onImageRemoveAll}>Remove all images</button> {, index) => ( <div key={index} className="image-item"> <img src={image['data_url']} alt="" width="100" /> <div className="image-item__btn-wrapper"> <button onClick={() => onImageUpdate(index)}>Update</button> <button onClick={() => onImageRemove(index)}>Remove</button> </div> </div> ))} </div> )} </ImageUploading> </div> ); }


... {({ imageList, onImageUpload, onImageRemoveAll, errors }) => ( errors && <div> {errors.maxNumber && <span>Number of selected images exceed maxNumber</span>} {errors.acceptType && <span>Your selected file type is not allow</span>} {errors.maxFileSize && <span>Selected file size exceed maxFileSize</span>} {errors.resolution && <span>Selected file is not match your desired resolution</span>} </div> )} ...

Drag and Drop

... {({ imageList, dragProps, isDragging }) => ( <div {...dragProps}> {isDragging ? "Drop here please" : "Upload space"} {, index) => ( <img key={index} src={image.data_url} /> ))} </div> )} ...


valuearray[]List of images
onChangefunction(imageList, addUpdateIndex) => voidCalled when add, update or delete action is called
dataURLKeystringdataURLCustomized field name that base64 of selected image is assigned to
multiplebooleanfalseSet true for multiple chooses
maxNumbernumber1000Number of images user can select if mode = multiple
onErrorfunction(errors, files) => voidCalled when it has errors
acceptTypearray['jpg', 'gif', 'png'][]The file extension(s) to upload
maxFileSizenumberMax image size (Byte) and it is used in validation
resolutionTypestring'absolute' | 'less' | 'more' | 'ratio'Using for image validation with provided width & height
resolutionWidthnumber> 0
resolutionHeightnumber> 0



absoluteimage's width === resolutionWidth && image's height === resolutionHeight
ratio(resolutionWidth / resolutionHeight) === (image width / image height)
lessimage's width < resolutionWidth && image's height < resolutionHeight
moreimage's width > resolutionWidth && image's height > resolutionHeight

Exported options

imageListarrayList of images to render.
onImageUploadfunctionCalled when an element is clicks and triggers to open a file dialog
onImageRemoveAllfunctionCalled when removing all images
onImageUpdate(updateIndex: number) => voidCalled when updating an image at updateIndex.
onImageRemove(deleteIndex: number | number[]) => voidCalled when removing one or list image.
errorsobjectExported object of validation
dragPropsobjectNative element props for drag and drop feature
isDraggingboolean"true" if an image is being dragged