vue3后台管理框架geeker admin -- ThemeDrawer 大标题全局主题 代码分析

0 环境

1 参考文档

geeker admin官方文档

element-plus官方文档

vue router官方文档

useUserStore

mitt

ThemeDrawer/index.vue

ThemeDrawer/index.scss

2 前言

主要是围绕ThemeDrawer/index.vue里的全局主题,就是主题颜色、暗黑模式、灰色模式、色弱模式,如下图,这四种模式关联事件,changePrimary、暗黑模式有点特殊,看上去它是一个组件,但你点进SwitchDark组件进入,其本质还是触发了switchDark,只不过多了层封装罢了。灰色模式和色弱模式用的是changeGreyOrWeak,下面的正文就是分析这三个。

3 正文

1 changePrimary

先看ThemeDrawer/index.vue中的changePrimary,它是为了修改主题颜色,就是选中个颜色,它是个十六进制,然后点击确定。

具体代码如下: <el-color-picker v-model="primary" :predefine="colorList" @change="changePrimary" />

这里的primary它是来自于useGlobalStore,点进useGlobalStore,你会看到primary: DEFAULT_PRIMARY,,它有一个默认颜色,点进DEFAULT_PRIMARY,它的默认值是#009688,是不是就对应上图了那个十六进制的值了,不喜欢默认色的,可以在这里的进行修改。

changePrimary是怎么做到颜色的转换的呢,点进changePrimary,代码如下图:

没有值的情况下,就是默认值。然后设置style属性,将val的值传给--el-color-primary

--el-color-primary-dark-2这里是需要判断的,这里isDark.value其实是跟暗黑模式有关,假如开启了暗黑模式,调用getLightColor,否则调用getDarkColor。看看它俩做了些什么,getLightColor是变浅颜色值,如下图代码:

比如getLightColor(val, 0.2),先判断是不是十六进制,hexToRgb将十六进制转RGB(比如#FFB6C1被转成255,182,193),如下第二张图代码,是否是十六进制的判断,去掉#,剩余的两两字符切割,然后转成数字替换,返回hexs数组。

然后for循环,Math.round计算,这里是一个亮度级别计算(第二个入参),将最终结果在转成十六进制。rgbToHex看下面第三张图片的代码,目的就是rgb转十六进制,先判断rgb格式对不,然后转成十六进制,最后连一起返回。getDarkColor类似就不再重复了。

回到changePrimary实现上去,这里加了--el-color-primary-light1、2...数字的属性,颜色对应不同的亮度级别。

ini 复制代码
for (let i = 1; i <= 9; i++) {
      const primaryColor = isDark.value ? `${getDarkColor(val, i / 10)}` : `${getLightColor(val, i / 10)}`;
      document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, primaryColor);
    }

primary的值更新到globalStore上。

2 SwitchDark组件

ThemeDrawer/index.vue中找到SwitchDark组件,点进去,代码如下图:

也是开关按钮,绑定的是globalStore里的isDark,它的初始值是falseinline-prompt :active-icon="Sunny" :inactive-icon="Moon",将这两个图标放在开关中。点进switchDark,代码如下图:

isDark为真,html中加入类名为dark,否则为空。对应的dark的scss在src/styles/element-dark.scss中`。

代码如下图:

这里主要针对登录页的暗黑配置。

changePrimary主题色受到影响的是--el-color-primary-dark-2--el-color-primary-light-数字setAsideTheme、setHeaderTheme、setMenuTheme都它们的type"dark"。得到xxxTheme里对应Theme的值。具体它们在哪里被引用,不用多说了。

3 changeGreyOrWeak

灰色模式和色弱模式共用changeGreyOrWeak,解释一个就可以了。在ThemeDrawer/index.vue中找到<el-switch v-model="isGrey" @change="changeGreyOrWeak('grey', !!$event)" />,全局绑定的是isGrey,默认是falsechangeGreyOrWeak('grey', !!$event)这里的第二个参数是一个布尔值,这个布尔值是通过对$event进行逻辑非(!!)运算得到的,也就是对应的value: boolean,看下图代码实现的入参。

下图:

value为假时,移除style,看下面第二张图,body.setAttribute根据type的类型传给style。最后的代码意思就是灰色和弱色模式互斥。

4 总结

修改主题颜色,其实和之前的类似,往style里加入或更新值。这里有点特殊的是getLightColorgetDarkColor的实现,先将十六进制转成rgb,与level相运算后,在转成十六进制。暗黑模式设置的.dark,改变的是登录页的模式,但是主页内容是由changePrimary、setAsideTheme、setHeaderTheme以及它们里的setMenuTheme,目的是拿到xxxTheme对应的dark的值,通过值来改变页面的。灰色和弱色模式,它俩互斥,没有太多的修改就是body style里塞入一行css,不存在value就移除style

相关推荐
运维阿江3 分钟前
【小白学HTML5】盒模型_第一讲
前端·html·html5
码界领航16 分钟前
【2025最新版】Chrome谷歌浏览器如何能恢复到之前的旧版本
前端·chrome
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS个人博客系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
乐多_L1 小时前
使用vue3框架vue-next-admin导出表格excel(带图片)
前端·javascript·vue.js
初尘屿风1 小时前
基于微信小程序的电影院订票选座系统的设计与实现,SSM+Vue+毕业论文+开题报告+任务书+指导搭建视频
vue.js·微信小程序·小程序
南望无一1 小时前
React Native 0.70.x如何从本地安卓源码(ReactAndroid)构建
前端·react native
Mike_188702783511 小时前
1688代采下单API接口使用指南:实现商品采集与自动化下单
前端·python·自动化
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS打卡健康评测系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
鲨鱼辣椒️面1 小时前
HTML视口动画
前端·html
一小路一1 小时前
Go Web 开发基础:从入门到实战
服务器·前端·后端·面试·golang