React,使用本地存储实现暗光模式

2024-03-31

我正在尝试使用use-local-storage在 React 中实现主题变换器。

应用程序组件:

import './App.css';
import React from 'react';
import { Navbar, SearchBar, Header, Main, Chart, Map } from './components';
import { Routes, Route, BrowserRouter } from 'react-router-dom';
import useLocalStorage from 'use-local-storage';

function App() {

  //  a function that toggles between darkmode and lightmode in css
  const defaultDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
  const [theme, setTheme] = useLocalStorage('theme', defaultDark ? 'dark' : 'light');
  const switchTheme = () => {
    const newTheme = theme === 'light' ? 'dark' : 'light';
    setTheme(newTheme);
  }
  console.log(theme)

  return (
    <BrowserRouter>
      <div className='App' data-theme={theme} >
        <Header />
        <SearchBar />
        <Navbar switchTheme={switchTheme} />
        <Routes>
          <Route path="/" element={<Main />} />
          <Route path="/map" element={<Map />} />
          <Route path="/chart" element={<Chart />} />
        </Routes>
      </div>
    </BrowserRouter>
  );
}

export default App;

导航栏组件:

import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faMapLocationDot, faChartLine, faHouseUser } from '@fortawesome/free-solid-svg-icons'
import React from 'react'
import { Link } from 'react-router-dom'


const Navbar = ({switchTheme}) => {
  return (
    <nav className='nav'>
      <button onClick={switchTheme}>Toggle</button>
      <Link to='/'>
        <FontAwesomeIcon icon={faHouseUser} size='4x' color='blue' />
        <br></br>
        Home
      </Link>
      <Link to='/map'>
        <FontAwesomeIcon icon={faMapLocationDot} size='4x' />
        <br></br>
        Map</Link>
      <Link to='/chart'>
        <FontAwesomeIcon icon={faChartLine} size='4x' color='red' />
        <br></br>
        Chart</Link>

    </nav>
  )
}

export default Navbar

CSS:

*, *::after, *::before {
box-sizing: border-box;
margin: 0;
padding: 0;
}

/****************** VARIABLES ******************/

  :root {
    --background-color:coral;
  }
  
  [data-theme="light"] {
    --background-color:red;
  }
  
  [data-theme="dark"] {
    --background-color:yellow;
  }



body {
background-color:var(--background-color);
font-family: 'Roboto', sans-serif;
font-size: 16px;
color: #333;
line-height: 1.5;
margin: 2vmin;
}

.App {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}


/**********************  SearchBar  **********************/

form {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
max-width: 500px;
margin: 0 auto;
}

form > svg {
margin-left: -20px;
}

input {
font-size:inherit;
border-radius: 1vmin;
border: .5px solid #ccc;
padding: .5rem;
}

input:focus {
border-color: #333;
}



nav {
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
padding: 0.5rem;
background-color: yellow;
border-bottom: 1px solid #eaeaea;
width: 10vw;
height: 50vh;
border: 3px dotted purple;
align-self: flex-start;
}

a {
text-decoration: none;
}




/* a:active  {
/* do sth with selected Link 
} */

我从中得到了正确的值console.log(theme) in App.js但我无法更改整个应用程序的背景颜色。 有解决这个问题的想法吗?


当您将主题设置为body,并尝试稍后通过App成分。添加data-theme on the body本身或在html,它发生在之前,而不是发生在之后的事情上。

添加这个useEffect in App.js就在你之前return会工作:

useEffect(() => {
  document.documentElement.setAttribute("data-theme", theme);
}, [theme]);

完整示例以及下面的 CodeSandbox:

import './App.css';
import React, {useEffect} from 'react';
import { Navbar, SearchBar, Header, Main, Chart, Map } from './components';
import { Routes, Route, BrowserRouter } from 'react-router-dom';
import useLocalStorage from 'use-local-storage';

function App() {
  //  a function that toggles between darkmode and lightmode in css
  const defaultDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
  const [theme, setTheme] = useLocalStorage('theme', defaultDark ? 'dark' : 'light');
  const switchTheme = () => {
    const newTheme = theme === 'light' ? 'dark' : 'light';
    setTheme(newTheme);
  }
  useEffect(() => {
    document.documentElement.setAttribute("data-theme", theme);
  }, [theme]);
  return (
    <BrowserRouter>
      <div className='App'>
        <Header />
        <SearchBar />
        <Navbar switchTheme={switchTheme} />
        <Routes>
          <Route path="/" element={<Main />} />
          <Route path="/map" element={<Map />} />
          <Route path="/chart" element={<Chart />} />
        </Routes>
      </div>
    </BrowserRouter>
  );
}
export default App;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React,使用本地存储实现暗光模式 的相关文章

  • 如何使div垂直滚动[重复]

    这个问题在这里已经有答案了 我用图片元素列表做了一个水平滚动 但是当我垂直滚动它时我失败了 我的水平滚动条代码是 div class pic container div class pic row div style width 100 a
  • 如何确保循环完成后执行语句?

    下面是我的代码的快照 routes index js exports index function req res var results new Array for var i 0 i lt 1000 i do database quer
  • 动画和过渡的组合无法正常工作

    我一直在尝试添加一些基本的 CSS3 动画 目标是在按钮的单击事件上切换类 并根据添加的类对 div 进行动画处理 该代码对于 Firefox 中切换的第一次迭代完美运行 但对于 Chrome 等其他浏览器以及 Firefox 中的下一次迭
  • 帮助在 UIWebView 中使用 Javascript 代码

    我想在 webView 中运行以下代码 以便内容可编辑 javascript document body contentEditable true document designMode on void 0 到目前为止 我已经尝试过这个 v
  • 如何在模态窗口中显示pdf? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个模式窗口 其中包含锚文本 当我单击此链接时 它必须调用其他位置的 pdf 并将其显示在弹出窗口中 我怎样才能做到这一点 请帮忙
  • 如何选择一个元素但排除其子元素

    我明白 div hover not class 作品 但是 如何实现 LI 元素的 悬停 效果 但排除鼠标悬停在LI内的某个 DIV 上时的悬停效果 E G li Hello div Bye div li 我想获得 li 的悬停效果 li
  • 对 UPDATE 行的 POST 请求

    我是 javascript 的新手 所以我正在寻找一些帮助来创建一种拖放地理编码标记的方法 以允许交互式更改地址 我相信通过更新 LOCATION 列行可以实现这一点 第一步是 发送 POST 请求 对吧 好吧 所以我想问是否有人可以给我看
  • 从 mvc web api httpresponse 生成 csv 并通过 angularjs 接收以供下载

    我正在尝试从我的 Web api 生成一个 CSV 文件并通过 angularjs 接收该文件 我有一个如下所示的 API 控制器 HttpPost public HttpResponseMessage GenerateCSV FieldP
  • Safari 和 Edge 中的 audioContext.copyToChannel() 替代方案

    Safari 和 Edge 都不支持audioContext copyToChannel 函数用自定义内容填充audioBuffer 还有其他方法吗 就我而言 我想创建一个脉冲响应 用该响应填充缓冲区 并将一些声音与该缓冲区进行卷积 对于
  • React Native v0.71.8 React-native-vector-icons 你看不到的图标

    我在用react native版本v0 71 8 我安装了react native vector icons库 但图标未显示 似乎链接在最新版本的 React Native 中不再起作用 所以我按照说明进行操作 但它不再编译 出现以下错误
  • 玩笑错误反应组件上出现意外标记

    我收到了意外的令牌React Component Name在跑步的时候npm test 尝试阅读其他几个类似的问题 但似乎没有一个对我有用 我在下面添加了 babelrc package json 和我的测试文件内容的内容 presets
  • onDeviceReady 未在 PhoneGap hello world 应用程序中触发

    我正在尝试做一个简单的警报 测试 应用程序 但事件没有被触发 这是代码 function onLoad document addEventListener deviceready onDeviceReady false Cordova is
  • 如何在vuetify中设置固定工具栏?

    在 vuetify 中我使用工具栏
  • Angular 2 + Semantic UI,组件封装打破风格

    我使用 Angular2 和 Semantic UI 作为 CSS 库 我有这段代码 div class ui three stakable cards a class ui card a a class ui card a a class
  • 如何将多个画布元素放入一个画布元素中?

    我有多个由 JavaScript 创建的画布元素 我的问题是 如何将多个画布元素放入一个画布元素 干得好 JSfiddle http jsfiddle net Allendar UqxCY 它会抓取每个画布并将它们做成 PNG 的 访问缓冲
  • 如何使用 Firebase Cloud Functions 在 DataSnapshot 中查找特定值

    我正在尝试创建一个云函数 该函数将在 HTTP 请求 在计时器上发送 上触发 这将删除具有特定值的所有子项 数据库节点如下所示 activities 4GI1QXUJG0MeQ8Bq19WOdCQFo9r1 uid activity ham
  • IE8 - 隐藏 div 内的表单,返回键不再起作用

    我有一个登录表单 位于带有 display none 的 div 中 然后我使用 jquery 淡入表单 但 Enter Return 键不再提交表单 如果我将显示更改为阻止 则效果很好 此问题仅存在于 IE 中 有任何想法吗 这是一个不起
  • Tizen SDK:找不到变量:tizen

    我正在尝试使用 Tizen SDK 创建一个 Web 应用程序 当我启动应用程序时 一切都很好 但是当我在模拟器上按 后退 按钮时 没有任何反应 并且我看到一条消息 55435 js main js 9 ReferenceError 找不到
  • IE10 中的弹性盒

    我试图让弹性框在 IE10 中工作 但它不起作用 Safari Chrome 和 Firefox 工作正常 但 IE10 不工作 有人知道答案吗 代码笔 http codepen io anon pen vcEGH http codepen
  • 构造函数可以返回什么值来避免返回 this ?

    确切的情况是什么 returnJavascript 中的语句可以返回除this当使用构造函数调用时new关键词 Example function Foo return something var foo new Foo 如果我没记错的话 如

随机推荐

  • Django查询大量关系

    我通过以下方式设置 Django 模型 模型 A 与模型 B 具有一对多关系 A 中的每条记录在 B 中都有 3 000 到 15 000 条记录 构造一个查询的最佳方法是什么 该查询将检索 B 中与 A 中的每条记录相对应的最新 最大 p
  • 如何使用设置脚本、打字稿和组合 API 在 vue 中使用验证器

    我有来自教程的以下代码示例 我尝试找出如何以与示例类似的方式使用验证器 使用脚本设置 打字稿和组合 API props image type String default require assets default poster png
  • 停用词和 MySQL 布尔全文

    我正在使用 mysql 内置的布尔全文功能来搜索数据集 匹配 反对语法 我遇到一个问题 MySql 的默认停用词列表中的关键字不返回任何结果 例如 之前 之间 等 我认为 没有办法在运行时禁用 MySql 的停用词 而且因为我在共享服务器
  • 在 Spark 中启动 Thrift 服务器

    谁能帮我启动 Spark Thrift 服务器 我正在独立模式下运行我的脚本 我想在我的商业智能工具中获取数据 为了做到这一点 我需要启动 Thrift 服务器 我尝试运行 shell 脚本 SPARK HOME sbin start th
  • Angular - 反应式表单 - 如何使用类和验证器将对象传递到 FormGroup

    我要创建一个大型表单 并决定使用反应式表单功能以方便使用 然而 我面临着一些可能显而易见的挑战并寻求帮助 下面是两种情况 除了验证之外 它们产生相同的结果 这createFormWithValidation 方法指定每个控件及其关联的验证器
  • 批量注册IEntityTypeConfiguration<>实体框架核心

    好的 所以我正在使用带有 dot net core 和代码优先迁移的实体框架 这本身不是问题 我只是想知道是否有人找到了更好的方法来做到这一点 目前我有很多实体类型配置 如下所示 public class ExampleEntityConf
  • 通过 PhoneGap Build 从 Android 4.x 应用程序中的图像地图区域中删除突出显示

    我尝试了各种方法来尝试在推动图像的图像映射区域时消除高光 我一次又一次地搜索谷歌 并添加了我能找到的所有CSS代码 希望它能有所帮助 但似乎没有 An example of what i am talking about 我已经添加了 we
  • 如何以非阻塞的方式检查iOS上的网络可达性?

    在我的 iOS 项目中 我想在某些网络操作之前 向用户显示一条连接到互联网的消息 因此我使用 Apple 的 Reachability 类编写了以下检查 Reachability reach Reachability reachabilit
  • Javascript Promises:迭代所有对象键数组,然后解析

    我有这个 JS 对象 let setOfWords nouns work construction industry verbs work 我正在使用调用 REST 资源的谷歌翻译 API 因此我需要等待每个翻译的响应 然后使用翻译后的单词
  • WebSecurity.InitializeDatabaseConnection 方法只能调用一次

    我正在尝试使用 Windows Azure 托管 MVC4 Web 应用程序 我使用 VS2012 MVC4 互联网应用程序模板创建了一个测试应用程序 并向其中添加了自定义模型和控制器 我已将其发布在 Azure 上 并设法将 更新数据库
  • Chrome 51 中的浅色和深色浏览器操作图标

    在 Chrome 51 中 隐身窗口现在具有深色工具栏背景 而以前的版本使用浅色背景 在这两种情况下 单个 16x16 图像通常无法提供良好的对比度 当通过a向用户显示信息时browserAction图标 扩展程序可以通过什么机制提供深色主
  • 如何查询 Mongoose 中的不同值但返回所有文档?

    使用猫鼬及其独特的功能 我如何将查找与正则表达式和 distict 结合起来 并返回完整的文档 使用不同的功能https docs mongodb com manual reference method db collection dist
  • 将 MVC 2 ASPX 转换为 MVC 4 Razor 视图引擎

    我目前正在使用 Visual Studio 2010 和视图引擎开发 MVC 2ASPX一种项目 所以我决定使用带有 MVC 4 和视图引擎的 Visual studio 2012Razor 那么我可以完成上述任务吗 如果可以的话怎么办 我
  • 获取非包扩展属性的 KProperty

    在 kotlin 中 您可以使用引用运算符来获取包扩展属性的 KProperty 如下所示 val String extProp String get Some get code fun foo val prop KProperty
  • 更改 QCheckBox 文本颜色

    我在那里发现了同样的问题 如何在Qt中更改QCheckBox文本标签颜色 https stackoverflow com questions 11153945 how to change qcheckbox text label color
  • 使用 JetPack Compose 更改 Android 语言

    我正在尝试使用 jetpack compose 功能更改应用程序的区域设置 如下所示 Composable fun SetLanguage position Int val locale Locale when position 0 gt
  • 当 SelectionType = ppSelectionNone 时,如何获取 Powerpoint 中可见幻灯片的 SlideIndex

    我有一些代码需要我知道什么SlideIndex进行操作 例如 在哪里插入新幻灯片 在哪里插入 ChartObject 等 大约99 的情况下 我都能成功获得SlideIndex by Dim w as Long slide index va
  • 在 Codename One 中管理我的应用程序的演示/完整版本

    我被命令提供 2 个版本的应用程序 一个演示 轻型 有限功能 另一个完整 所有功能 我的代码中有一个布尔值 它告诉我哪个正在运行 它们都在模拟器或测试设备 iOS 和 Android 上按预期运行 现在我想分发它们 所以我读到这是可能的使用
  • barplot():每组的频率百分比

    我正在尝试制作一个分组条形图 其频率 在 y 轴上 depression meds N Y 在 x 轴上 按另一个变量分组score 低高 到目前为止我的代码 meds lt table data2 depression meds data
  • React,使用本地存储实现暗光模式

    我正在尝试使用use local storage在 React 中实现主题变换器 应用程序组件 import App css import React from react import Navbar SearchBar Header Ma