我try 获取更新的localstorage状态darkmodeuseContext,但当我在App.tsx内的函数中控制台登录它时,它给出了Context.js内设置的默认值:

App.tsx:

const { darkmode } = useContext(Context);

React.useEffect(() => {
  console.log(darkmode);
}, []);

上下文.js:

import { useState, useEffect, createContext } from "react";

const Context = createContext();

function ContextProvider({ children }) {
  const [darkmode, setDarkmode] = useState(false);

  // Local Storage: setting & getting data
  useEffect(() => {
    const darkmode = JSON.parse(localStorage.getItem("darkmode"));
    if (darkmode) {
      setDarkmode(darkmode);
    }
  }, []);

  useEffect(() => {
    localStorage.setItem("darkmode", JSON.stringify(darkmode));
  }, [darkmode]);

  const toggleDarkmode = () => {
    setDarkmode((prev) => !prev);
  };

  return (
    <Context.Provider
      value={{
        darkmode,
        toggleDarkmode,
      }}
    >
      {children}
    </Context.Provider>
  );
}

export { ContextProvider, Context };

本地存储:

localstorage

控制台记录:

console

如何使用Reaction上下文获取最新更新的localstorage状态?

推荐答案

Issue

问题是由以下useEffect项以及您最初设置状态的方式引起的:

useEffect(() => {
  localStorage.setItem("darkmode", JSON.stringify(darkmode));
}, [darkmode]);

上面的useEffect个每次运行darkmode个变化,而且还在挂载.在挂载时,darkmode等于false,这是赋予useState的值.因此,localStorage被设置为false,覆盖以前注册的所有内容.

Solution

一个解决方案是改变你设置状态的方式,这样如果有什么事情,你就可以 Select localStroge个中的什么:

const [darkmode, setDarkmode] = useState(!localStorage.getItem("darkmode") ? false : JSON.parse(localStorage.getItem("darkmode")));

或者,如果您不想访问useState中的本地存储,这可能会导致在客户端和服务器上呈现的框架(如Next.js)出现问题,您可以将useEffect更改为一个额外的状态:

const [firstRender, setFirstRender] = useState(true);
useEffect(() => {
    // This allows the `useEffect` that fetches data from local storage to run first:
    if(firstRender){
      setFirstRender(false);
      return;
    }
    localStorage.setItem("darkmode", JSON.stringify(darkmode));
}, [darkmode, firstRender]);

此外,要记录darkmode个更改,请考虑将其添加到useEffect的依赖项数组中:

React.useEffect(() => {
  console.log(darkmode);
}, [darkmode]);

Javascript相关问答推荐

使用JavaScript重命名对象数组中的键

我不知道为什么我的JavaScript没有验证我的表单

如何使用Echart 5.5.0创建箱形图

成帧器运动中的运动组件为何以收件箱开始?

将json数组项转换为js中的扁平

过滤对象数组并动态将属性放入新数组

微软Edge编辑和重新发送未显示""

在nextjs服务器端api调用中传递认证凭证

切换时排序对象数组,切换不起作用

如何从html元素创建树 struct ?

如何避免页面第一次加载时由于CSS样式通过JavaScript更改而出现闪烁

如何修复我的数据表,以使stateSave正常工作?

IF语句的计算结果与实际情况相反

用JS从平面文件构建树形 struct 的JSON

如何在Angular拖放组件中同步数组?

基于props 类型的不同props ,根据来自接口的值扩展类型

如何将zoom 变换应用到我的d3力有向图?

当我try 将值更改为True时,按钮不会锁定

使每个<;li>;元素的 colored颜色 与随机生成的 colored颜色 列表不同(不重复

如何根据查询结果重新排列日期