Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
429 views
in Technique[技术] by (71.8m points)

reactjs - TinyMCE React content in empty in custom button

In my tinyMCE custom button, the editor content is always empty.

import React, { useEffect, useState } from "react";
import { Editor } from '@tinymce/tinymce-react';

const TINYMCEKEY = 'MY_SECRET_KEY';

const MyForm = () => {
   const [ editorContent, setEditorContent ] = useState("");

   useEffect(() => {
      const text = "This is a Test";
      setEditorContent(text);
   });

   const handleEditorChange = (content) => {
      setEditorContent(content);
   }

   return (
      <>
         <Editor
            apiKey={TINYMCEKEY}
            value={editorContent}
            init={{
               height: 600,
               menubar: false,
               branding: false,
               plugins: [
                  "print"
               ],
               setup: function (editor) {
                  editor.ui.registry.addButton('testBTN', {
                     text: "My Button",
                     onAction: function () {
                        console.log(editorContent); // It's always empty
                     }
                  });
               },
               toolbar1: "print | testBTN"
            }}
            onEditorChange={handleEditorChange}
         />
      </>
   );
}

export default MyForm;
question from:https://stackoverflow.com/questions/66054494/tinymce-react-content-in-empty-in-custom-button

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I was able to get it to work by using a ref.

const MyForm = () => {
  const [editorContent, setEditorContent] = useState("");
  const editor = useRef(null);

  const onButtonClick = () => {
    setEditorContent(editor.current.props.value);
  };

  const handleEditorChange = (content) => {
    setEditorContent(content);
  };

  return (
    <>
      <Editor
        ref={editor}
        apiKey={TINYMCEKEY}
        value={editorContent}
        init={{
          height: 600,
          menubar: false,
          branding: false,
          plugins: ["print"],
          setup: function (editor) {
            editor.ui.registry.addButton("testBTN", {
              text: "My Button",
              onAction: onButtonClick
            });
          },
          toolbar1: "print | testBTN"
        }}
        onEditorChange={handleEditorChange}
      />
    </>
  );
};

So the idea is to pass a ref to the Editor and to retrieve the current content text value using this ref. You can then save it in state or do whatever you want with it.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...