基本信息
文件名称:Vue+ElementUI实现动态更换任意主题色(动态换肤)的全过程.docx
文件大小:20.39 KB
总页数:10 页
更新时间:2025-05-21
总字数:约8千字
文档摘要

Vue+ElementUI实现动态更换任意主题色(动态换肤)的全过程

目录前言vue-element-admin官方实现的方式参考文档:webpack-theme-color-replacer插件的实现方式总结

前言

最近基于ElementUI的项目上需要实现动态换肤的功能,这里提供两种方式:

vue-element-admin官方实现的方式webpack-theme-color-replacer插件的实现方式

vue-element-admin官方实现的方式

简单说明一下它的原理:element-ui2.0版本之后所有的样式都是基于SCSS编写的,所有的颜色都是基于几个基础颜色变量来设置的,所以就不难实现动态换肤了,只要找到那几个颜色变量修改它就可以了。首先我们需要拿到通过package.json拿到element-ui的版本号,根据该版本号去请求相应的样式。拿到样式之后将样色,通过正则匹配和替换,将颜色变量替换成你需要的,之后动态添加style标签来覆盖原有的css样式。

1、这里无脑参考vue-element-admin的源码,首先现在styles文件夹下创建一个名为element-variables.scss文件,并在main.js中引入该文件。

/*src/styles/element-variables.scss*/

/*改变主题色变量*/

$--color-primary:#256DCB;

$--color-success:#7AC800;

$--color-danger:#EC4242;

$--color-info:#999999;

/*改变icon字体路径变量,必需*/

$--font-path:~element-ui/lib/theme-chalk/fonts;

@import~element-ui/packages/theme-chalk/src/index;

/*如遇到导出的变量值为undefined则本文件名需要改成element-variables.module.scss*/

:export{

theme:$--color-primary

/*main.js*/

importVuefromvue

importElementfromelement-ui

import./element-variables.scss

Vue.use(Element)

2、通过以上方式已经能够实现ElementUI主题替换了,但是想要做到自定义颜色还是远远不够的,考虑到主题色在整个项目中都有应用,所以我们将它存到Vuex中,接下来要做的就是在store/modules下新建settings.js。

/*src/store/modules/settings.js*/

importvariablesfrom@/styles/element-variables.module.scss

import*asTypesfrom../mutation-types

conststate={

theme:variables.theme

constmutations={

CHANGE_SETTING:(state,{key,value})={

localStorage.setItem(theme,value)//缓存起来,刷新的时候重新取用

//eslint-disable-next-lineno-prototype-builtins

if(state.hasOwnProperty(key)){

state[key]=value

constactions={

changeSetting({commit},data){

commit(CHANGE_SETTING,data)

exportdefault{

namespaced:true,

state,

mutations,

actions

3、这一步也是无脑copyvue-element-admin的源码,新建一个名为ThemePicker的组件,代码如下:

/*src/components/ThemePicker/index.vue*/

template

el-color-picker

v-model=theme

:predefine=[#256DCB,#409EFF,#1890ff,#304