React Загрузите файл SVG и создайте компонент с помощью

Я хочу показать SVG после загрузки с входным файлом. Но я не хочу, чтобы он отображался с тегом изображения и base64, но с тегом svg.

Я сделал входной файл, чтобы загрузить его следующим образом:

import React from "react";
import { FormWrapper, UploadInput, LabelUploadInput, SubmitButton, Preview } from './ImageUpload.style.js';

class ImageUpload extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      file: '',
      imagePreviewUrl: ''
    };
  }

  handleSubmit(e, img) {
    e.preventDefault();
    console.log('handle uploading-', this.state.file);
    this.props.clickHandler(this.state.file, img);
  }

  handleImageChange(e) {
    e.preventDefault();

    let reader = new FileReader();
    let file = e.target.files[0];

    reader.onloadend = () => {
      this.setState({
        file: file,
        imagePreviewUrl: reader.result
      });
    }

    reader.readAsDataURL(file)
  }

  render() {
    let {imagePreviewUrl} = this.state;
    let $imagePreview = null;
    if (imagePreviewUrl) { console.log('imagePreviewUrl',imagePreviewUrl);
      $imagePreview = (<img src={imagePreviewUrl} style={{ position: 'absolute', left: '216px', width: '54px', height: '54px' }}/>);
    } else {
      $imagePreview = (<Preview>Aperçu</Preview>);
    }

    return (
      <>
        <FormWrapper onSubmit={(e)=>this.handleSubmit(e, imagePreviewUrl)}>
          <UploadInput className="fileInput"
                 type="file"
                 accept=".svg"
                 id={'uploadFile'}
                 onChange={(e)=>this.handleImageChange(e)} />
          <LabelUploadInput
            htmlFor={'uploadFile'}>
            Choisir un SVG
          </LabelUploadInput>
          <SubmitButton
                  type="submit"
                  onClick={(e)=>this.handleSubmit(e, imagePreviewUrl)}>Upload Image</SubmitButton>
        </FormWrapper>
        {$imagePreview}
      </>
    )
  }
}

export { ImageUpload };
export default ImageUpload;

это работает нормально. И в этом родительском компоненте я получаю информацию SVG:

handleUploadFile(file, img) {
    this.setState({
      nameBackgroundElt: file.name.slice(0,-4),
      imageBackgroundUrl: img
    });
  }

но я не знаю, как показать это с тегом SVG. Я пытаюсь декодировать base64 следующим образом:

    var base64 = 'PHN2ZyBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDEyOCAxMjgiIHdpZHRoPSI1MTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9IkxheWVyXzIiIGRhdGEtbmFtZT0iTGF5ZXIgMiI+PGNpcmNsZSBjeD0iNjQiIGN5PSI2NCIgZmlsbD0iIzIzYThmZSIgcj0iMzUiLz48cGF0aCBkPSJtMzcuOTIxIDY3LjQyMy01LjA0LTQuMDMyLTIuMTUuNDctMS43LTEuMTA4Yy0uMDE0LjQxNS0uMDMxLjgyOS0uMDMxIDEuMjQ3YTM0Ljg0MiAzNC44NDIgMCAwIDAgNy4xMzcgMjEuMTc1bDMuODYzLTQuOTE2IDguNjA1LTEuMDA3LjA2Ni03LjYtNC4xLTUuMjQyeiIgZmlsbD0iIzhhZmZjNyIvPjxwYXRoIGQ9Im05Mi4zMyA0OS40IDQuODExIDMuMzVhMzUgMzUgMCAwIDAgLTQyLjI1MS0yMi41NDVsLjQxNiAxLjg1OCAxNS43MzUgNC4xNzYgMTEuNDU5IDQuNzQ4LTYuOTMyIDMuMTc2LTExLjY5OC0xLjI4OS0zLjU3LTMuNTc0LTUuOSAyLjMyNC03LjY4NiA3LjY4NnYxMC4xNDFsNS4xODMgNS4xODRoNi42MTRsNy43NzYgNy43NzV2OS45MjFsNS43NjEgNS43NjkgNy4zNzMtNy4zNzN2LTQuMjlsMy40LTMuNHYtNi43N2w1LjM3My01LjM3NC0xLjE4NC02LjY3My03LjM0LTQuNzQ0IDcuMDMtMy4wODd6IiBmaWxsPSIjOGFmZmM3Ii8+PHBhdGggZD0ibTY0IDExMi40MTlhNDguNDY2IDQ4LjQ2NiAwIDAgMSAtNDguMzg3LTQ3LjE3Mmg0LjEzN2wtOS0xMS43NS05IDExLjc1aDQuMDMyYTU4LjIzMiA1OC4yMzIgMCAwIDAgMTEwLjQ5NCAyNC40MjlsLTYuODY0LTguOTZhNDguNDY0IDQ4LjQ2NCAwIDAgMSAtNDUuNDEyIDMxLjcwM3oiIGZpbGw9IiNmZWU1NWEiLz48cGF0aCBkPSJtMTIyLjIxOCA2Mi43NTNhNTguMjMyIDU4LjIzMiAwIDAgMCAtMTEwLjQ5NC0yNC40MjlsNi44NjQgOC45NmE0OC4zOTIgNDguMzkyIDAgMCAxIDkzLjggMTUuNDY5aC00LjEzOGw5IDExLjc1IDktMTEuNzV6IiBmaWxsPSIjZmVlNTVhIi8+PGcgZmlsbD0iIzIzMWYyMCI+PHBhdGggZD0ibTU0LjUyNCAyOC41aC0uMDE2Yy0uMDIgMC0uMDM3LjAxNC0uMDU2LjAxOWEzNi43MiAzNi43MiAwIDAgMCAtMTkuOCA1Ny41NzYgMS43ODkgMS43ODkgMCAwIDAgLjIzMS4yOTQgMzYuNzMgMzYuNzMgMCAwIDAgNjMuOTE3LTM0LjE3OGMtLjAxNC0uMDQzLS4wMjYtLjA4Ny0uMDQ0LS4xMjlhMzYuNzI5IDM2LjcyOSAwIDAgMCAtNDQuMjMyLTIzLjU4MnptLTIzLjczMyAzNy4xMDZhMS43NTUgMS43NTUgMCAwIDAgLjMxMy0uMDM1bDEuMzM1LS4yOTMgNC4zODkgMy41MTJhMS43NTUgMS43NTUgMCAwIDAgMS4zNTcuMzY0bDUuNjQzLS44NTcgMy4wOTIgMy45NTQtLjA0NyA1LjQ0Mi03LjA3Mi44MjhhMS43NDYgMS43NDYgMCAwIDAgLTEuMTcyLjY1NmwtMi40MDkgMy4wNjNhMzMuMDIzIDMzLjAyMyAwIDAgMSAtNS40MjktMTYuNjM0em02Mi4yMTYtMTcuODMxLTUuNDg3LTIuOTNhMS43NDQgMS43NDQgMCAwIDAgLTEuNTI5LS4wNThsLTcuMDI0IDMuMDg4YTEuNzUgMS43NSAwIDAgMCAtLjI0NiAzLjA3MWw2LjcgNC4zMjkuODkyIDUuMDI1LTQuNzMzIDQuNzI4YTEuNzUyIDEuNzUyIDAgMCAwIC0uNTEzIDEuMjM4djYuMDQ2bC0yLjg4MyAyLjg4MmExLjc0OCAxLjc0OCAwIDAgMCAtLjUxMyAxLjIzOHYzLjU2OGwtNS42MjMgNS42Mi00LjAxNS00LjAxNXYtOS4yYTEuNzUgMS43NSAwIDAgMCAtMy41IDB2OS45MmExLjc1IDEuNzUgMCAwIDAgLjUxMyAxLjIzN2w1Ljc2NSA1Ljc2NWExLjc0OCAxLjc0OCAwIDAgMCAyLjQ3NCAwbDcuMzczLTcuMzczYTEuNzUgMS43NSAwIDAgMCAuNTEzLTEuMjM3di0zLjU2MWwyLjg4NC0yLjg4M2ExLjc0OSAxLjc0OSAwIDAgMCAuNTEyLTEuMjM3di02LjA0Nmw0Ljg2Mi00Ljg2YTEuNzQ3IDEuNzQ3IDAgMCAwIC40ODUtMS41NDNsLTEuMTg1LTYuNjczYTEuNzQ4IDEuNzQ4IDAgMCAwIC0uNzcyLTEuMTY0bC00LjYwNy0yLjk3OSAzLjI3MS0xLjQzOCA0Ljc5NCAyLjU2IDQuMjQ0IDIuOTU1YTMzLjIzOCAzMy4yMzggMCAwIDEgLTU3LjI4NiAzMS4zMTRsMi41NTctMy4yNSA3Ljg4Mi0uOTIyYTEuNzUgMS43NSAwIDAgMCAxLjU0Ny0xLjcyM2wuMDY2LTcuNmExLjc1OSAxLjc1OSAwIDAgMCAtLjM3MS0xLjA5M2wtNC4xLTUuMjQyYTEuNzYgMS43NiAwIDAgMCAtMS42NDItLjY1MmwtNS45Ljg5NS00LjQ0Mi0zLjU1NGExLjc1NiAxLjc1NiAwIDAgMCAtMS40NjgtLjM0M2wtMS40My4zMjItLjI0NC0uMTU5YTMzLjMxNCAzMy4zMTQgMCAwIDEgMjIuNzY2LTI5LjQxNHYuMDE4YTEuNzQ4IDEuNzQ4IDAgMCAwIDEuMjU4IDEuMzFsMTUuNjI3IDQuMTQ1IDcuNjQxIDMuMTY4LTIuODQ1IDEuMy0xMC42MDItMS4xNjgtMy4xNC0zLjE0YTEuNzQ2IDEuNzQ2IDAgMCAwIC0xLjg3OS0uMzkxbC01LjkgMi4zMjRhMS43NDMgMS43NDMgMCAwIDAgLS42LjM5MWwtNy42ODUgNy42ODVhMS43NTIgMS43NTIgMCAwIDAgLS41MTMgMS4yMzh2MTAuMTQ0YTEuNzUgMS43NSAwIDAgMCAuNTEzIDEuMjM3bDUuMTgzIDUuMTg0YTEuNzUyIDEuNzUyIDAgMCAwIDEuMjM4LjUxM2g2LjYxM2ExLjc1IDEuNzUgMCAwIDAgMC0zLjVoLTUuODg0bC00LjE1OC00LjE1OHYtOC42OTRsNi45MTYtNi45MTUgNC40OTMtMS43NyAyLjc2MyAyLjc2M2ExLjc0MiAxLjc0MiAwIDAgMCAxLjA0Ni41bDExLjY5NCAxLjI4OWExLjc1MyAxLjc1MyAwIDAgMCAuOTItLjE0OGw2LjkzMi0zLjE3NmExLjc0OSAxLjc0OSAwIDAgMCAtLjA1OS0zLjIwN2wtMTEuNDU1LTQuNzQ3YTEuNiAxLjYgMCAwIDAgLS4yMjEtLjA3NWwtMTIuNzM3LTMuMzc5YTMzLjIxNCAzMy4yMTQgMCAwIDEgMzQuMjU0IDE2LjYwN3oiLz48cGF0aCBkPSJtMTEwLjggNzkuNjUxYTEuNzUgMS43NSAwIDAgMCAtMy4wMzEuNDU5IDQ2LjY0MiA0Ni42NDIgMCAwIDEgLTkwLjMyNi0xMy4xMWgyLjMwN2ExLjc1MSAxLjc1MSAwIDAgMCAxLjM5LTIuODE0bC05LTExLjc1YTEuODE1IDEuODE1IDAgMCAwIC0yLjc4IDBsLTkgMTEuNzVhMS43NTEgMS43NTEgMCAwIDAgMS4zOSAyLjgxNGgyLjM0MmE1OS45ODQgNTkuOTg0IDAgMCAwIDExMy43NTUgMjMuNDQ5IDEuNzUxIDEuNzUxIDAgMCAwIC0uMTgxLTEuODM3em0tNDYuOCA0MC44NDlhNTYuNzk0IDU2Ljc5NCAwIDAgMSAtNTYuNDY5LTU1LjI5IDEuNzUgMS43NSAwIDAgMCAtMS43NS0xLjcxaC0uNDgxbDUuNDU1LTcuMTIyIDUuNDQ1IDcuMTIyaC0uNTkyYTEuNzQ5IDEuNzQ5IDAgMCAwIC0xLjc0OSAxLjggNTAuMTM5IDUwLjEzOSAwIDAgMCA5Ni4wMjYgMTguOTFsNC4zMzUgNS42NmE1Ni4xNDEgNTYuMTQxIDAgMCAxIC01MC4yMiAzMC42M3oiLz48cGF0aCBkPSJtMTI3LjgxOSA2MS45NzlhMS43NDkgMS43NDkgMCAwIDAgLTEuNTY5LS45NzloLTIuMzQyYTU5Ljk4NCA1OS45ODQgMCAwIDAgLTExMy43NTUtMjMuNDQ5IDEuNzUxIDEuNzUxIDAgMCAwIC4xODEgMS44MzdsNi44NjYgOC45NjFhMS43NSAxLjc1IDAgMCAwIDMuMDMxLS40NTkgNDYuODU3IDQ2Ljg1NyAwIDAgMSA0My43NjktMzAuNTU5IDEuNzUgMS43NSAwIDAgMCAwLTMuNSA1MC4zODUgNTAuMzg1IDAgMCAwIC00NS44ODUgMjkuOTU5bC00LjMzNS01LjY2YTU2LjE0MSA1Ni4xNDEgMCAwIDEgNTAuMjItMzAuNjMgNTYuNzk0IDU2Ljc5NCAwIDAgMSA1Ni40NjkgNTUuMjkgMS43NSAxLjc1IDAgMCAwIDEuNzUgMS43MTNoLjQ4NmwtNS40NTUgNy4xMjItNS40NS03LjEyNWguNTkyYTEuNzQ5IDEuNzQ5IDAgMCAwIDEuNzQ5LTEuOCA1MC40MDcgNTAuNDA3IDAgMCAwIC0yMS41Mi0zOS44NzkgMS43NSAxLjc1IDAgMCAwIC0yIDIuODcxIDQ2LjkyIDQ2LjkyIDAgMCAxIDE5LjkzNiAzNS4zMDhoLTIuMzA3YTEuNzUxIDEuNzUxIDAgMCAwIC0xLjM5IDIuODE0bDkgMTEuNzVhMS43NTEgMS43NTEgMCAwIDAgMi43OCAwbDktMTEuNzVhMS43NTEgMS43NTEgMCAwIDAgLjE3OS0xLjgzNXoiLz48cGF0aCBkPSJtODAuMDU4IDIwLjE3OWExLjc1IDEuNzUgMCAxIDAgMS4yMDctMy4yODVjLTEuMzYxLS41LTIuNzUyLS45NDQtNC4xMzYtMS4zMmExLjc1IDEuNzUgMCAxIDAgLS45MTYgMy4zNzljMS4yODcuMzQ3IDIuNTguNzYxIDMuODQ1IDEuMjI2eiIvPjwvZz48L2c+PC9zdmc+';

      var svg = atob(base64);
      const attr = 'id="test" className="cancelDragCity"';
      svg = svg.replace('<svg ', '<svg ' + attr);
     <Test svg={svg} />

где Test — это простой компонент, который анализирует и отображает SVG.

import React from 'react';
import parse from 'html-react-parser';

class Test extends React.Component {
  render() {
    const parse = require('html-react-parser');
    const svg = parse(this.props.svg);
    return (
      svg
    );
  }
}

export { Test };
export default Test;

Это показывает правильный SVG в браузере. Но после перетаскивания реакция не работает. И если я изменяю SVG, загруженный реагирующим компонентом SVG (не загруженным, а в коде), все в порядке.

Но я хочу сделать это с загруженным SVG.

Знаете ли вы модуль реакции для этого? или какой совет?

Большое спасибо.

Я попытался использовать опасно SetInnerHTML, как этот пост:

Разобрать файл SVG в компонент React

но у меня такая же проблема в этом посте, я не могу

<svg>
   <svg>
      ...
   </svg>
</svg>

только один тег SVG.


person Gorn    schedule 25.07.2020    source источник


Ответы (1)


Вы можете загрузить строку откуда угодно и использовать https://github.com/hugozap/react-svgmt для динамической вставки содержимого SVG. Это создаст элемент SVG.

(Используйте svgXML для передачи содержимого строки svg)

person Hugo Zapata    schedule 26.07.2020