【问题标题】:Grab theme from local storage before page is rendered in react在反应中呈现页面之前从本地存储中获取主题
【发布时间】:2021-11-08 23:43:06
【问题描述】:

我正在使用 react 构建一个小型 Web 应用程序,并且还包含一个 ThemeSwitcher 组件。该组件包含视觉方面,即切换,以及切换主题的脚本和访问本地存储的脚本。然后 ThemeSwitcher 组件被导入到 Header 组件中,而后者又被导入到 index.js 中

当从深色主题(默认)切换到浅色主题时,此信息将保存到本地存储:

let currentTheme = "dark-theme";

function switchTheme() {
        const body = document.querySelector("body");
        const transitionChecker = document.querySelector("#theme-selector");
    
        body.classList.add("transition");
        body.classList.toggle("light-theme");
        transitionChecker.addEventListener("transitionend", () => {
            body.classList.remove("transition");
        });
        currentTheme === "dark-theme"
            ? (currentTheme = "light-theme")
            : (currentTheme = "dark-theme");
    
        localStorage.setItem("storedTheme", currentTheme);
    }

我正在使用以下方法在页面加载时访问此值:

window.addEventListener("load", function () {
    let storedTheme = localStorage.getItem("storedTheme");
    if (storedTheme === "light-theme") switchTheme();
});

这或多或少符合预期。但是,在页面加载时,深色主题会显示片刻,然后切换到浅色主题。

有没有什么方法可以在页面渲染之前抓取想要的主题,避免默认主题闪过?

【问题讨论】:

    标签: reactjs darkmode


    【解决方案1】:

    所以在玩了一些之后,我相信有一个适合我的解决方案。我基本上只是在声明实际组件之前将它放在我的 App.js(在 index.js 中呈现)的开头:

    //get stored theme right at the beginning
    let currentTheme = localStorage.getItem("storedTheme");
    if (!currentTheme) currentTheme = "dark-theme"; // if no theme was stored, set to default --> dark-theme
    
    document.querySelector("body").classList.add(currentTheme);
    

    我是如何得出这个解决方案的:

    • 我开始使用 create-react-app,所以切换到 Next.js 不是一个选择
    • 尝试使用 setTimeOut 进行一些操作,但无法正常工作
    • 尝试使用useEffect(),但这仍然让黑暗主题闪烁 如果之前选择了轻主题,则通过
    • 将代码移到实际 App 组件之外,但仍然 在 App.js 中找到它是可行的。

    switchTheme() 也被移到 App.js 并位于最后。

    不确定这是否是一个正确的解决方案,或者它是否只是让浏览器在实际呈现之前为浏览器提供额外的瞬间来获取存储的主题。但它对我有用。

    【讨论】:

    • 啊.. 我真的忘了我们可以在 React 之外编写 JS。干得好。
    • @loocd,我有这个确切的问题。但是上面的代码在渲染我的主题背景之前仍然会显示默认的浏览器背景。不知道我是否遗漏了其他任何东西
    • @Gangula,您是否将您从本地存储中获取主题的部分完全移到了实际的反应组件之外?这就是我的情况:ibb.co/3SY0QLt 有关更多详细信息,您还可以查看该网站:http.nkia.loocd.ch
    • 我的错。我忘了我有一个transition-delay 用于background-color
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2022-10-25
    • 2019-01-18
    相关资源
    最近更新 更多