Как изменить исходное содержимое редактора DraftJS по мере изменения состояния?

#reactjs #draftjs

#reactjs #draftjs

Вопрос:

Я запустил редактор с некоторым содержимым, используя Draft.js. Начальное содержимое, определенное в состоянии, как показано в примере ниже. Как я могу заменить все содержимое новым содержимым при изменении состояния. В следующем примере, который я попробовал, state initData отображается как What is your name? , когда пользователь нажимает на input button , состояние меняется на Quel est votre nom? , и преобразованный контент должен заменить редактор.

 import React, { Component } from 'react';
import { EditorState, ContentState, convertFromHTML} from 'draft-js';

export default class DraftEditor extends Component {
  constructor(props) {
    super(props);
    this.state = {
      editorState: EditorState.createEmpty(),
      initData: "What is your name?"           //Initial data and will be updated on button click
    };
    this.changeContent = this.changeContent.bind(this);

    const blocksFromHtml = this.state.initData;
    const html = blocksFromHtml;
    const blocksFromHTML = convertFromHTML(html)
    const content = ContentState.createFromBlockArray(
      blocksFromHTML.contentBlocks,
      blocksFromHTML.entityMap
    );
    this.state = { editorState: EditorState.createWithContent(content)};
    this.onChange = (editorState) => {
      this.setState({editorState});
    }
  }

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

  changeContent() {
    this.setState({ initData: "Quel est votre nom?" });   //This is the data that will be replaced the initial data
  }

  render(){
    return (
        <React.Fragment>
            <input type='button' value="change" onClick={this.changeContent} />
            <Editor editorState={editorState} />
        </React.Fragment>
    );
  }
}
  

Ответ №1:

Используйте contentState для инициализации редактора, а также для изменения исходного содержимого. Для инициализации вместо EditorState.createEmpty() добавления всех других строк кода в вашем конструкторе используйте:

 this.state = {
  editorState: EditorState.createWithContent(
               ContentState.createFromText('What is your name?')
              ),
};
  

Чтобы изменить эти данные в вашем обработчике кликов, выполните что-то вроде следующего:

       changeContent() {
        this.setState({
             editorState: EditorState.createWithContent(
                          ContentState.createFromText('Quel est votre nom?')
                          )
         });   
       }