您可以使用replaceWithFragment。要构建要插入的片段,首先使用实用程序将字符串转换为 HTML 块convertFromHTML
const htmlContent = convertFromHTML(text);
然后,使用另一个实用程序将内容块数组传递给地图
const htmlContentMap = BlockMapBuilder.createFromArray(
htmlContent.contentBlocks
);
并replaceWithFragment
以与您调用相同的方式调用insertText
,但使用您构建的 HTML 内容的映射
const newContent = Modifier.replaceWithFragment(
currentContent,
currentSelection,
htmlContentMap
);
更新
DraftJS 默认不支持按钮标签,但您可以将其添加为自定义块渲染
首先,通过将默认支持的标签与按钮标签合并来创建类型映射
import {
...
DefaultDraftBlockRenderMap,
...
} from "draft-js";
...
const mapWithButton = Map({
button: {
element: "button"
}
}).merge(DefaultDraftBlockRenderMap);
...
并将其作为第三个参数传递给convertFromHTML
函数
const htmlContent = convertFromHTML(
text,
undefined,
mapWithButton
);
创建自定义块渲染器函数并将其传递给编辑器
function myBlockRenderer(contentBlock: ContentBlock) {
const type = contentBlock.getType();
if (type === "button") {
return {
component: () => {
return (
<button onClick={() => console.log("doesn't seem to work :(")}>
{contentBlock.getText()}
</button>
);
},
editable: false,
};
}
}
...
<Editor
...
customBlockRenderFunc={myBlockRenderer}
/>
它之所以起作用,是因为它显示了按钮,尽管有时当您插入它的点之前有文本时,它会将先前的文本与按钮文本合并而不显示按钮。点击也不起作用,可能是因为这个
如果您的自定义块渲染器需要鼠标交互,通常明智的做法是在此交互期间临时将您的编辑器设置为 readOnly={true}。这样,用户在与自定义块交互时不会触发编辑器内的任何选择更改。
https://codesandbox.io/s/insert-html-draftjs-73rmc?file=/src/Editor.tsx