【vue3】:主题色解决方案

本文详细介绍了在Vue3应用中修改主题色的解决方案,包括非Element-Plus组件库和Element-Plus组件库的情况。核心思路是通过定义SCSS变量,结合Vuex和本地缓存实现色值的动态更新。对于Element-Plus,文章讲解了如何获取全局CSS样式表,定位并替换特定颜色值,以及利用优先级加载自定义样式。
摘要由CSDN通过智能技术生成

# 主题色修改

# 原理

修改主题色关键点是 色值不能写死。

在该解决方案中,主要涉及的是 element-plus 以及 非 element-plus 的主题色修改。


对于非 element-plus 解决方法如下:

1、全局定义scss变量,页面绑定该变量,通过修改该变量值,从而使页面主题色进行修改。

2、并且该变量要实现响应式,永久保存(避免页面刷新色值被覆盖)。因此需要结合本地缓存以及vuex将值保存好。

3、初始时通过 getters 获取主题色的同时,使用 generateColors 函数生成新的色值表,与 scss色值表 进行匹配替换。


对于 element-plus 解决方案如下:

1、获取当前 element-plus 的所有样式。

2、找到要替换的样式(关键)。

3、把替换后的样式利用style的优先级高于外部引入样式的方式加载样式表。



# 非 element-plus

第一步:定义scss变量文件,结合vuex将其保存到本地缓存中

// variables.scss
$menuBg: #304156;
:export {
   
    menuBg: $menuBg;
}
// module/theme.js
import variable from '@/styles/variables.scss'
export default {
   
  namespaced: true,
  state: () => ({
   
    //  (非 element-plus)
    variable: variable,
    // (element-plus)
    mainColor: getItem("mainColor") || '#304156',  
  }),
  setMainColor (state, newColor) {
   
      //  (非 element-plus)
      state.variable.menuBg = newColor
      // (element-plus)
      state.mainColor = newColor
      // 保存到缓存中
      setItem('mainColor', newColor)
    }  
}  

注:第 8 行 以及 第 15 行代码在修改 非 element-plus 主题色中没有任何作用,设置在这里目的在于避免后面讲修改 element-plus 在来设置显的很突兀。

// index.js
import {
    createStore } from 'vuex'
import theme from './modules/theme.js'
import getters from './getters'
export default createStore({
   
  getters,
  modules: {
   
    theme
  }
})

getItemsetItem分别为通过 key 获取和保存在本地缓存的数据,需自行封装。


第二步:修改主题色

使用element-plus 中的取色器

这一步操作放在最后(小节-最后补充),结合 element-plus 修改主题色在一起写。


第三步:页面初次打开,以及再次打开时,生成新的色值表,并渲染缓存中的颜色

// getters.js
const getters = {
   
    cssVar: state => ({
   
        ...state.theme.variable,
        ...generateColors(getItem('mainColor'))
    })
    // (element-plus)
    mainColor: state => state.theme.mainColor
}

解释:

(1)这里是根据缓存中的主题色,生成新的色值表(generateColors),在跟scss变量文件进行比较替换。

(2)generateColors 具体是如何生成新的色值,请看 element-plus修改主题色的方案 中具体会涉及到,这里简单一笔带过。

(3)同样 第 8 行代码在这里也没有太大作用。


类似于最终要呈现出来的效果为:

cssVar: state => ({
   
    menuBg: '#304156',
    menuBg: 'red',
})

最终通过替换,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你听雪飘过的声音

您的鼓励将是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值