Загружайте изображения по одному с проблемой предварительного просмотра — React Drop zone

#react-hooks #dropzone #react-dropzone

#реагирующие хуки #dropzone #react-dropzone

Вопрос:

   const [files, setFiles] = useState([]);

  const onDrop = useCallback((acceptedFiles) => {
    // Do something with the files
    setFiles(
      acceptedFiles.map((file: File) =>
        Object.assign(file, {
          preview: URL.createObjectURL(file),
        })
      )
    );
  }, []);
  const { getRootProps, getInputProps } = useDropzone({
    onDrop,
    accept: 'image/*',
    multiple: false,
  });


  const thumbs = files.map((file: { [key: string]: string }) => (
    <div className={classes.imagePreview} key={file.name}>
      <img className={classes.image} src={file.preview} alt={file.name} />
    </div>
  ));

  useEffect(() => {
    // Make sure to revoke the data uris to avoid memory leaks
    files.forEach((file: { [key: string]: string }) =>
      URL.revokeObjectURL(file.preview)
    );
  }, [files]);
  

введите описание изображения здесь

Мой HTML

  <div className={classes.imageContainer}>
          {thumbs}
          <div className={classes.borderBox} {...getRootProps()}>
            <input {...getInputProps()} />
            <div>
              <AddIcon />
            </div>
          </div>
        </div>
  

Я пытаюсь загружать через dropzone по одному за раз, однако мое изображение заменяется вторым.

Ответ №1:

Исправлено с добавлением к состоянию

   const onDrop = useCallback(
    (acceptedFiles) => {
      // Process files
      const oneFile = get(acceptedFiles, '[0]', []);
      Object.assign(oneFile, { preview: URL.createObjectURL(oneFile) });
      setFiles([oneFile, ...files]);
    },
    [files]
  );
  

Комментарии:

1. Привет @ vini, я только что установил react-dropzone последней версии 11.0.3, и я не вижу там стиль (css). Не могли бы вы, пожалуйста, сказать мне, что я делаю не так. Я хочу запустить ваш код

2. @UsmanI вам нужно импортировать стили в ваш js, иначе это не сработает