draft.js并不提供图形界面,仅仅提供数据结构等基础设施
import {
Editor,
EditorState,
RichUtils,
convertToRaw,
ContentState,
NestedUtils,
convertFromHTML
} from 'draft-js';
this.state = {
editorState: EditorState.createEmpty() // 初始化
};
// 转化成raw格式, 仅仅只有当你将这种抽象格式转化成raw格式,才能转成其他格式类似于markdown语法格式/
const contentState = this.state.editorState.getCurrentContent();
const raw = convertToRaw(contentState);
为了避免深层数据的耦合,同时,为了存储数据的高效性,于是出现了这样一款基础数据结构库, 一个多层嵌套的对象,我们想实现对他的修改,以及复制,传统的复制自然就是深复制与浅复制,
import {
Editor,
EditorState
} from 'draft-js';
// 自定义block标签样式
const blockRenderMap = props => Immutable.Map({
'table-cell': {
element: 'td',
wrapper: <Table editor={props.editor} editorState={props.editorState}/>
},
'unstyled': {
element: 'div'
},
'header-one': {
element: 'h1'
}
});
// 自定义内联样式
const styleMap = {
'delete': {
textDecoration: 'line-through',
},
'bold': {
fontWeight: 'bold'
},
'italic': {
fontStyle: 'italic'
},
'underline':{
textDecoration: 'underline',
},
'h1Title': {
display: 'block',
fontSize: '20px'
}
};
// 对当前选择的内联样式加粗斜体
inlineStyle(style) { // bold
this.onChange(RichUtils.toggleInlineStyle(this.state.editorState, style));
}
// 对光标处于的当前行加样式
blockType(blockType) { // header-one h1
this.onChange(RichUtils.toggleBlockType(this.state.editorState,blockType));
}
<Editor
blockRenderMap={blockRenderMap(this.props)} // 定制块状样式
customStyleMap={styleMap} // 定制内联样式
editorState={this.state.editorState} // 绑定输入内容
// handleKeyCommand={this.handleKeyCommand} // 绑定键盘输入事件
onChange={this.onChange} // 绑定onChange事件
/>
是这样的,当富文本文档越来越多的时候,会出现性能瓶颈,具体来说,就是当你编辑某个字的时候却要更新全文,这对于一款编辑器来说是致命的, draft.js将富文本文档转换成了对象,当你编辑文档的时候,只会对该段落的对象进行修改,也就是局部修改.这在性能开销上极限优化.