javascript React quill自定义图像处理程序模块导致编辑器出现键入问题

kokeuurv  于 2023-04-10  发布在  Java
关注(0)|答案(2)|浏览(149)

我使用React Quill作为文本编辑器。在我添加自定义图像处理程序之前,它工作得很好。如果我像下面这样添加图像处理程序,我就不能在编辑器中键入内容。键入内容会在每次按键时失去焦点。

const modules = {
    toolbar: {
        container: [
            [{'header': [3, 4, 5, 6, false]}],
            ['bold', 'italic', 'underline', 'strike', 'blockquote', 'code'],
            [{color: []}, {background: []}],
            [{'list': 'ordered'}, {'list': 'bullet'}, {'indent': '-1'}, {'indent': '+1'}],
            ['link', 'image'],
            ['clean']
        ],
        handlers: {
            image: imageHandler
        }
    },
    clipboard: {
        // toggle to add extra line breaks when pasting HTML:
        matchVisual: false,
    }
};

function imageHandler() {
    console.log("custom image handler");
}

如果我注解掉image: imageHandler,编辑器就可以完美地工作。
我是否正确地编写了自定义模块?

yxyvkwin

yxyvkwin1#

TL;DR

这是帮助我的:
https://github.com/zenoamaro/react-quill/issues/309#issuecomment-654768941https://github.com/zenoamaro/react-quill/issues/309#issuecomment-659566810
直接传入组件的modules对象使其在每次按键时呈现所有模块。要使其停止,您必须在react中使用memoization的概念。您可以使用useMemo钩子来 Package 模块,然后将其传入组件。

const modules = useMemo(() => ({
    toolbar: {
      container: [
        [{ header: [1, 2, false] }],
        ['bold', 'italic', 'underline'],
        [{ list: 'ordered' }, { list: 'bullet' }],
        ['image', 'code-block']
      ],
      handlers: {
        image: selectLocalImage
      }
    }
  }), [])

然后在组件中:

<ReactQuill placeholder="Write some text..."
  value={text}
  modules={modules}
  onChange={onChange} />
mzaanser

mzaanser2#

useRef() & onBlur()是您问题的最终答案。
下面是我如何解决相同的查询。

export default function QuillEditor({
      value,
      onChange
   }) {

  const [description, setDescription] = useState(value || "");

  useEffect(() => {
    if (value) {
      setDescription(value);
    }
  }, [value]);

   ....

   const quillRef = useRef(); // the solution

   ....
   const imageHandler = () => {
    // get editor
    const editor = quillRef.current.getEditor();

    const input = document.createElement("input");
    input.setAttribute("type", "file");
    input.setAttribute("accept", "image/*");
    input.click();

    input.onchange = async () => {
      const file = input.files[0];
      try {
        const link = IMAGE_LINK_HERE;
        editor.insertEmbed(editor.getSelection(), "image", link);
      } catch (err) {
        console.log("upload err:", err);
      }
    };
  };

  const toolbarOptions = [
    ["bold", "italic", "underline", "strike"],
    ["code-block", "link", "image"],
    ...
  ];

  const modules = {
    toolbar: {
      container: toolbarOptions,
      handlers: {
        image: imageHandler,
      },
    },
    clipboard: {
      matchVisual: false,
    },
  };

  const handleOnBlur = () => {
    onChange(description);
  };

....

  return (
      <ReactQuill
        ref={quillRef} // must pass ref here
        value={description}
        onChange={(val) => setDescription(val)}
        onBlur={handleOnBlur}
        theme="snow"
        modules={modules}
        formats={formats}
        placeholder="Write something awesome..."
      />
    )
....

相关问题