无法在编辑器中显示图像
Not able to display image in Editor
我正在使用 draft-js 和 react-draft-wysiwyg 包来显示我的应用程序的电子邮件编辑器。我能够显示正确的内容,但面临图像问题。
图像作为输入的一部分时不显示在编辑器中 HTML。请找到我下面的示例代码。
import { Editor } from "react-draft-wysiwyg";
import {
EditorState,
ContentState,
convertFromHTML
} from "draft-js";
const htmlContentFromServer =
'<b>Bold text</b>, <i>Italic text</i><br/ ><br />' +
'<a href="https://www.facebook.com">Example link</a><br /><br/ >' +
'<img src="https://raw.githubusercontent.com/facebook/draft-js/master/examples/draft-0-10-0/convertFromHTML/image.png" height="112" width="200" />';
this.state = {
editorState: EditorState.createWithContent(
ContentState.createFromBlockArray(
convertFromHTML(
htmlContentFromServer
)
)
)
};
<Editor
editorState={this.state.editorState}
wrapperClassName="c-react-draft"
editorClassName="demo-editor"
onEditorStateChange={this.onEditorStateChange}
spellCheck={true}
wrapperId={this.props.wrapperId}
/>
我可以使用此解决方案显示图像 https://codepen.io/Kiwka/pen/YNYgWa。
但以上解决方案仅在我使用 'draft-js' 包中的编辑器时有效,但我想使用 'react-draft-wysiwyg' 中的编辑器,因为我得到了 Rich Toolbar 选项。
当图像是 'react-draft-wysiwyg' 编辑器中 HTML 内容的一部分时需要帮助显示图像。
您需要使用下面的 customContentStateConverter
函数在传递给 createWithContent
之前转换内容状态。
const customContentStateConverter = (contentState) => {
// changes block type of images to 'atomic'
const newBlockMap = contentState.getBlockMap().map((block) => {
const entityKey = block.getEntityAt(0);
if (entityKey !== null) {
const entityBlock = contentState.getEntity(entityKey);
const entityType = entityBlock.getType();
switch (entityType) {
case 'IMAGE': {
const newBlock = block.merge({
type: 'atomic',
text: 'img',
});
return newBlock;
}
default:
return block;
}
}
return block;
});
const newContentState = contentState.set('blockMap', newBlockMap);
return newContentState;
}
示例代码如下;
const blocksFromHTML = convertFromHTML('<img src="some_image.png"/>');
var editorState = EditorState.createWithContent(customContentStateConverter(
ContentState.createFromBlockArray(
blocksFromHTML.contentBlocks,
blocksFromHTML.entityMap
)
))
我正在使用 draft-js 和 react-draft-wysiwyg 包来显示我的应用程序的电子邮件编辑器。我能够显示正确的内容,但面临图像问题。
图像作为输入的一部分时不显示在编辑器中 HTML。请找到我下面的示例代码。
import { Editor } from "react-draft-wysiwyg";
import {
EditorState,
ContentState,
convertFromHTML
} from "draft-js";
const htmlContentFromServer =
'<b>Bold text</b>, <i>Italic text</i><br/ ><br />' +
'<a href="https://www.facebook.com">Example link</a><br /><br/ >' +
'<img src="https://raw.githubusercontent.com/facebook/draft-js/master/examples/draft-0-10-0/convertFromHTML/image.png" height="112" width="200" />';
this.state = {
editorState: EditorState.createWithContent(
ContentState.createFromBlockArray(
convertFromHTML(
htmlContentFromServer
)
)
)
};
<Editor
editorState={this.state.editorState}
wrapperClassName="c-react-draft"
editorClassName="demo-editor"
onEditorStateChange={this.onEditorStateChange}
spellCheck={true}
wrapperId={this.props.wrapperId}
/>
我可以使用此解决方案显示图像 https://codepen.io/Kiwka/pen/YNYgWa。
但以上解决方案仅在我使用 'draft-js' 包中的编辑器时有效,但我想使用 'react-draft-wysiwyg' 中的编辑器,因为我得到了 Rich Toolbar 选项。
当图像是 'react-draft-wysiwyg' 编辑器中 HTML 内容的一部分时需要帮助显示图像。
您需要使用下面的 customContentStateConverter
函数在传递给 createWithContent
之前转换内容状态。
const customContentStateConverter = (contentState) => {
// changes block type of images to 'atomic'
const newBlockMap = contentState.getBlockMap().map((block) => {
const entityKey = block.getEntityAt(0);
if (entityKey !== null) {
const entityBlock = contentState.getEntity(entityKey);
const entityType = entityBlock.getType();
switch (entityType) {
case 'IMAGE': {
const newBlock = block.merge({
type: 'atomic',
text: 'img',
});
return newBlock;
}
default:
return block;
}
}
return block;
});
const newContentState = contentState.set('blockMap', newBlockMap);
return newContentState;
}
示例代码如下;
const blocksFromHTML = convertFromHTML('<img src="some_image.png"/>');
var editorState = EditorState.createWithContent(customContentStateConverter(
ContentState.createFromBlockArray(
blocksFromHTML.contentBlocks,
blocksFromHTML.entityMap
)
))