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

sxkk20082年前知识分享229

前言

苹果的“暗黑模式”带来了全然一新的外观,它能使您的眼睛放松,并有助于您专心工作。暗黑模式使用一种较深的配色方案,这种配色作用于整个系统,现在大部分网站也加入了暗黑模式,包括 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

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

相关文章

相关文章

AI绘画生成器 - 让机器也能成为艺术家

AI绘画生成器 - 让机器也能成为艺术家

  最近,一个名为“AI绘画生成器”的网站开始在社交媒体上走红。这个网站可以根据用户的输入,通过人工智能技术生成一幅艺术画作。这种新型的艺术创造方式引起了不少关注,因此我们有...

AI科技:改变世界的技术创新

AI科技:改变世界的技术创新

  随着人工智能(AI)技术的飞速发展,我们正处于一个科技革命的时代。AI已经渗透到各个领域,对我们的生活产生着深远的影响。无论是在医疗保健、交通运输、金融服务还是教育等行业...

使用 Web Speech API 和 ChatGPT API 开发一个智能语音机器人

前言随着 AI 的不断发展,我们前端工程师也可以开发出一个智能语音机器人,下面是我开发的一个简单示例,大家可以访问这个视频地址查看效果。原理首先说一下这个 demo 的实现原理和步骤我们使用 Web...

应用人工智能技术的变革:从智能语音助手到自动驾驶汽车

应用人工智能技术的变革:从智能语音助手到自动驾驶汽车

  随着人工智能技术的迅猛发展,人们的生活得到了极大的改变。从智能语音助手到自动驾驶汽车,人工智能技术已经深入到我们的日常生活中。这些应用不仅提高了我们的生活质量,还为许多行...

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

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

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智能绘画软件越来越受到人们的关注。通过AI技术,这些软件能够模拟人类的绘画过程,甚至可以在一定程度上进行自动化画作创作。这种推陈出新的技术给艺术家...

发表评论    

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