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

Draft.js日文输入模式下粘贴图片后回车出现栈帧折叠报错如何解决

Draft.js日文输入模式下粘贴图片后输入报错解决方案

问题根因

该报错属于Draft.js与IME(输入法编辑器,日文、中文等非拉丁类输入法均属于此类)的已知兼容问题:当编辑器内存在标记为IMMUTABLE(不可变)类型的atomic图片块时,日文输入法候选词确认阶段按下回车键,Draft.js内部更新逻辑会误尝试修改不可变块的关联entity,导致entity key异常失效,调用getEntity时直接抛出错误。

修复方案

1. 增加Media组件边界容错

现有Media组件未做entity存在性校验,当entity key被异常清空时会直接触发报错,先添加空值判断:

const Media = (props:any) => {
  // 先校验entity是否存在,避免空值报错
  const entityKey = props.block.getEntityAt(0);
  if (!entityKey || !props.contentState.hasEntity(entityKey)) {
    return null;
  }
  const entity = props.contentState.getEntity(entityKey);
  const { src } = entity.getData();
  const type = entity.getType();
  let media;
  if (type === "image") {
    media = <Image src={src} alt="" />;
  }
  return media;
};

2. 拦截IME输入阶段的回车键事件

新增状态记录IME输入状态,在输入法候选词确认阶段拦截默认回车行为,避免触发不可变块修改逻辑:

function App() {
  // 原有代码不变,新增以下状态
  const [isInComposition, setIsInComposition] = useState(false);

  // 原有代码不变,修改Editor组件配置
  return (
    <div className="App">
      <div>
        <Editor 
          editorState={editorState} 
          onChange={setEditorState} 
          blockRendererFn={myBlockRenderer}
          // 新增以下三个配置项
          handleReturn={(e) => {
            if (isInComposition) {
              e.preventDefault();
              return "handled";
            }
            return "not-handled";
          }}
          onCompositionStart={() => setIsInComposition(true)}
          onCompositionEnd={() => setIsInComposition(false)}
        />
      </div>
    </div>
  );
}

可选优化方案

如果业务允许调整图片entity的可变性,可以将entity配置里的mutability: "IMMUTABLE"改为mutability: "MUTABLE",即可绕过Draft.js的不可变块校验逻辑,也能解决该报错,修改后需自行控制图片块的编辑权限,避免内容被意外修改。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:57:01