Проект JS. Persist EditorContent для базы данных
Я пытаюсь упорствовать draft-js
"s EditorContent
в базу данных, затем прочитайте и заново создайте объект EditorContent. Но EditorContent.getPlainText()
удаляет богатый текстовый контент. Я не знаю, как еще это сделать.
Как мне правильно настаивать EditorContent
?
6 ответов
getPlainText()
Метод, как следует из его названия, возвращает только простой текст без какого-либо расширенного форматирования. Вы должны использовать функции convertToRaw() и convertFromRaw() для сериализации и десериализации содержимого редактора.
При необходимости вы можете импортировать их таким образом: (при условии, что вы используете ES6)
import {convertFromRaw, convertToRaw} from 'draft-js';
Если вам нужно вместо этого экспортировать HTML, см. https://medium.com/@rajaraodv/how-draft-js-represents-rich-text-data-eeabb5f25cf2 (хотя не уверен, что вы можете импортировать содержимое обратно из HTML, хотя)
Я обнаружил, что должен 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. Это показывает, как это работает в действии. Для сохранения и получения содержимого редактора, здесь 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
а также 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
};
}
Настаивать
const contentStateJsObject = ContentState.toJS();
const contentStateJsonString = JSON.stringify(contentStateJS);
Теперь состояние содержимого можно сохранить в виде строки JSON.
Воссоздать ContentState
const jsObject = JSON.parse(jsonString);
const contentState = new ContentState(jsObject);
Если вы собираетесь сохранить необработанный контент в свою базу данных с помощью AWS Lambda, я рекомендую преобразовать в ваш код Lambda строки, чтобы вы могли избежать одинарных кавычек; Затем сохраните его:
const escapedValueToStore = JSON.stringify(contentStateObject).replace(/'/g, '\'\'');
Это немного сложно, но в основном потому, что вы структурируете свой объект данных при отправке в Lambda (через API-шлюз) с помощью POST.
Затем вам нужно проанализировать этот объект, который затем вернет ваш ContentState в объект, не выходя из одинарных кавычек. Вы вводите вышеупомянутый код, чтобы избежать кавычек.
При использовании клиентской части данных все, что вам нужно сделать, это снова проанализировать его при преобразовании из необработанного:
EditorState.createWithContent(convertFromRaw(JSON.parse(rawContentState))
РЕДАКТИРОВАТЬ
Если подумать, я думаю, вы можете просто преобразовать в строку и также избежать содержимого на стороне клиента.
Я сделал это для draftjs с reactjs. Если вы все еще сталкиваетесь с этой проблемой: вы можете увидеть решение в этом видео
В основном вам нужно преобразоватьToRaw, а затем JSON.stringify. Затем это можно отправить на ваш сервер в виде строки. Чтобы отобразить его, сделайте запрос GET для этих конкретных данных, затем JSON.parse и затем convertFromRaw. Передайте это в другой RichTextEditor как editorState, но установите readOnly={true}