如何在 Draft.js 中插入/上传图像(更新实体和块)?
How to insert / upload image (update entity and blocks) in Draft.js?
我正在尝试将图像插入 Draft.js 编辑器。
根据我的理解,我需要 mergeData
and blocks by mergeBlockData
更新实体。 (我不确定)
现在我正在尝试使用mergeBlockData
插入一个块。
mergeBlockData(
contentState: ContentState,
selectionState: SelectionState,
blockData: Map<any, any>
): ContentState
请阅读代码中的注释。
import { Map } from 'immutable';
const selection = this.state.editorState.getSelection();
const contentState = this.state.editorState.getCurrentContent();
console.log(convertToRaw(contentState)); // for example, I have 3 blocks
const blockData = Map({ ov72: { // here how to generate a random valid key?
"key": "ov72",
"text": " ",
"type": "atomic",
"depth": 0,
"inlineStyleRanges": [],
"entityRanges": [{
"offset": 0,
"length": 1,
"key": 1
}],
"data": {}
}});
const newContentState = Modifier.mergeBlockData(contentState, selection, blockData);
console.log(convertToRaw(newContentState)); // here is wrong, still 3 blocks. Also original blocks have no change
const newEditorState = EditorState.push(this.state.editorState, newContentState);
如果你想插入一个新的块,那么你可能想要使用 ContentBlock
而不是 mergeBlockData
。
内容块:https://draftjs.org/docs/api-reference-content-block.html#content
请试一试这段代码。
import { genKey } from 'draft-js'
addNewBlock(editorState) {
const text = 'Alpha';
const block = new ContentBlock({
key: genKey(),
type: 'unstyled',
text,
});
const contentState = editorState.getCurrentContent();
const blockMap = contentState.getBlockMap().set(block.key, block);
return EditorState.push(editorState, contentState.set('blockMap', blockMap));
}
花了一些时间弄清楚如何插入图像。
insertImage = (editorState, base64) => {
const contentState = editorState.getCurrentContent();
const contentStateWithEntity = contentState.createEntity(
'image',
'IMMUTABLE',
{ src: base64 },
);
const entityKey = contentStateWithEntity.getLastCreatedEntityKey();
const newEditorState = EditorState.set(
editorState,
{ currentContent: contentStateWithEntity },
);
return AtomicBlockUtils.insertAtomicBlock(newEditorState, entityKey, ' ');
};
然后你可以使用
const base64 = 'aValidBase64String';
const newEditorState = this.insertImage(this.state.editorState, base64);
this.setState({ editorState: newEditorState });
对于渲染图像,您可以使用Draft.js image plugin。
现场演示:codesandbox
该演示插入了 Twitter 徽标图像。
如果你想从本地文件中插入图片,你可以尝试使用 FileReader
API 来获取 base64。
如何获取base64,很简单,查看
现场演示:jsbin
现在开始把它们放在一起,你可以从本地文件上传图片!
如果您使用的是draft-js image plugin,您可以按如下方式实现。
按照@Hongbo Miao 的说明获取图像的 base64。
const imagePlugin = createImagePlugin();//initialize image plugin
const base64 = 'aValidBase64String';
const newEditorState = imagePlugin.addImage(this.state.editorState, base64);
this.setState({ editorState: newEditorState });
我正在尝试将图像插入 Draft.js 编辑器。
根据我的理解,我需要 mergeData
and blocks by mergeBlockData
更新实体。 (我不确定)
现在我正在尝试使用mergeBlockData
插入一个块。
mergeBlockData( contentState: ContentState, selectionState: SelectionState, blockData: Map<any, any> ): ContentState
请阅读代码中的注释。
import { Map } from 'immutable';
const selection = this.state.editorState.getSelection();
const contentState = this.state.editorState.getCurrentContent();
console.log(convertToRaw(contentState)); // for example, I have 3 blocks
const blockData = Map({ ov72: { // here how to generate a random valid key?
"key": "ov72",
"text": " ",
"type": "atomic",
"depth": 0,
"inlineStyleRanges": [],
"entityRanges": [{
"offset": 0,
"length": 1,
"key": 1
}],
"data": {}
}});
const newContentState = Modifier.mergeBlockData(contentState, selection, blockData);
console.log(convertToRaw(newContentState)); // here is wrong, still 3 blocks. Also original blocks have no change
const newEditorState = EditorState.push(this.state.editorState, newContentState);
如果你想插入一个新的块,那么你可能想要使用 ContentBlock
而不是 mergeBlockData
。
内容块:https://draftjs.org/docs/api-reference-content-block.html#content
请试一试这段代码。
import { genKey } from 'draft-js'
addNewBlock(editorState) {
const text = 'Alpha';
const block = new ContentBlock({
key: genKey(),
type: 'unstyled',
text,
});
const contentState = editorState.getCurrentContent();
const blockMap = contentState.getBlockMap().set(block.key, block);
return EditorState.push(editorState, contentState.set('blockMap', blockMap));
}
花了一些时间弄清楚如何插入图像。
insertImage = (editorState, base64) => {
const contentState = editorState.getCurrentContent();
const contentStateWithEntity = contentState.createEntity(
'image',
'IMMUTABLE',
{ src: base64 },
);
const entityKey = contentStateWithEntity.getLastCreatedEntityKey();
const newEditorState = EditorState.set(
editorState,
{ currentContent: contentStateWithEntity },
);
return AtomicBlockUtils.insertAtomicBlock(newEditorState, entityKey, ' ');
};
然后你可以使用
const base64 = 'aValidBase64String';
const newEditorState = this.insertImage(this.state.editorState, base64);
this.setState({ editorState: newEditorState });
对于渲染图像,您可以使用Draft.js image plugin。
现场演示:codesandbox
该演示插入了 Twitter 徽标图像。
如果你想从本地文件中插入图片,你可以尝试使用 FileReader
API 来获取 base64。
如何获取base64,很简单,查看
现场演示:jsbin
现在开始把它们放在一起,你可以从本地文件上传图片!
如果您使用的是draft-js image plugin,您可以按如下方式实现。
按照@Hongbo Miao 的说明获取图像的 base64。
const imagePlugin = createImagePlugin();//initialize image plugin
const base64 = 'aValidBase64String';
const newEditorState = imagePlugin.addImage(this.state.editorState, base64);
this.setState({ editorState: newEditorState });