使用 React hooks 监听系统的暗黑模式

sxkk20082年前知识分享239

前言

苹果的“暗黑模式”带来了全然一新的外观,它能使您的眼睛放松,并有助于您专心工作。暗黑模式使用一种较深的配色方案,这种配色作用于整个系统,现在大部分网站也加入了暗黑模式,包括 Tailwindcss、antd design 等都支持了暗黑模式,因此我们的网站也要适配系统皮肤。

image.png

css 实现

暗模式传统上是通过使用 prefers-color-scheme 媒体查询来实现的,当暗黑模式被激活时,它可以重新应用一套样式。

body {
  color: black;
  background: white;
}
@media (prefers-color-scheme: dark) {
  body {
    color: white;
    background: black;
  }
}

React hooks 实现

前端页面中除了使用 css 实现外,还有很大部分是使用 JavaScript 实现的,比如 echart 图表等,这时就需要使用 JavaScript, 可以使用window.matchMedia 来获取皮肤颜色。我们可以把这个逻辑写成一个自定义 hooks

import { useEffect, useState } from 'react'

export type ThemeName = 'light' | 'dark'

function useTheme() {
  const [themeName, setThemeName] = useState < ThemeName > 'light'
  useEffect(() => {
    // 设置初始皮肤
    if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
      setThemeName('dark')
    } else {
      setThemeName('light')
    }
    // 监听系统颜色切换
    window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (event) => {
      if (event.matches) {
        setThemeName('dark')
      } else {
        setThemeName('light')
      }
    })
  }, [])
  return {
    themeName,
    isDarkMode: themeName === 'dark',
    isLightMode: themeName === 'light',
  }
}

export default useTheme

使用

下面代码是配合 echart 使用

import './styles.css'
import React, { useRef, useEffect } from 'react'
import * as echarts from 'echarts'
import useTheme from './hooks/useTheme'

export default function App() {
  const domRef = useRef(null)
  const { isDarkMode } = useTheme()
  useEffect(() => {
    var myChart = echarts.init(domRef.current, isDarkMode ? 'dark' : 'light')
    var option = {
      xAxis: {
        type: 'category',
        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
      },
      yAxis: {
        type: 'value',
      },
      series: [
        {
          data: [820, 932, 901, 934, 1290, 1330, 1320],
          type: 'line',
          smooth: true,
        },
      ],
    }

    myChart.setOption(option)
    return () => {
      myChart.dispose()
    }
  }, [isDarkMode])
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
      <div ref={domRef} style={{ height: 500 }}></div>
    </div>
  )
}

效果

2022-02-10 15-28-54.2022-02-10 15_30_49.gif

代码示例

codesandbox

以上就是本文全部内容,希望这篇文章对大家有所帮助,也可以参考我往期的文章或者在评论区交流你的想法和心得,欢迎一起探索前端。

相关文章

相关文章

KNX协议:实现智能化控制的强大工具

KNX协议:实现智能化控制的强大工具

  随着科技的不断发展,智能化控制正成为我们生活中不可或缺的一部分。而KNX协议作为一项先进的技术标准,扮演了关键的角色。本文将探讨KNX协议的原理、应用以及未来的发展方向。...

有个非常大的缺点,就是需要一个安静的环境,声音必须外放,后来因为代码压缩,下架了。

现在推荐一款大神开发的,界面是这样的

Azure Speech Download

不必先播放,就可以直接下载音频文件,相信对一些视频制作者有很大帮助,我的几个视频就是通过这个插件获得的音频,再配上制作 keynote 动画导出视频,剪辑实现,可以说是非常好用。

2. copy-helper

网址:https://greasyfork.org/zh-CN/scripts/439663-copy-helper

文章拷贝助手,掘金、简书、微信文章、知乎专栏、思否、CSDN 文章一键拷贝 markdown。

文章拷贝助手

我还写了篇文章介绍如何实现这个脚本,无论对个人知识整理和收集,还是公众号主运营,都很有帮助。

3. 壹伴排版 Plus

网址: https://greasyfork.org/zh-CN/scripts/439551-壹伴排版-plus

公众号运营者福利,可以在微信公众平台可直接插入壹伴的模板,免开 vip

壹伴排版 Plus

这款插件也是笔者开发的,关于如何实现,有一篇文章介绍

4. 屏蔽广告

网址:https://greasyfork.org/zh-CN/scripts/439420

屏蔽谷歌广告、百度广告、知乎广告、隐藏谷歌和百度搜索增强百度搜索结果的各种广告等等(过滤所有采用谷歌联盟和百度联盟等广告联盟的广告)

屏蔽广告设置

安装好脚本之后,可以点击油猴,去脚本【广告管理设置】,在设置里也能看见这个脚本都支持哪些网站,还支持 CSDN 外链优化。

5. 稿定去水印

网址:https://greasyfork.org/zh-CN/scripts/454511

有些同学问我的博客首图是怎么设计的?我用的就是这款插件,稿定提供了大量免费设计素材和免费设计和视频模板、在线抠图和电商海报设计模板等,一键搞定设计需求。

稿定去水印

安装完成后,在右上角会有一个去水印按钮,设置完成后,使用 QQ 微信登截屏工具,截图即可。

6. iconfontr

网址:https://greasyfork.org/zh-CN/scripts/447288-iconfontr

前端开发者福利,在 Iconfont 可以直接复制 React component

iconfontr

推荐6款油猴脚本,不看错亿!

本文视频地址推荐 6 款贼好用的油猴脚本,其中有 4 个是笔者开发的,看完了文章,要是对这几款脚本感兴趣的话,赶紧去试试看,且用且珍惜!1. Azure Speech Download网址:https...

百度AI语音合成:赋予文字声音,改变世界的未来

百度AI语音合成:赋予文字声音,改变世界的未来

  在数字化时代,人们对于语音技术的需求越来越高。无论是在线教育、智能助手还是虚拟现实,语音合成技术都发挥着重要的作用。而在众多的语音合成技术中,百度AI语音合成以其高质量的...

百度EasyDL:开启人工智能时代的新篇章

百度EasyDL:开启人工智能时代的新篇章

  随着人工智能的发展,新媒体技术逐渐融入了各个行业。在这个信息爆炸的时代,搜索引擎成为我们获取知识的重要途径。而百度EasyDL作为一项集成了大数据分析和深度学...

人工智能生活:新媒体创新之先导

人工智能生活:新媒体创新之先导

  随着人工智能技术的快速发展,我们的生活受益匪浅。从智能家居到智能穿戴,从语音助手到智能机器人,人工智能已经开始渗透到我们的方方面面。新媒体作为现代社会的重要组成部分,也受...

AI绘画教程:让人工智能为你创作艺术品

AI绘画教程:让人工智能为你创作艺术品

  随着人工智能技术的不断发展和应用,AI绘画已经成为艺术领域的一大趋势,许多艺术家和设计师已经开始应用AI技术创作出令人瞩目的作品。但对于普通人来说,如何学习和应用AI绘画...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。