如何在 Vue 3 + Element Plus 项目中实现动态设置主题色以及深色模式切换


文章目录
- 一、引言
- 二、项目依赖和环境配置
- 1. VueUse
- 2. use-element-plus-theme
- 3. 安装依赖
- 三、实现深色模式切换
- 1. 设置深色模式状态
- 2. 模板中的深色模式切换按钮
- 3. 深色模式的效果展示
- 四、动态切换主题色
- 五、总结
一、引言
在现代 Web 应用中,主题切换功能尤其是深色模式和自定义主题色的动态切换,已经成为提升用户体验的关键要素之一。它不仅能够根据用户的喜好自动调整界面风格,还能够为不同的场景提供更好的视觉效果,特别是在夜间使用时,深色模式可以减轻眼睛的疲劳。
本文将结合 Vue 3 和 Element Plus 框架,通过实际代码示例展示如何实现深色模式和主题色的动态切换。

二、项目依赖和环境配置
在实现动态主题切换功能之前,我们需要确保项目环境中安装了必要的依赖工具。这些工具将帮助我们简化深色模式切换和主题颜色的动态修改。下面将详细说明这些依赖的作用和安装方式。
1. VueUse
VueUse 是一个基于 Vue 3 的工具库,提供了许多方便的 Composition API 工具,极大地简化了 Vue 3 中常见功能的实现,比如深色模式切换、存储管理、时间处理等。
在本项目中,我们使用 VueUse 来实现深色模式的管理和用户主题色选择的持久化存储。
2. use-element-plus-theme
use-element-plus-theme 是一个专门用于 Element Plus 组件库的插件,它允许我们在运行时动态更改 Element Plus 的主题色。
这个插件将主题管理过程简化为一个简单的 API 调用,极大地提升了开发效率。通过 use-element-plus-theme,我们可以根据用户的选择实时调整应用的主题色,而不需要重新编译或刷新页面。
3. 安装依赖
在项目中使用 pnpm(或者你也可以使用 npm 或 yarn)来安装这些依赖工具。运行以下命令来安装:
pnpm install @vueuse/core use-element-plus-theme
@vueuse/core是 VueUse 的核心包,包含了实现深色模式和持久化存储所需的工具。use-element-plus-theme是实现 Element Plus 组件主题色动态切换的关键插件。
接下来我们将通过实际代码示例展示如何实现主题切换。
三、实现深色模式切换
深色模式和浅色模式的切换可以通过 VueUse 提供的 useDark 和 useToggle 两个工具函数来实现。
useDark:用于检测和管理深色模式的状态。useToggle:用于在深色模式和浅色模式之间切换。
1. 设置深色模式状态
首先,在代码中使用 useDark 来检测当前是否为深色模式,并通过 useToggle 来切换深色与浅色模式:
import { useDark, useToggle } from '@vueuse/core';const isDark = useDark(); // 检测当前是否为深色模式
const toggleDark = useToggle(isDark); // 用于切换深色和浅色模式
2. 模板中的深色模式切换按钮
在模板中,可以使用一个按钮来切换模式,按钮的文本根据当前模式动态变化,显示“Dark”或“Light”:
<template><el-button type="primary" @click="toggleDark()">{{ isDark ? 'Dark' : 'Light' }}</el-button>
</template>
3. 深色模式的效果展示
使用 useDark 后,我们可以观察到,当深色模式开启时,<html> 标签将会自动添加一个 dark 类名。
这个类名可以通过 CSS 来影响整个页面的样式,使其适配深色模式。你可以使用 dark 类名为页面定义特定的样式规则,如背景颜色、文字颜色等。

经过上面的设置,我们得到以下效果:

四、动态切换主题色
除了深色模式的切换,用户可能还会需要根据个人喜好自定义应用的主题色。比如用户想要主题色为红色或者其他颜色的按钮和菜单栏,为了实现这一功能,我们可以利用 use-element-plus-theme 插件来动态切换 Element Plus 组件库的主题色。
-
首先在代码中引入
use-element-plus-theme并设置默认的主题色:import { useStorage } from '@vueuse/core'; import { useElementPlusTheme } from 'use-element-plus-theme';const layoutThemeColor = useStorage('layout-theme-color', '#243db9'); // 默认主题色 const { changeTheme } = useElementPlusTheme(layoutThemeColor.value); // 初始化主题色useStorage是VueUse提供的一个工具函数,用于在浏览器的localStorage或sessionStorage中存储数据,它会自动同步数据并在页面刷新后恢复。通过
useStorage('key', defaultValue),你可以持久化存储用户的选择,例如主题色,并且这个值是响应式的,页面重新加载时会自动恢复之前保存的数据。useElementPlusTheme则是用于动态修改 Element Plus 组件库的主题色。通过调用
changeTheme(color),你可以实时更改整个应用的主题颜色,使页面组件如按钮、菜单栏等元素的颜色立即生效。 -
在模板中,设置一些不同的颜色方块,用户可以选择并应用新的主题色:
<div style="margin: 10px"><spanv-for="item in themeColors":key="item.themeName":style="{background: item.color,width: '20px',height: '20px',display: 'inline-block',marginRight: '10px',cursor: 'pointer',border: '1px solid #333',borderRadius: '10%',}"@click="changeThemeColor(item.color)"></span></div>这里我们设置一些供用户选择的主题色:
const themeColors = [{ color: '#1b2a47', themeName: '道奇蓝' },{ color: '#722ed1', themeName: '深紫罗兰色' },{ color: '#eb2f96', themeName: '深粉色' },{ color: '#f5222d', themeName: '猩红色' },{ color: '#fa541c', themeName: '橙红色' },{ color: '#13c2c2', themeName: '绿宝石' },{ color: '#52c41a', themeName: '酸橙绿' }, ]; -
在脚本部分,通过
changeThemeColor函数来更新主题色:const changeThemeColor = (color: string) => {layoutThemeColor.value = color; // 保存主题色changeTheme(color); // 修改 Element Plus 组件主题色 }; -
为了更加明显的看到对
elementplus主题色切换的效果,可以在官网上随便复制一段菜单的代码进行测试。到此,一个简单的主题切换已经完成。
在正式的项目开发中,主题色的动态切换功能会非常有用,特别是在需要增强用户体验、提供个性化设置的场景下。以下是一些关键点,说明该功能在项目中的实际应用价值:
-
品牌一致性:项目可能需要根据品牌颜色动态调整整个应用的主题色。通过主题色切换,可以轻松确保界面与品牌风格保持一致,并且根据用户需求快速调整颜色方案。
-
用户个性化定制:某些应用希望给用户提供更大的自由度,允许他们根据个人偏好自定义界面颜色。使用动态主题色切换功能,可以让用户随时调整界面配色,提高用户黏性和满意度。
-
多主题支持:在大型项目中,往往需要支持多种主题(如深色模式、浅色模式,以及不同的颜色方案)。利用动态主题切换可以方便地管理多个主题,并让切换过程平滑且高效。
-
响应式存储:通过
useStorage,用户在切换主题色后,即使刷新页面或重新访问,之前的主题偏好也能自动恢复,增强了体验的连续性。 -
组件库的灵活应用:这种方式不仅适用于 Element Plus,也可以扩展到其他组件库,通过集中化管理主题色,使整个项目更加模块化、灵活且易于维护。
因此,在正式的项目开发中,动态切换主题色功能能够提供更强的品牌表达、提升用户体验,并且能够轻松应对复杂的多主题需求。
五、总结
本文展示了如何使用 Vue 3 和 Element Plus 实现深色模式和主题色的动态切换。通过结合 VueUse 和 use-element-plus-theme,我们能够方便地管理和修改应用的外观,使其更加灵活且用户友好。希望本文能为你在项目中实现个性化主题和深色模式提供参考。
相关文章:
如何在 Vue 3 + Element Plus 项目中实现动态设置主题色以及深色模式切换
🔥 个人主页:空白诗 文章目录 一、引言二、项目依赖和环境配置1. VueUse2. use-element-plus-theme3. 安装依赖 三、实现深色模式切换1. 设置深色模式状态2. 模板中的深色模式切换按钮3. 深色模式的效果展示 四、动态切换主题色五、总结 一、引言 在现代…...
Android 如何实现搜索功能:本地搜索?数据模型如何设计?数据如何展示和保存?
目录 效果图为什么需要搜索功能如何设计搜索本地的功能,如何维护呢?总结 一、效果图 二、为什么需要搜索功能 找一个选项,需要花非常多的时间,并且每次都需要指导客户在哪里,现在只要让他们搜索一下就可以。这也是模…...
【K230 实战项目】气象时钟
【CanMV K230 AI视觉】 气象时钟 功能描述:说明HMDI资源3.5寸屏幕 使用方法 为了方便小伙伴们理解,请查看视频 B站连接 功能描述: 天气信息获取:通过连接到互联网,实时获取天气数据,包括温度、湿度、天气状…...
什么是 HTTP/3?下一代 Web 协议
毫无疑问,发展互联网底层的庞大协议基础设施是一项艰巨的任务。 HTTP 的下一个主要版本基于 QUIC 协议构建,并有望提供更好的性能和更高的安全性。 以下是 Web 应用程序开发人员需要了解的内容。 HTTP/3 的前景与风险 HTTP/3 致力于让互联网对每个人…...
IDEA Project不显示/缺失文件
问题:侧边栏project 模式下缺少部分文件 先点close project 打开项目所在目录,删除目录下的.idea文件夹 重新open project打开这个项目即可解决...
浅谈vue2.0与vue3.0的区别(整理十六点)
目录 1. 实现数据响应式的原理不同 2. 生命周期不同 3. vue 2.0 采用了 option 选项式 API,vue 3.0 采用了 composition 组合式 API 4. 新特性编译宏 5. 父子组件间双向数据绑定 v-model 不同 6. v-for 和 v-if 优先级不同 7. 使用的 diff 算法不同 8. 兄弟组…...
深入理解 MySQL MVCC:多版本并发控制的核心机制
在数据库领域,并发控制是确保多个事务能够正确地并发执行而不破坏数据完整性的关键技术。MySQL 作为广泛使用的关系型数据库管理系统,采用了多版本并发控制(Multi-Version Concurrency Control,MVCC)机制来实现高效的并…...
Qt6编译达梦8数据库驱动插件
一、编译环境 操作系统:deepin V23 Qt版本: Qt 6.7.2 编译器:gcc/g version 12.3.0,cmake 3.28.3 达梦数据库:开发版V8 二、下载达梦QT接口源码 下载链接: https://eco.dameng.com/downlo…...
什么是机器学习力场
机器学习力场(Machine Learning Force Fields, MLFF)方法是一类将机器学习技术应用于分子动力学(Molecular Dynamics, MD)模拟的技术。它通过使用机器学习算法拟合原子之间的相互作用能量和力场,使得在不牺牲精度的前提…...
USB组合设备——串口+鼠标+键盘
文章目录 USB组合设备——串口+鼠标+键盘描述符结构设备描述符配置描述符集合配置描述符接口关联描述符键盘接口描述符鼠标接口描述符类特殊命令CDC 的类特殊命令HID 的类特殊命令接口 2接口3USB组合设备——串口+鼠标+键盘 描述符结构 设备描述符 配置描述符 接口关联描述符…...
python学习——对无人机影像有RGB转换到HSV
问题描述 最近需要对无人机影像中绿色植被信息进行提取,查看相关论文,发现用的比较多的就是HSV色彩转换方法,动手实践一下。 解决思路 #mermaid-svg-5ejGodIusPv6zFVS {font-family:"trebuchet ms",verdana,arial,sans-serif;fon…...
【南方科技大学】CS315 Computer Security 【Lab2 Buffer Overflow】
目录 引言软件要求启动虚拟机环境设置禁用地址空间布局随机化(ASLR)设置编译器标志以禁用安全功能 概述BOF.ctestShellCode.c解释 createBadfile.c 开始利用漏洞在堆栈上查找返回地址 实验2的作业 之前有写过一个 博客,大家可以先看看栈溢出…...
持续集成与持续交付CI/CD
CI/CD 是指持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery) 持续集成(Continuous Integration) 持续集成是一种软件开发实践&…...
C++学习笔记之变量作用域
C学习笔记之变量作用域 https://www.runoob.com/cplusplus/cpp-variable-scope.html 在C程序中,通常有 3 个地方可以声明变量 在函数或者代码块当中,为局部变量在函数的参数定义中,为形式参数在所有函数的外部,为全局变量 作用域…...
解决跨境电商平台账号无法访问的常见问题
跨境电商的迅猛发展,越来越多的卖家选择在全球各大电商平台如亚马逊、eBay等进行商品销售。然而,在实际运营过程中,卖家经常会遇到账号无法访问、应用打不开等问题,导致业务受阻。本文将针对这些问题进行详细分析,并提…...
P2847 [USACO16DEC] Moocast G
P2847 [USACO16DEC] Moocast G [USACO16DEC] Moocast G 题面翻译 Farmer John 的 N N N 头牛 ( 1 ≤ N ≤ 1000 1 \leq N \leq 1000 1≤N≤1000) 为了在他们之间传播信息,想要组织一个"哞哞广播"系统。奶牛们决定去用步话机装备自己而不是在很远的距离…...
针对国内AIGC市场,国内目前出台了那些法律法规?
针对国内AIGC市场,特别是AI生成与合成内容方面,中国已经出台了一系列法律法规来规范其发展和应用。 图片源自“央视新闻” 以下是一些主要的法律法规: 一、国家层面的法律法规 《中华人民共和国网络安全法》 施行时间:2017年6月…...
Windows+Ubuntu双系统下时钟设置
Ubuntu默认把系统时间(硬件时钟)设置为UTC时间,并根据本地时区和夏令时设置自动调整本地时间,这是一种很合理很优雅的处理硬件时钟和本地时钟的模式。而Windows系统是默认情况下把系统时间设置为本地时间,历来独霸电脑…...
一些写leetcode的笔记
标准库中的string类没有实现像C#和Java中string类的split函数,所以想要分割字符串的时候需要我们自己手动实现。但是有了stringstream类就可以很容易的实现,stringstream默认遇到空格、tab、回车换行会停止字节流输出。 #include <sstream> #incl…...
shopify主题开发之template模板解析
在 Shopify 主题开发中,template 文件是核心部分,它们定义了店铺中不同页面的布局和结构。下面将详细介绍 Shopify 主题中的 template 模板。 一、template 文件结构 在 Shopify 主题中,templates 文件夹包含了所有用于生成店铺页面的模板文…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
