窗口未定义 - react-draft-wysiwyg 与 next js (ssr) 一起使用

elp*_*mid 8 javascript reactjs next.js react-draft-wysiwyg

我正在开发一个富文本编辑器,用于将纯 html 转换为带有 ssr 的下一个 js 的编辑器内容。我得到了这个错误窗口未定义所以我搜索了这个 github链接的解决方案

它使用了 next js 的动态导入功能。

而不是直接导入编辑器 import { Editor } from "react-draft-wysiwyg";

它使用此代码动态导入编辑器

const Editor = dynamic(
  () => {
    return import("react-draft-wysiwyg").then(mod => mod.Editor);
  },
  { ssr: false }
);
Run Code Online (Sandbox Code Playgroud)

但是虽然我已经安装了这个 react-draft-wysiwyg 模块,但我仍然收到这个错误

ModuleParseError: Module parse failed: Unexpected token (19:9)
You may need an appropriate loader to handle this file type.
| import dynamic from "next/dynamic";
| var Editor = dynamic(function () {
>   return import("react-draft-wysiwyg").then(function (mod) {
|     return mod.Editor;
|   });
Run Code Online (Sandbox Code Playgroud)

这是我的全部代码

import React, { Component } from "react";
import { EditorState } from "draft-js";
// import { Editor } from "react-draft-wysiwyg";
import dynamic from "next/dynamic";

const Editor = dynamic(
  () => {
    return import("react-draft-wysiwyg").then(mod => mod.Editor);
  },
  { ssr: false }
);

class MyEditor extends Component {
  constructor(props) {
    super(props);
    this.state = { editorState: EditorState.createEmpty() };
  }

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

  render() {
    const { editorState } = this.state;

    return (
      <div>
        <Editor
          editorState={editorState}
          wrapperClassName="rich-editor demo-wrapper"
          editorClassName="demo-editor"
          onEditorStateChange={this.onEditorStateChange}
          placeholder="The message goes here..."
        />
      </div>
    );
  }
}

export default MyEditor;
Run Code Online (Sandbox Code Playgroud)

请帮帮我。谢谢。

小智 18

这是一个解决方法

import dynamic from 'next/dynamic'
import { EditorProps } from 'react-draft-wysiwyg'

// install @types/draft-js @types/react-draft-wysiwyg and @types/draft-js @types/react-draft-wysiwyg for types

const Editor = dynamic<EditorProps>(
  () => import('react-draft-wysiwyg').then((mod) => mod.Editor),
  { ssr: false }
)
Run Code Online (Sandbox Code Playgroud)


小智 8

动态的对我有用

import dynamic from 'next/dynamic';
const Editor = dynamic(
  () => import('react-draft-wysiwyg').then((mod) => mod.Editor),
  { ssr: false }
)
import "react-draft-wysiwyg/dist/react-draft-wysiwyg.css";

const TextEditor = () => {
  return (
    <>
      <div className="container my-5">
        <Editor
          toolbarClassName="toolbarClassName"
          wrapperClassName="wrapperClassName"
          editorClassName="editorClassName"
        />
      </div>
    </>
  )
}

export default TextEditor
Run Code Online (Sandbox Code Playgroud)


小智 -1

Editor尝试使用 hook 在 React 更新 DOM 后返回useEffect。例如:

const [editor, setEditor] = useState<boolean>(false)
  useEffect(() => {
    setEditor(true)
  })

  return (
    <>
      {editor ? (
        <Editor
          editorState={editorState}
          wrapperClassName="rich-editor demo-wrapper"
          editorClassName="demo-editor"
          onEditorStateChange={this.onEditorStateChange}
          placeholder="The message goes here..."
        />
      ) : null}
    </>
  )
Run Code Online (Sandbox Code Playgroud)

  • 问题不是在加载组件时发生,而是在导入组件时发生。 (2认同)