不显示来自 localStorage 的数据
Not showing data from localStorage
我正在为我的项目使用 ReactJs,并且正在使用富文本编辑器,当我在内容 aria 中写一些东西时,我可以将数据保存在 localStorage 中,但是当我想在其中保存数据时刷新整个页面后的内容主体,它不会在内容 aria 中显示数据,但我已将数据成功保存在 localStorage
不知道哪里出了问题,
我试过这种方式:
const blogFromLS = () => {
if (typeof window === "undefined") {
return false;
}
if (localStorage.getItem("blog")) {
return JSON.parse(localStorage.getItem("blog"));
} else {
return false;
}
};
const [body, setBody] = useState({
editorState: EditorState.createEmpty(),
blogFromLS: blogFromLS(),
});
const { editorState } = body;
const onEditorStateChange = (editorState) => {
setBody({ editorState });
formData.set(
"body",
draftToHtml(convertToRaw(editorState.getCurrentContent()))
);
if (typeof window !== "undefined") {
localStorage.setItem(
"blog",
JSON.stringify(
draftToHtml(convertToRaw(editorState.getCurrentContent()))
)
);
}
};
<div className="form-group">
<Editor
className="editorCustom"
editorState={editorState}
wrapperClassName="demo-wrapper"
editorClassName="demo-editor"
onEditorStateChange={onEditorStateChange}
placeholder="write something..."
// onChange={handleBody}
// value={body}
/>
</div>
有什么建议吗
您接近于达到您想要实现的目标。
您必须调整的是初始化编辑器状态的方式。在初始化编辑器组件期间,您必须传递存储在 localStorage 中的状态。为此,您必须使用 EditorState.createWithContent
静态方法。
const [editorState, setEditorState] = useState({
editorState: blogFromLS()
? EditorState.createWithContent(blogFromLS())
: EditorState.createEmpty()
});
另外,您似乎不需要使用 draftToHtml
,因为我们需要保存原始内容状态,而不是 html 或其他任何内容。
完整的解决方案如下:
import "./styles.css";
import { Editor, EditorState, convertToRaw, convertFromRaw } from "draft-js";
import "draft-js/dist/Draft.css";
import { useState } from "react";
const blogFromLS = () => {
if (typeof window === "undefined") {
return false;
}
if (localStorage.getItem("blog")) {
return convertFromRaw(JSON.parse(localStorage.getItem("blog")));
} else {
return false;
}
};
export default function App() {
const [editorState, setEditorState] = useState({
editorState: blogFromLS()
? EditorState.createWithContent(blogFromLS())
: EditorState.createEmpty()
});
const onChange = (editorState) => {
setEditorState({ editorState });
if (typeof window !== "undefined") {
localStorage.setItem(
"blog",
JSON.stringify(convertToRaw(editorState.getCurrentContent()))
);
}
};
return (
<div className="App">
<Editor editorState={editorState.editorState} onChange={onChange} />
</div>
);
}
代码片段也可以在 sandbox 中找到。
我正在为我的项目使用 ReactJs,并且正在使用富文本编辑器,当我在内容 aria 中写一些东西时,我可以将数据保存在 localStorage 中,但是当我想在其中保存数据时刷新整个页面后的内容主体,它不会在内容 aria 中显示数据,但我已将数据成功保存在 localStorage
不知道哪里出了问题,
我试过这种方式:
const blogFromLS = () => {
if (typeof window === "undefined") {
return false;
}
if (localStorage.getItem("blog")) {
return JSON.parse(localStorage.getItem("blog"));
} else {
return false;
}
};
const [body, setBody] = useState({
editorState: EditorState.createEmpty(),
blogFromLS: blogFromLS(),
});
const { editorState } = body;
const onEditorStateChange = (editorState) => {
setBody({ editorState });
formData.set(
"body",
draftToHtml(convertToRaw(editorState.getCurrentContent()))
);
if (typeof window !== "undefined") {
localStorage.setItem(
"blog",
JSON.stringify(
draftToHtml(convertToRaw(editorState.getCurrentContent()))
)
);
}
};
<div className="form-group">
<Editor
className="editorCustom"
editorState={editorState}
wrapperClassName="demo-wrapper"
editorClassName="demo-editor"
onEditorStateChange={onEditorStateChange}
placeholder="write something..."
// onChange={handleBody}
// value={body}
/>
</div>
有什么建议吗
您接近于达到您想要实现的目标。
您必须调整的是初始化编辑器状态的方式。在初始化编辑器组件期间,您必须传递存储在 localStorage 中的状态。为此,您必须使用 EditorState.createWithContent
静态方法。
const [editorState, setEditorState] = useState({
editorState: blogFromLS()
? EditorState.createWithContent(blogFromLS())
: EditorState.createEmpty()
});
另外,您似乎不需要使用 draftToHtml
,因为我们需要保存原始内容状态,而不是 html 或其他任何内容。
完整的解决方案如下:
import "./styles.css";
import { Editor, EditorState, convertToRaw, convertFromRaw } from "draft-js";
import "draft-js/dist/Draft.css";
import { useState } from "react";
const blogFromLS = () => {
if (typeof window === "undefined") {
return false;
}
if (localStorage.getItem("blog")) {
return convertFromRaw(JSON.parse(localStorage.getItem("blog")));
} else {
return false;
}
};
export default function App() {
const [editorState, setEditorState] = useState({
editorState: blogFromLS()
? EditorState.createWithContent(blogFromLS())
: EditorState.createEmpty()
});
const onChange = (editorState) => {
setEditorState({ editorState });
if (typeof window !== "undefined") {
localStorage.setItem(
"blog",
JSON.stringify(convertToRaw(editorState.getCurrentContent()))
);
}
};
return (
<div className="App">
<Editor editorState={editorState.editorState} onChange={onChange} />
</div>
);
}
代码片段也可以在 sandbox 中找到。