删除线格式 @TOC
最近的一个后台管理项目有主题更换需求,无奈自己不会只好查阅各种文档以及各种教程,现将实现过程记录下来!
本项目采用的是预置几套固定的主题供用户自行更换,首先保存一套默认主题,将主题名保存在vuex中,主题切换页面监听vuex中主题名的变化,然后再给body切换相应的类名!
代码如下(示例):
npm i element-ui -S
npm install --save-dev sass-loader
npm install --save-dev node-sass
npm i element-theme -g
npm i element-theme-chalk -D
et -i element-variables.scss
提示:这句命令执行完有可能报错,ReferenceError: primordials is not defined,如报这种错执行以下命令即可
npm i element-themex -g
此时根目录生成element-variables.scss文件
第五步执行完毕更换好自己想要的主题色之后命令行执行et命令开始编译自己的主题,编译完成之后在主目录下会生成theme的文件夹
import '../theme/index.css'
npm install gulp
npm install gulp-clean-css
npm install gulp-css-wrap
// gulpfile.js
var path = require('path')
var gulp = require('gulp')
var cleanCSS = require('gulp-clean-css')
var cssWrap = require('gulp-css-wrap')
gulp.task('css-wrap', function () {
return gulp.src(path.resolve('./theme/index.css'))
/* 找需要添加命名空间的css文件,支持正则表达式 */
.pipe(cssWrap({
selector: '.custom-yellow' /* 添加的命名空间custom-后面跟上自己设置的主题颜色值 */
}))
.pipe(cleanCSS())
.pipe(gulp.dest('src/assets/css/theme/yellow')) /* 存放的目录 */
})
gulp css-wrap
然后在gulpfile.js设置的生成目录下就可以找到主题文件了,此时文件夹下没有fonts文件夹,把根目录下theme文件夹里面的fonts复制到此处即可
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
state:{
themecolor:'yellow'//默认为yellow主题
},
mutations:{
//更新主题颜色
setThemeColor(state,curcolor){
this.state.themecolor = curcolor;
}
}
});
export default store;
在main.js引入store和默认主题文件
import store from './store';
import './assets/css/theme/red/index.css';
// 换肤加class函数
export function toggleClass(element, className) {
if (!element || !className) {
return;
}
element.className = className;
}
13.在颜色切换页面的代码
<template>
<div id="app">
<div id="nav">
//添加一个按钮查看效果
<el-button type="primary">主要按钮</el-button>
// 主题切换select下拉框
<el-select v-model="themeColor" placeholder="请选择">
<el-option label="红色主题" value="red"> </el-option>
<el-option label="黄色主题" value="yellow"> </el-option>
</el-select>
</div>
<router-view />
</div>
</template>
<script>
import {
toggleClass } from './utils'
export default {
data () {
return {
classH2: 'custome-000000'
}
},
mounted () {
toggleClass(document.body, 'custom-' + this.themeColor)
let curcolor = this.$store.state.themcolor
this.classH2 = 'custome-' + curcolor
},
computed: {
themeColor: {
get () {
return this.$store.state.themecolor
},
set (val) {
this.$store.commit('setThemeColor', val)
}
}
},
watch: {
// 监听store中主题颜色变化
themeColor: {
handler () {
toggleClass(document.body, 'custom-' + this.themeColor)
}
}
}
}
</script>
如果后续想继续增加多套主题的话只需继续执行5→6→9(只需gulpfile.js更改命名空间值和生成的文件名即可!)→10步骤即可生成,小伙伴们快去试试吧!