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

DraftJs结合react-draft-wysiwyg自定义按钮插入原生HTML问题咨询

Draft.js插入可生效原生HTML节点的实现方法

Draft.js基于自身的ContentState数据结构驱动内容渲染,不会解析普通文本中的HTML标签,所以直接调用insertText插入HTML代码只会渲染为纯文本。你需要按照以下步骤实现:


实现步骤

  • 第一步:创建自定义Entity承载HTML相关配置
    Draft.js通过Entity存储自定义元素的额外数据,你可以自定义对应类型的Entity存储要插入的按钮配置:
const currentContent = editorState.getCurrentContent();
// 创建自定义Entity,类型可自定义,IMMUTABLE表示插入后不可编辑修改
const contentWithEntity = currentContent.createEntity(
  "CUSTOM_BUTTON",
  "IMMUTABLE",
  {
    // 存储按钮的所有配置:文本、样式、点击事件、完整HTML片段都可以
    text: "自定义按钮",
    className: "inserted-btn",
    onClick: () => console.log("按钮触发"),
    // 要插入完整HTML的话可以存rawHtml: '<button>xxx</button>'
  }
);
const entityKey = contentWithEntity.getLastCreatedEntityKey();
  • 第二步:插入绑定了Entity的内容到光标位置
    调用DraftModifier.insertText时传入第五位的entityKey参数,将插入的内容和你创建的Entity绑定:
const currentSelection = editorState.getSelection();
const newContent = DraftModifier.insertText(
  contentWithEntity,
  currentSelection,
  " ", // 占位文本,渲染时会被自定义组件替换
  undefined,
  entityKey
);
// 更新编辑器状态
const newEditorState = EditorState.push(editorState, newContent, "insert-characters");
setEditorState(newEditorState);
  • 第三步:配置自定义渲染逻辑渲染真实HTML节点
    给react-draft-wysiwyg的编辑器组件配置自定义实体渲染函数,遇到对应类型的Entity时渲染为真实的按钮节点:
// 自定义实体渲染函数
const customEntityRenderer = (block: ContentBlock) => {
  const entityKey = block.getEntityAt(0);
  if (!entityKey) return null;

  const entity = editorState.getCurrentContent().getEntity(entityKey);
  if (entity.getType() === "CUSTOM_BUTTON") {
    const { text, className, onClick, rawHtml } = entity.getData();
    return {
      // 直接渲染button组件
      component: () => <button className={className} onClick={onClick}>{text}</button>,
      // 要渲染任意HTML的话用下面的写法,注意处理XSS风险
      // component: () => <div dangerouslySetInnerHTML={{__html: rawHtml}} />,
      editable: false,
    };
  }
  return null;
};

// 将渲染函数传入Editor组件
<Editor
  editorState={editorState}
  onEditorStateChange={setEditorState}
  customEntityRenderer={customEntityRenderer}
/>

注意事项

  • 不要直接操作编辑器DOM插入HTML内容,会和Draft内部的ContentState数据不同步,引发后续编辑异常
  • 如果插入的HTML来自用户输入,必须做XSS校验后再使用dangerouslySetInnerHTML渲染

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:45:07