Hon*_*iao 0 javascript reactjs draftjs
我正在尝试将图像插入到Draft.js编辑器中.
根据我的理解,我需要更新实体mergeData和阻止mergeBlockData.(我不确定)
现在我想mergeBlockData用来插入一个块.
Run Code Online (Sandbox Code Playgroud)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);
Run Code Online (Sandbox Code Playgroud)
花了一段时间来弄清楚如何插入图像.
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, ' ');
};
Run Code Online (Sandbox Code Playgroud)
然后你可以使用
const base64 = 'aValidBase64String';
const newEditorState = this.insertImage(this.state.editorState, base64);
this.setState({ editorState: newEditorState });
Run Code Online (Sandbox Code Playgroud)
对于渲染图像,您可以使用Draft.js图像插件.
现场演示: codesandbox
该演示插入了Twitter徽标图像.
如果要从本地文件插入图像,可以尝试使用FileReaderAPI来获取该base64.
有关如何获取base64,很简单,请检查
现场演示: jsbin
现在继续将它们放在一起,您可以从本地文件上传图像!
| 归档时间: |
|
| 查看次数: |
2982 次 |
| 最近记录: |