草稿 js。将 EditorContent 持久化到数据库
Draft js. Persist EditorContent to database
我正在尝试将 draft-js
的 EditorContent
保存到数据库,然后再次读取并重新创建 EditorContent 对象。
但是 EditorContent.getPlainText()
剥离了富文本内容。我不知道该怎么做。
如何正确坚持EditorContent
?
getPlainText()
方法,顾名思义,仅returns 没有任何丰富格式的纯文本。您应该使用 convertToRaw() and convertFromRaw() 函数来序列化和反序列化编辑器的内容。
如有必要,您可以通过这种方式导入它们:(假设您使用的是 ES6)
import {convertFromRaw, convertToRaw} from 'draft-js';
如果您需要导出 HTML,请参阅 https://medium.com/@rajaraodv/how-draft-js-represents-rich-text-data-eeabb5f25cf2#9260(但不确定是否可以从 HTML 导入内容)
编辑:这不是一个好办法。查看已接受的答案。
坚持
const contentStateJsObject = ContentState.toJS();
const contentStateJsonString = JSON.stringify(contentStateJS);
现在内容状态可以保存为 JSON 字符串。
重建ContentState
const jsObject = JSON.parse(jsonString);
const contentState = new ContentState(jsObject);
我发现在读取和保存到数据库时我必须 stringify
和 parse
RawContentState 对象。
import { convertFromRaw, convertToRaw } from 'draft-js';
// the raw state, stringified
const rawDraftContentState = JSON.stringify( convertToRaw(this.state.editorState.getCurrentContent()) );
// convert the raw state back to a useable ContentState object
const contentState = convertFromRaw( JSON.parse( rawDraftContentState) );
这里有很多有用的答案,所以我想添加这个 jsfiddle demo。它显示了它是如何工作的。为了保存和检索编辑器的内容,这里使用 local storage
。
但是对于数据库的情况,基本原理是一样的。
在此演示中,您可以看到简单的编辑器组件,当您单击SAVE RAW CONTENT TO LOCAL STORAGE
时,我们将当前编辑器内容作为字符串保存到本地存储。我们为此使用 convertToRaw
和 JSON.stringify
:
saveRaw = () => {
var contentRaw = convertToRaw(this.state.editorState.getCurrentContent());
localStorage.setItem('draftRaw', JSON.stringify(contentRaw));
}
如果之后您重新加载页面,您的编辑器将使用您保存的内容和样式进行初始化。因为在 constructor
中,我们读取了适当的本地存储 属性,并使用 JSON.parse
、convertFromRaw
and createWithContent
方法使用先前存储的内容初始化编辑器。
constructor(props) {
super(props);
let initialEditorState = null;
const storeRaw = localStorage.getItem('draftRaw');
if (storeRaw) {
const rawContentFromStore = convertFromRaw(JSON.parse(storeRaw));
initialEditorState = EditorState.createWithContent(rawContentFromStore);
} else {
initialEditorState = EditorState.createEmpty();
}
this.state = {
editorState: initialEditorState
};
}
如果您要使用 AWS Lambda 将原始内容保存到您的数据库,我建议您在 Lambda 代码中进行字符串化,这样您就可以转义单引号;然后存储:
const escapedValueToStore = JSON.stringify(contentStateObject).replace(/'/g, '\'\'');
这有点复杂,但主要是因为您在使用 POST.
发送到您的 Lambda(通过 API 网关)时对数据对象进行了字符串化
然后您需要解析该对象,然后 returns 将您的 ContentState 转换为一个对象,而无需转义单引号。您执行上述代码来转义引号。
当使用数据客户端时,您需要做的就是在从原始数据转换时再次解析它:
EditorState.createWithContent(convertFromRaw(JSON.parse(rawContentState))
编辑
转念一想,我猜你可以直接将内容字符串化,然后在客户端转义内容
我正在尝试将 draft-js
的 EditorContent
保存到数据库,然后再次读取并重新创建 EditorContent 对象。
但是 EditorContent.getPlainText()
剥离了富文本内容。我不知道该怎么做。
如何正确坚持EditorContent
?
getPlainText()
方法,顾名思义,仅returns 没有任何丰富格式的纯文本。您应该使用 convertToRaw() and convertFromRaw() 函数来序列化和反序列化编辑器的内容。
如有必要,您可以通过这种方式导入它们:(假设您使用的是 ES6)
import {convertFromRaw, convertToRaw} from 'draft-js';
如果您需要导出 HTML,请参阅 https://medium.com/@rajaraodv/how-draft-js-represents-rich-text-data-eeabb5f25cf2#9260(但不确定是否可以从 HTML 导入内容)
编辑:这不是一个好办法。查看已接受的答案。
坚持
const contentStateJsObject = ContentState.toJS();
const contentStateJsonString = JSON.stringify(contentStateJS);
现在内容状态可以保存为 JSON 字符串。
重建ContentState
const jsObject = JSON.parse(jsonString);
const contentState = new ContentState(jsObject);
我发现在读取和保存到数据库时我必须 stringify
和 parse
RawContentState 对象。
import { convertFromRaw, convertToRaw } from 'draft-js';
// the raw state, stringified
const rawDraftContentState = JSON.stringify( convertToRaw(this.state.editorState.getCurrentContent()) );
// convert the raw state back to a useable ContentState object
const contentState = convertFromRaw( JSON.parse( rawDraftContentState) );
这里有很多有用的答案,所以我想添加这个 jsfiddle demo。它显示了它是如何工作的。为了保存和检索编辑器的内容,这里使用 local storage
。
但是对于数据库的情况,基本原理是一样的。
在此演示中,您可以看到简单的编辑器组件,当您单击SAVE RAW CONTENT TO LOCAL STORAGE
时,我们将当前编辑器内容作为字符串保存到本地存储。我们为此使用 convertToRaw
和 JSON.stringify
:
saveRaw = () => {
var contentRaw = convertToRaw(this.state.editorState.getCurrentContent());
localStorage.setItem('draftRaw', JSON.stringify(contentRaw));
}
如果之后您重新加载页面,您的编辑器将使用您保存的内容和样式进行初始化。因为在 constructor
中,我们读取了适当的本地存储 属性,并使用 JSON.parse
、convertFromRaw
and createWithContent
方法使用先前存储的内容初始化编辑器。
constructor(props) {
super(props);
let initialEditorState = null;
const storeRaw = localStorage.getItem('draftRaw');
if (storeRaw) {
const rawContentFromStore = convertFromRaw(JSON.parse(storeRaw));
initialEditorState = EditorState.createWithContent(rawContentFromStore);
} else {
initialEditorState = EditorState.createEmpty();
}
this.state = {
editorState: initialEditorState
};
}
如果您要使用 AWS Lambda 将原始内容保存到您的数据库,我建议您在 Lambda 代码中进行字符串化,这样您就可以转义单引号;然后存储:
const escapedValueToStore = JSON.stringify(contentStateObject).replace(/'/g, '\'\'');
这有点复杂,但主要是因为您在使用 POST.
发送到您的 Lambda(通过 API 网关)时对数据对象进行了字符串化然后您需要解析该对象,然后 returns 将您的 ContentState 转换为一个对象,而无需转义单引号。您执行上述代码来转义引号。
当使用数据客户端时,您需要做的就是在从原始数据转换时再次解析它:
EditorState.createWithContent(convertFromRaw(JSON.parse(rawContentState))
编辑
转念一想,我猜你可以直接将内容字符串化,然后在客户端转义内容