能否在TipTap中实现完全自定义的renderHTML函数?
在TipTap中自定义renderHTML函数的正确方式
核心结论:renderHTML不能直接返回JSX
你想直接返回<div>hello</div>这种JSX写法是行不通的,因为TipTap的renderHTML方法是给generateHTML工具提供序列化规则的,它要求返回ProseMirror规定的数组格式虚拟DOM描述,而非JSX语法。
原有的写法是符合规范的:
renderHTML({ HTMLAttributes }) { return ['img', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)]; },
数组的第一个元素是标签名,第二个是属性对象,后续元素是子节点(可以是字符串或嵌套的数组结构)。
生成复杂HTML结构的renderHTML写法
如果需要渲染嵌套的HTML结构,比如<div><div>hello</div></div>,可以用嵌套数组的方式实现:
renderHTML({ HTMLAttributes }) { return [ 'div', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), ['div', {}, 'hello'] ]; },
区分addNodeView和renderHTML的作用
你用addNodeView注册的NextImage组件,是给TipTap编辑器的可视化编辑界面用的,负责在编辑器里渲染节点的UI;而renderHTML是负责把编辑器内容导出为HTML字符串的逻辑,两者完全独立:
- 编辑器界面显示的内容,由
addNodeView绑定的React组件控制 - 导出HTML时生成的结构,由
renderHTML定义的数组序列化规则控制
如果你的NodeView结构是<NodeViewWrapper><div>hello</div></NodeViewWrapper>,对应的renderHTML应该返回能生成对应HTML的数组,示例如下:
const CustomImage = Image.extend({ addNodeView() { return ReactNodeViewRenderer(NextImage); }, renderHTML({ HTMLAttributes }) { return [ 'div', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), ['div', {}, 'hello'] ]; }, });
这样调用generateHTML时,就能生成和NodeView结构一致的HTML字符串。
内容的提问来源于stack exchange,提问作者strangeQuirks
相关产品推荐
相关产品推荐

