You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js中出现Cannot read property 'getIn' of undefined错误求解决

修复Draft.js在Next.js中出现的“Cannot read property 'getIn' of undefined”错误

这个错误是Draft.js的Editor组件在Next.js服务端渲染(SSR)过程中,因依赖浏览器环境的对象未初始化,导致内部Immutable状态调用getIn方法时抛出的。输入内容触发组件状态更新时,未初始化的属性被访问,从而触发错误。

修复方案1:动态导入Editor并禁用SSR

利用Next.js的dynamic导入功能,让Editor组件仅在客户端加载,避免服务端渲染的环境冲突:

import React from "react";
import { EditorState } from "draft-js";
import "draft-js/dist/Draft.css";
import Head from "next/head";
import dynamic from 'next/dynamic';

// 动态导入Editor组件,禁用服务端渲染
const Editor = dynamic(() => import('draft-js').then(mod => mod.Editor), {
  ssr: false,
  loading: () => <div>加载编辑器中...</div> // 可选加载提示
});

export default function MyEditor() {
  const [editorState, setEditorState] = React.useState(() =>
    EditorState.createEmpty()
  );

  const editor = React.useRef(null);
  function focusEditor() {
    if (editor.current) { // 增加空值判断,避免服务端渲染时的调用错误
      editor.current.focus();
    }
  }

  return (
    <>
      <Head>
        <meta charset="utf-8" />
      </Head>
      <div
        style={{ border: "1px solid black", minHeight: "6em", cursor: "text" }}
        onClick={focusEditor}
      >
        <Editor
          ref={editor}
          editorState={editorState}
          onChange={setEditorState}
          placeholder="Write something!"
        />
      </div>
    </>
  );
}

修复方案2:延迟初始化EditorState

通过useEffect在客户端组件挂载后再初始化EditorState,确保状态仅在浏览器环境中创建:

import React, { useState, useEffect } from "react";
import { Editor, EditorState } from "draft-js";
import "draft-js/dist/Draft.css";
import Head from "next/head";

export default function MyEditor() {
  const [editorState, setEditorState] = useState(null);

  useEffect(() => {
    // 仅在客户端初始化编辑器状态
    setEditorState(EditorState.createEmpty());
  }, []);

  const editor = React.useRef(null);
  function focusEditor() {
    if (editor.current) {
      editor.current.focus();
    }
  }

  // 编辑器未初始化时显示加载提示
  if (!editorState) {
    return <div>加载编辑器中...</div>;
  }

  return (
    <>
      <Head>
        <meta charset="utf-8" />
      </Head>
      <div
        style={{ border: "1px solid black", minHeight: "6em", cursor: "text" }}
        onClick={focusEditor}
      >
        <Editor
          ref={editor}
          editorState={editorState}
          onChange={setEditorState}
          placeholder="Write something!"
        />
      </div>
    </>
  );
}

方案说明

  • 方案1从根源解决SSR与Draft.js的兼容性问题,确保Editor组件完全在客户端环境运行。
  • 方案2通过延迟状态初始化,避免服务端渲染时生成的状态与客户端不匹配,进而引发内部属性访问错误。

内容的提问来源于stack exchange,提问作者AdamWarLock9292

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:20:30