javascript - 如何从本地存储中获取项目?
问题描述
我尝试使用 next.js 从我的本地存储中获取项目,而不重新呈现我的页面。
我使用这段代码:
import { ThemeProvider } from "@material-ui/core";
import { FC, useEffect, useState } from "react";
import { useStore } from "../hooks/ContextStore";
import { darkTheme, theme } from "../theme/theme";
import Navbar from "./navbar/Navbar";
const Layout: FC = ({ children }) => {
const [darkMode, setDarkMode] = useState(false);
const store = useStore();
useEffect(() => {
setDarkMode(JSON.parse(window.localStorage.getItem("dark-mode")));
}, [store.darkMode]);
console.log("did render");
return (
<ThemeProvider theme={darkMode ? darkTheme : theme}>
<Navbar />
{children}
</ThemeProvider>
);
};
export default Layout;
因为我的 useEffect 更新了我的状态,所以当我打开或关闭暗模式状态时,它会渲染页面两次。
有没有办法防止它重新渲染那么多并访问本地存储?
解决方案
从外观上看,因为你的状态值总是来自本地存储,所以你不需要将它存储在状态中。你可以这样做:
const isClient = typeof window !== undefined;
const Layout: FC = ({ children }) => {
const store = useStore();
const darkMode = isClient && JSON.parse(window.localStorage.getItem("dark-mode"));
return (
<ThemeProvider theme={darkMode ? darkTheme : theme}>
<Navbar />
{children}
</ThemeProvider>
);
}
export default Layout;
如果您真的想存储在状态中,那么您应该更新 useEffect 中的依赖数组以在本地存储值中查找更新,而不是状态,因为您将更新状态。
const storageDarkMode = JSON.parse(window.localStorage.getItem("dark-mode"));
useEffect(() => {
setState(storageDarkMode);
}, [storageDarkMode])
推荐阅读
- osmdroid - OSMDroid 离线地图未加载
- php - Laravel 6 PHPUnit 测试 - 找不到驱动程序(SQL:PRAGMA foreign_keys = ON;)
- wpf - Style 中定义的按钮资源
- javascript - 在 axios 获取请求更新对象的属性后,Vue.js 中的 HTML 未更新
- python - 遍历二叉树的递归列表问题
- react-native - 将用户 paypal 帐户与 react native 集成,作为一种付款方式
- java - 摇摆计时器和画布上的绘画
- pandas - Pandas:通过将列的值与不同行中同一列的另一个值进行比较来过滤行
- c# - WPF DataGrid 根据属性使行只读
- python - 通过 pandas 合并或 SQL JOIN 查询将 sqlite 中的 NULL 替换为另一个表中的值