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

sxkk20082年前知识分享270

前言

苹果的“暗黑模式”带来了全然一新的外观,它能使您的眼睛放松,并有助于您专心工作。暗黑模式使用一种较深的配色方案,这种配色作用于整个系统,现在大部分网站也加入了暗黑模式,包括 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)以其强大的计算能力和智能化的算法逐渐渗透到我们的生活中的各个角落,其中之一就是教育领域。随着AI技术的不断发展,越来越多的教育机构和学校借...

次元AI绘画:智能技术给创作带来新生命

次元AI绘画:智能技术给创作带来新生命

  随着智能技术的快速发展和普及,AI绘画正在逐渐成为一种新的艺术形式。它可以帮助艺术家们创造出更加神奇的作品,同时也给普通用户提供了更多参与艺术创作的机会。本文将就次元AI...

常规配置

我们可以在 create 的第二个参数传递一个 option 参数。

参数说明类型默认值可选值
value编辑器的初始值string--
theme编辑器的主题样式,除了提供的可选值外,也可以通过 monaco.editor.defineTheme 自定义主题string'vs''vs','vs-dark','hc-black'
language编辑器的初始语言,例如可以设置为 javascript, json 等string--
model和编辑器关联的初始模型ITextModel--
lineNumbers控制行数的渲染,如果是 function,那么会使用 return 的内容作为行数展示string/Function'on" alt="VS code 使用的代码编辑器">

VS code 使用的代码编辑器

前言有时候我们会有在需要在网页中写代码或者改代码配置的需求,这个时候就需要用到代码编辑器,常规的代码编辑器有 CodeMirror 和 Monaco Editor, CodeMirror 使用的人比较...

为了能完成这个目标,团队内部分享就成了这个目标的关键结果,那么如何在短时间内完成这项任务呢?下面分享下我的技巧。

明确主题

首先我们要明确公司需要什么?我们不能随便搞一个知识点去分享,这样没有人愿意去听,比如公司接下来可能会上前端监控系统,那么我们可以在先做一个技术调研,出一个《前端监控体系搭建要点》,比如公司接下来需要做小程序,那么我们可以出一个《小程序跨端实现方案探索》等,如果没有什么新的功能要开发,那么我们也可以谈一谈《前端性能优化》、《Typescript 快速上手》,总之要明确一个切合实际的目标。

巧用搜索引擎

确定好主题后,我们可以在技术社区搜索相关的技术文章,比如掘金、知乎、思否、微信公众号等, 比如直接在掘金搜索“性能优化” 然后按热度排序,就可以找到不错的文章。

掘金搜索性能优化

接下来我们需要根据这些文章中的内容制作 PPT

使用 markdown 来制作 PPT

程序员做 PPT 可能会浪费不少时间,所以我选择是 markdown 来制作 PPT,这里我分享 2 个工具

Marp for VS Code vscode 插件 Marp for VS Code 只用关注内容,简单分隔一下,就可以制作 PPT,看下 marp 官方文档可以很快学会用法,看看 jeremyxu 写的效果,项目地址:kubernetes 分享 PPT 源文件

Marp kubernetes 分享 PPT

二: Slidev 也可以让我们用 Markdown 写 PPT 的工具库

官网地址:https://sli.dev, 基于 Node.js、Vue.js 开发,而且它可以支持各种好看的主题、代码高亮、公式、流程图、自定义的网页交互组件,还可以方便地导出成 PDF 或者直接部署成一个网页使用。

  • 演讲者头像

当然还有很多酷炫的功能,比如说,我们在讲 PPT 的时候,可能想同时自己也出镜,Slidev 也可以支持。

演讲者头像

  • 演讲录制

Slidev 还支持演讲录制功能,因为它背后集成了 WebRTC 和 RecordRTC 的 API,

演讲录制

如何快速在团队内做一次技术分享?

前言相信很多小伙伴跟我一样,是一位奋斗在一线的业务开发,每天有做不完的任务,还有项目经理在你耳边催你,“这个功能今天能完成吗?”其实作为一名前端工程师,任务就是完成 Leader 的任务, 但公司实行...

发表评论    

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