webpack-theme-color-replacer+elementui自定义配置主题色

webpack-theme-color-replacer原理是通过获取到配置数组里的颜色值,在触发换色方法时,elementui使用的颜色值存在与配置表中颜色一致的颜色,则改颜色会被替换成新的颜色值。

若是自定义的css文件,需要配置css文件路径

若是需要修改除主题色外的颜色,则配置颜色数组需传入对应的默认色,在触发修改颜色方法前,通过将主题色的十六进制转为RGBA,然后通过规律加减颜色通道生成其它色,位置需要一一对应

一、安装webpack-theme-color-replacer

复制代码
npm install ---save webpack-theme-color-replacer

二、在vue.config.js配置

javascript 复制代码
const ThemeColorReplacer = require("webpack-theme-color-replacer");
const forElementUI = require("webpack-theme-color-replacer/forElementUI");
const { defineConfig } = require("@vue/cli-service");
module.exports = defineConfig({
  transpileDependencies: true,
  chainWebpack: config => {
    // 自定义换肤
    config
      .plugin("webpack-theme-color-replacer")
      .use(ThemeColorReplacer)
      .tap(options => {
        const matchColors = []
        const data = ['#409eff']//这里可传入多个颜色,后续匹配到的会同步修改
        data.forEach(item => {
          matchColors.push(...forElementUI.getElementUISeries(item))
        })
        options[0] = {
          fileName: "css/theme-colors-[contenthash:8].css",
          matchColors,
          changeSelector: forElementUI.changeSelector,
          //项目其它css文件,存在与主题色一样的颜色也会更改,否则不会改变
          externalCssFiles: ["./src/assets/css/index.css"],
          isJsUgly: process.env.NODE_ENV !== "development"
        };
        return options;
      });
  }
});

三、创建utils/thems.js

javascript 复制代码
import client from "webpack-theme-color-replacer/client";
import forElementUI from "webpack-theme-color-replacer/forElementUI";

export let curColor = "#409eff";

// 动态切换主题色
export function changeThemeColor(newColor) {
  const options = {
    newColors: [...forElementUI.getElementUISeries(newColor)]
  };
  return client.changer.changeColor(options, Promise).then(t => {
    curColor = newColor;
    localStorage.setItem("theme_color", curColor);
  });
}

export function initThemeColor() {
  const savedColor = localStorage.getItem("theme_color");
  if (savedColor) {
    curColor = savedColor;
    changeThemeColor(savedColor);
  }
}

四、组件中使用

javascript 复制代码
 <el-color-picker v-model="mainColor" size="small" @change="changeColor"></el-color-picker>


<script>
import Vue from "vue";
import { ColorPicker } from "element-ui";
import { changeThemeColor, curColor } from "./utils/thems.js";
Vue.use(ColorPicker);
export default {
  name: "App",
  data() {
    return {
      mainColor: curColor
    };
  },
  methods: {
    changeColor(newColor) {
      changeThemeColor(newColor).then(t => {
        console.log("t: ", t);
      });
    }
  }
};
</script>

五、项目加载时,使用上次修改后的主题色

javascript 复制代码
//main.js
import { initThemeColor } from './utils/theme.js'
initThemeColor()
相关推荐
weixin_4277716117 分钟前
css加载顺序导致本地和线上样式不一致
前端·css
漂流瓶jz7 小时前
Webpack如何实现万物皆可import?loader的使用/配置/手写实践
前端·javascript·webpack
ZC跨境爬虫8 小时前
跟着 MDN 学CSS day_41:显式轨道、隐式网格与区域命名放置
前端·javascript·css·ui·交互
修己xj8 小时前
告别手动存图!这款叫 Fatkun 的浏览器插件,简直是素材收集神器
前端
袋鼠云数栈9 小时前
从前端到基础设施,ACOS 如何打通企业全链路可观测
运维·前端·人工智能·数据治理·数据智能
AskHarries9 小时前
系统提示词、开发者指令和用户输入的优先级
java·前端·数据库
Moment10 小时前
长上下文会最终杀死 Rag 吗?
前端·javascript·后端
qcx2310 小时前
【系统学AI】25 论文导读 ①:两篇改变 AI 的开山之作——Attention Is All You Need & ReAct
前端·人工智能·react.js·transformer
kyriewen11 小时前
大文件上传最全指南:分片、断点续传、秒传,一篇就够了
前端·javascript·面试
郑洁文12 小时前
基于Python的Web命令执行漏洞自动化检测系统
前端·python·网络安全·自动化