react-draft-wysiwyg - 呈现保存的内容以更新
react-draft-wysiwyg - render saved content to update
我在一个项目中使用 react-draft-wysiwyg,但遇到 'big' 问题。
经过几个小时的尝试,我无法渲染我的数据库内容。
首先,我尝试使用以下代码在 MongoDB 中成功保存了一个“概览”(contentState):
<Editor initialContentState={person.overview}
toolbarClassName="rdw-storybook-toolbar"
wrapperClassName="rdw-storybook-wrapper"
editorClassName="editor" onContentStateChange={this.onContentStateChange}
toolbar={{ options: [
'inline',
'blockType',
'fontSize',
'fontFamily',
'list',
'textAlign',
'colorPicker',
'link',
'embedded',
'emoji',
'remove',
'history'],
}}
我的组件构造函数:
this.state = { 人:{ isEdit: false, } };
如您所见,我没有在构造函数中设置 person: { overview: {} },因为如果我这样做,我会得到以下错误:
invalid RawDraftContentState ▶ 24 stack frames were collapsed.
./src/index.js src/index.js:19 16 | ); 17 | 18 | 19 | ReactDOM.render(
20 | 21 | 22 | ,
所以我只是没有在构造函数中设置概览:{},并且保存过程正常进行。
之后,我尝试在组件中呈现保存的内容以便能够进行更改和更新。如果我可以使用相同的组件进行编辑和保存以使其可重复使用,那就太好了,但这不是必须的。
问题是,尽管我设置了 this.setState({person: overview: contentFromDatabase})(已检查,正在设置),但组件显示空白,没有任何内容。您可以从零开始编写,但它不会加载内容。
我不得不说现在下班后我对 editorState 和 contentState 的东西有点困惑,但我认为我的数据库的内容是 RawDraftContent,对吧?
这是我的数据库的文档:
"_id": ObjectId("5b3d2897589a5e2fa4ba60ea"),
"overview": {
"blocks": [
{
"key": "ekrl0",
"text": "this is the CONTENT",
"type": "unstyled",
"depth": 0,
"inlineStyleRanges": [
{
"offset": 14,
"length": 2,
"style": "BOLD"
}
],
"entityRanges": []
}
]
},
"createdAt": ISODate("2018-07-04T20:05:43.129Z"),
"__v": 0
}
如有任何帮助,我们将不胜感激。
您可以这样做,而不是将内容保存在数据库中作为编辑器状态:
import {
Editor,
EditorState,
ContentState,
convertFromHTML,
CompositeDecorator,
convertToRaw,
getDefaultKeyBinding,
} from 'draft-js';
const blocks = convertToRaw(editorState.getCurrentContent()).blocks;
const value = blocks.map(block => (!block.text.trim() && '\n') || block.text).join('\n');
要检索数据,您可以执行以下操作:
componentWillMount() {
const { value } = this.props
const blocksFromHTML = convertFromHTML(value));
const state = ContentState.createFromBlockArray(
blocksFromHTML.contentBlocks,
blocksFromHTML.entityMap,
);
this.state = {
editorState: EditorState.createWithContent(
state,
compositeDecorator,
),
};
}
我在一个项目中使用 react-draft-wysiwyg,但遇到 'big' 问题。
经过几个小时的尝试,我无法渲染我的数据库内容。
首先,我尝试使用以下代码在 MongoDB 中成功保存了一个“概览”(contentState):
<Editor initialContentState={person.overview}
toolbarClassName="rdw-storybook-toolbar"
wrapperClassName="rdw-storybook-wrapper"
editorClassName="editor" onContentStateChange={this.onContentStateChange}
toolbar={{ options: [
'inline',
'blockType',
'fontSize',
'fontFamily',
'list',
'textAlign',
'colorPicker',
'link',
'embedded',
'emoji',
'remove',
'history'],
}}
我的组件构造函数:
this.state = { 人:{ isEdit: false, } };
如您所见,我没有在构造函数中设置 person: { overview: {} },因为如果我这样做,我会得到以下错误:
invalid RawDraftContentState ▶ 24 stack frames were collapsed. ./src/index.js src/index.js:19 16 | ); 17 | 18 | 19 | ReactDOM.render( 20 | 21 | 22 | ,
所以我只是没有在构造函数中设置概览:{},并且保存过程正常进行。
之后,我尝试在组件中呈现保存的内容以便能够进行更改和更新。如果我可以使用相同的组件进行编辑和保存以使其可重复使用,那就太好了,但这不是必须的。
问题是,尽管我设置了 this.setState({person: overview: contentFromDatabase})(已检查,正在设置),但组件显示空白,没有任何内容。您可以从零开始编写,但它不会加载内容。
我不得不说现在下班后我对 editorState 和 contentState 的东西有点困惑,但我认为我的数据库的内容是 RawDraftContent,对吧?
这是我的数据库的文档:
"_id": ObjectId("5b3d2897589a5e2fa4ba60ea"),
"overview": {
"blocks": [
{
"key": "ekrl0",
"text": "this is the CONTENT",
"type": "unstyled",
"depth": 0,
"inlineStyleRanges": [
{
"offset": 14,
"length": 2,
"style": "BOLD"
}
],
"entityRanges": []
}
]
},
"createdAt": ISODate("2018-07-04T20:05:43.129Z"),
"__v": 0
}
如有任何帮助,我们将不胜感激。
您可以这样做,而不是将内容保存在数据库中作为编辑器状态:
import {
Editor,
EditorState,
ContentState,
convertFromHTML,
CompositeDecorator,
convertToRaw,
getDefaultKeyBinding,
} from 'draft-js';
const blocks = convertToRaw(editorState.getCurrentContent()).blocks;
const value = blocks.map(block => (!block.text.trim() && '\n') || block.text).join('\n');
要检索数据,您可以执行以下操作:
componentWillMount() {
const { value } = this.props
const blocksFromHTML = convertFromHTML(value));
const state = ContentState.createFromBlockArray(
blocksFromHTML.contentBlocks,
blocksFromHTML.entityMap,
);
this.state = {
editorState: EditorState.createWithContent(
state,
compositeDecorator,
),
};
}