Skip to content
Advertisement

Converting a class to a function

I need to convert the given class component into a functional one.

I’m working with outputting an array of multiple Editors draft-js and I’m having some trouble outputting them. On the internet, I found a working class component with an array of them, but I can’t convert it into a functional component for TS or JS.

import React from "react";
import { EditorState, ContentState } from "draft-js";
import { Editor } from "react-draft-wysiwyg";
import htmlToDraft from "html-to-draftjs";
import { stateFromHTML } from "draft-js-import-html";
import "react-draft-wysiwyg/dist/react-draft-wysiwyg.css";

export default class App extends React.Component {
  constructor(props) {
    super(props);

    const contents = [
      {
        text: "Sample text",
        HTML:
          "<p style='text-align: center;'><span style='font-size:3em;'><strong>Sample text</strong></span></p>"
      },
      {
        text: "Sample text2",
        HTML:
          "<p style='text-align: center;'><span style='font-size:3em;'><strong>Sample text2</strong></span></p>"
      }
    ];

    this.state = {
      editorStates: contents.map((element) =>
        EditorState.createWithContent(stateFromHTML(element.HTML))
      )
    };
  }

  render() {
    return (
      <>
        {this.state.editorStates.map((element, index) => {
          return (
            <Editor
              defaultEditorState={element}
              onEditorStateChange={(editorState) => {
                const newState = {
                  ...this.state
                };
                newState.editorStates[index] = editorState;

                this.setState(newState);
              }}
              key={index}
            />
          );
        })}
      </>
    );
  }
}

Can someone have enough experience to help me with this?

Advertisement

Answer

Try to change your code like this:

import React, { useState } from 'react';
import { EditorState, ContentState } from 'draft-js';
import { Editor } from 'react-draft-wysiwyg';
import htmlToDraft from 'html-to-draftjs';
import { stateFromHTML } from 'draft-js-import-html';
import 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css';

const contents = [
  {
    text: 'Sample text',
    HTML: "<p style='text-align: center;'><span style='font-size:3em;'><strong>Sample text</strong></span></p>",
  },
  {
    text: 'Sample text2',
    HTML: "<p style='text-align: center;'><span style='font-size:3em;'><strong>Sample text2</strong></span></p>",
  },
];

export default App = () => {
  const [editorStates, setEditorStates] = useState(
    contents.map((element) =>
      EditorState.createWithContent(stateFromHTML(element.HTML))
    )
  );

  return (
    <>
      {editorStates.map((element, index) => {
        return (
          <Editor
            defaultEditorState={element}
            onEditorStateChange={(editorState) => {
              const updatedState = [...editorStates];
              updatedState[index] = editorState;
              setEditorStates(updatedState);
            }}
            key={index}
          />
        );
      })}
    </>
  );
};

You can store the editorStates using the useState hook, and update it using the provided function.

User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement