如何在 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 文件夹包含了所有用于生成店铺页面的模板文…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
