Проблема с отображением загрузки файла для изображения в черновике JS

#reactjs #blogs #rich-text-editor #draftjs

#reactjs #Блоги #форматированный текстовый редактор #draftjs

Вопрос:

Я использую draft-js для отображения редактора в веб-приложении. Но я сталкиваюсь с проблемой при отображении опции загрузки файла в редакторе черновиков.

вот скриншот : 1

Вот как редактор показан в их демо 2

Вы можете проверить демонстрацию здесь https://jpuri.github.io/react-draft-wysiwyg /#/

Пожалуйста, проверьте приведенный ниже код и предложите решение :

 import React, { Component } from 'react';
import logo from './logo.svg';

import { EditorState } from 'draft-js';
import { Editor } from 'react-draft-wysiwyg';
import 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css';


class App extends Component {

  constructor(props) {
    super(props);
    this.state = {
      editorState: EditorState.createEmpty(),
    };
  }

  onEditorStateChange: Function = (editorState) => {
    this.setState({
      editorState,
    });
  };

  render() {
    const { editorState } = this.state;
    return (
      <div className="App">
        <header className="App-header">

         <Editor
  editorState={editorState}
  toolbarClassName="toolbarClassName"
  wrapperClassName="wrapperClassName"
  editorClassName="editorClassName"
  onEditorStateChange={this.onEditorStateChange}
toolbar={{
    inline: { inDropdown: true },
    list: { inDropdown: true },
    textAlign: { inDropdown: true },
    link: { inDropdown: true },
    history: { inDropdown: true },
    inputAccept: 'application/pdf,text/plain,application/vnd.openxmlformatsofficedocument.wordprocessingml.document,application/msword,application/vnd.ms-excel'
  }}
/>
         </header>
      </div>
    );
  }
}

export default App;
  

Ответ №1:

Решена проблема. Я забыл реализовать функцию обратного вызова для загрузки файла. Вот рабочий код:

     import React, { Component } from 'react';
    import logo from './logo.svg';
    
    import { EditorState } from 'draft-js';
    import { Editor } from 'react-draft-wysiwyg';
    import 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css';
    
    
    class App extends Component {
    
      constructor(props) {
        super(props);
        this.state = {
          editorState: EditorState.createEmpty(),
          uploadedImages: []
        };
        this._uploadImageCallBack = this._uploadImageCallBack.bind(this);
      }
    
      onEditorStateChange: Function = (editorState) => {
        this.setState({
          editorState,
        });
      };
    
    
      _uploadImageCallBack(file) {
        // long story short, every time we upload an image, we
        // need to save it to the state so we can get it's data
        // later when we decide what to do with it.
    
        // Make sure you have a uploadImages: [] as your default state
        let uploadedImages = this.state.uploadedImages;
    
        const imageObject = {
          file: file,
          localSrc: URL.createObjectURL(file),
        }
    
        uploadedImages.push(imageObject);
    
        this.setState({ uploadedImages: uploadedImages })
    
        // We need to return a promise with the image src
        // the img src we will use here will be what's needed
        // to preview it in the browser. This will be different than what
        // we will see in the index.md file we generate.
        return new Promise(
          (resolve, reject) => {
            resolve({ data: { link: imageObject.localSrc } });
          }
        );
      }
      render() {
        const { editorState } = this.state;
        return (
          <div className="App">
            <header className="App-header">
    
              <Editor
                editorState={editorState}
                toolbarClassName="toolbarClassName"
                wrapperClassName="wrapperClassName"
                editorClassName="editorClassName"
                onEditorStateChange={this.onEditorStateChange}
                toolbar={{
                  inline: { inDropdown: true },
                  list: { inDropdown: true },
                  textAlign: { inDropdown: true },
                  link: { inDropdown: true },
                  history: { inDropdown: true },
                  image: { uploadCallback: this._uploadImageCallBack },
                  inputAccept: 'application/pdf,text/plain,application/vnd.openxmlformatsofficedocument.wordprocessingml.document,application/msword,application/vnd.ms-excel'
                }}
              />
            </header>
          </div>
        );
      }
    }
    
    export default App;