reactjs - 从 React 的本地存储中将数据持久化到上下文文件中?
问题描述
我正在使用 React 上下文来存储一个名为 course 的变量,该变量通常包含一个数字 1-7。我试图在刷新页面时保留课程编号。到目前为止,当我单击链接时,我可以看到正确的数字设置为本地存储,但是当我刷新 Lesson.js 时,由于 context.lesson 未定义,我得到了错误。(课程变量最初是通过 Menu.js 中的事件设置的。)本质上,状态“课程”在刷新时正在清除/未定义。
我的逻辑:
- 单击在状态和本地存储中设置课程的链接
- 刷新时,运行获取本地存储值的 useffect,并将
课程状态设置为该值。
菜单.js
<Link
to={`/Module/${index + 1}`}
onClick={() => {context.setLesson(index + 1);}}
/>
上下文.js
const [lesson, setLesson] = useState();
课程.js
useEffect(() => {
localStorage.setItem("lesson", JSON.stringify(context.lesson));
});
useEffect(() => {
const data = localStorage.getItem("lesson");
if (data) {
context.setLesson(JSON.parse(data));
}
}, []);
context.lesson 记录为未定义。
解决方案
我使用自定义钩子来解决我的问题。将课程从上下文中移到 App.js 中。
//initial lesson state
const [lesson, setLesson] = useLocalStorage("lesson", "0");
//set lesson state
function setLessonHandler(param) {
setLesson(param);
}
return (
<AppProvider>
<Switch>
<Route exact path="/">
<Menu setLesson={setLessonHandler} />
</Route>
<Route path="/Module">
<Lesson lesson={lesson} />
</Route>
</Switch>
</AppProvider>
不幸的是,我不能使用服务器来解决这个问题,所以它是本地存储!
推荐阅读
- azure - 使用 Powershell,如何将版本添加到 azure api 管理 API?
- html - 当我们为文本添加上边距时,它会为 div 而不是文本添加边距
- sql-server - 如何为 SQL Server 中的主键列随机自动生成 8 位数字值?
- iframe - document.write iframe 导致白屏
- git - 恢复压缩提交中的一个提交?
- debugging - 函数调用的嵌套程度是否有预定义标识符?
- angular - 如何在 Angular 中计算下载/上传互联网速度
- sql - 使用 SQL 查找包含 acrostic(诗中的隐藏词)的记录
- python - ValueError:长度不匹配:在 Pandas + python 中
- r - R - 在 ScatterPlot 中绘制椭圆(不是* stat-ellipse)