我已经开始用DraftJS构建一个富文本编辑器,并取得了不错的进展 . 现在我不得不添加嵌入内容了 . 我尝试通过单独编辑html并使用新的html调用convertFromHTML来手动添加脚本标记,但这不起作用 .
我想在我的富文本编辑器中添加像gists这样的内容,但我不确定如何 .
任何帮助表示赞赏!
您需要使用自定义块组件:https://draftjs.org/docs/advanced-topics-block-components.html#custom-block-components
在Editor组件中,可以指定blockRendererFn prop . 此prop函数允许更高级别的组件根据块类型,文本或其他条件为ContentBlock对象定义自定义React呈现 . 例如,我们可能希望使用自定义MediaComponent渲染类型为'atomic'的ContentBlock对象 . function myBlockRenderer(contentBlock){const type = contentBlock.getType();if(type ==='atomic'){返回{组件:MediaComponent,可编辑的:假的,道具: {foo:'bar',},};}}
// 然后...从'draft-js'导入;class EditorWithMedia扩展了React.Component {...render(){return <Editor ... blockRendererFn = />;}}如果blockRendererFn函数未返回自定义渲染器对象,则Editor将呈现默认的DraftEditorBlock文本块组件 . component属性定义要使用的组件,而可选的props对象包含将通过props.blockProps子属性对象传递给呈现的自定义组件的props . 此外,可选的editable属性确定自定义组件是否为contentEditable . 如果您的自定义组件不包含文本,强烈建议您使用editable:false . 如果组件包含ContentState提供的文本,则自定义组件应构成DraftEditorBlock组件 . 这将允许Draft框架在您的内容中正确维护游标行为 . 通过在更高级别组件的上下文中定义此函数,可以将此自定义组件的props绑定到该组件,从而允许自定义组件props的实例方法 . 定义自定义块组件在MediaComponent中,最可能的用例是您需要检索实体元数据以呈现自定义块 . 您可以在EditorState管理期间将实体键应用于“原子”块中的文本,然后在自定义组件render()代码中检索该键的元数据 . class MediaComponent扩展了React.Component {render(){const {block,contentState} = this.props;const = this.props.blockProps;const data = contentState.getEntity(block.getEntityAt(0)) . getData();//使用此数据返回<figure>或其他内容 .}}ContentBlock对象和ContentState记录在自定义组件中可用,以及在顶级定义的props . 通过从ContentBlock和实体映射中提取实体信息,您可以获取呈现自定义组件所需的元数据 . 从块中检索实体无疑是一个尴尬的API,值得重新审视 .
基本上迈克的答案是解决方案 . 几天前我们有类似的需求,我们创建了以下插件https://github.com/jimmycodesocial/draft-js-iframely-plugin
PD:它使用iframely.com服务(但您可以根据自己的需要进行调整) .
2 回答
您需要使用自定义块组件:https://draftjs.org/docs/advanced-topics-block-components.html#custom-block-components
// 然后...
从'draft-js'导入;
class EditorWithMedia扩展了React.Component {
...
render(){
return <Editor ... blockRendererFn = />;
}
}
如果blockRendererFn函数未返回自定义渲染器对象,则Editor将呈现默认的DraftEditorBlock文本块组件 . component属性定义要使用的组件,而可选的props对象包含将通过props.blockProps子属性对象传递给呈现的自定义组件的props . 此外,可选的editable属性确定自定义组件是否为contentEditable . 如果您的自定义组件不包含文本,强烈建议您使用editable:false . 如果组件包含ContentState提供的文本,则自定义组件应构成DraftEditorBlock组件 . 这将允许Draft框架在您的内容中正确维护游标行为 . 通过在更高级别组件的上下文中定义此函数,可以将此自定义组件的props绑定到该组件,从而允许自定义组件props的实例方法 . 定义自定义块组件在MediaComponent中,最可能的用例是您需要检索实体元数据以呈现自定义块 . 您可以在EditorState管理期间将实体键应用于“原子”块中的文本,然后在自定义组件render()代码中检索该键的元数据 . class MediaComponent扩展了React.Component {
render(){
const {block,contentState} = this.props;
const = this.props.blockProps;
const data = contentState.getEntity(block.getEntityAt(0)) . getData();
//使用此数据返回<figure>或其他内容 .
}
}
ContentBlock对象和ContentState记录在自定义组件中可用,以及在顶级定义的props . 通过从ContentBlock和实体映射中提取实体信息,您可以获取呈现自定义组件所需的元数据 . 从块中检索实体无疑是一个尴尬的API,值得重新审视 .
基本上迈克的答案是解决方案 . 几天前我们有类似的需求,我们创建了以下插件https://github.com/jimmycodesocial/draft-js-iframely-plugin
PD:它使用iframely.com服务(但您可以根据自己的需要进行调整) .