需求:在現有已經做好的後臺管理系統添加一個切換主題顏色的功能 分析:該項目用了很多uniapp的組件,css樣式沒有統一,類名也沒有統一 使用混合mixin.scss,並使用vuex 效果圖 功能:按鈕背景顏色、部分樣式、字體圖標、分頁跟隨主題顏色變化也變化 每一個用戶喜歡的主題顏色都不一樣,後端已 ...
需求:在現有已經做好的後臺管理系統添加一個切換主題顏色的功能
分析:該項目用了很多uniapp的組件,css樣式沒有統一,類名也沒有統一
使用混合mixin.scss,並使用vuex
效果圖
功能:按鈕背景顏色、部分樣式、字體圖標、分頁跟隨主題顏色變化也變化
每一個用戶喜歡的主題顏色都不一樣,後端已經在用戶數據表加了一個用於存儲主題顏色的欄位預設是1(綠色)
1.先在用戶登錄成功後,把用戶的主題顏色保存在本地存儲中
uni.setStorageSync('theme',data.Theme);//當前用戶的主題配色
2.在vuex添加全局變數
有些人的可能不是這樣的,但是不重要,我們只需要在你們的vuex的 state、mutations、getters、actions添加對應的方法就行,直接上代碼
curThemeType是存放當前用戶的主題顏色的標識符,我這邊後端用1,2,3,4來表示不同顏色,你們也可以不需要寫,
curThemeColor存放的是顏色值,後期是全局的一個顏色值,只需要在用的地方用插值表達式或者字元拼接的方式就行
state: {
//測試變色
curThemeType: 1,
curThemeColor:'',
},
mutations: {
//測試變色
setCurThemeType(state, data) {
state.curThemeType = data;
},
setCurThemeType2(state, data) {
state.curThemeColor = data;
},
},
getters: {
//測試變色
themeType(state) {
return state.curThemeType;
},
//測試變color色
themeType2(state) {
return state.curThemeColor;
}
},
actions: {
handleActionAgree(context, boo) {
context.commit('setCurThemeType', boo)
},
handleActionAgree2(context, boo) {
context.commit('setCurThemeType2', boo)
},
}
3.在存放公共文件里添加一個mixin.js
代碼:
import { mapGetters, mapMutations } from 'vuex';
export default {
install(Vue) {
Vue.mixin({
data() {
return {
};
},
methods: {
...mapMutations(['setCurThemeType','setCurThemeType2']),
},
computed: {
...mapGetters(['themeType','themeType2'])
},
});
}
};
4.然後去入口文件引入
import myMixin from './common/mixin.js'; //--實現換膚 引入 myMixin
Vue.use(myMixin) //實現換膚 調用 myMixin
5.準備工作已經好了,現在去APP.vue裡面判斷用戶上一次使用的主題顏色也就是之前在登錄存在本地存儲的值
代碼:
先在APP.vue引入
//換膚引入
import {mapMutations} from 'vuex';
然後在onLaunch()里去拿本地存儲的值,然後賦予顏色值然後存在vuex,然後就可以使用了
onLaunch: function() {
console.log('App Launch');
const that = this;
//項目啟動獲取緩存中的皮膚
let SwitchNameID = parseInt(uni.getStorageSync('theme')); //當前配色ID
if (SwitchNameID == '') {
SwitchNameID = 1;
}
console.log('當前配色ID', SwitchNameID);
// Vuex
that.setCurThemeType(SwitchNameID);
//用於動態的改變定義在vuex當中的變數,達到動態換膚的效果
that.$store.dispatch('handleActionAgree', SwitchNameID); //存放當前ID
//--------- color色--------------------------
// 背景顏色跟單選多選的顏色
let colorS = '';
if (SwitchNameID == 1) {
colorS = '#7AC463';
} else if (SwitchNameID == 2) {
colorS = '#EFB46F';
} else if (SwitchNameID == 3) {
colorS = '#cf2532';
} else if (SwitchNameID == 4) {
colorS = '#3c9cff';
}
// Vuex
console.log('當前顏色值', colorS);
that.setCurThemeType2(colorS);
//用於動態的改變定義在vuex當中的變數,達到動態換字體顏色換單選多選顏色的效果
that.$store.dispatch('handleActionAgree2', colorS); //存放當前顏色
window.document.documentElement.setAttribute('data-theme', SwitchNameID);
},
6.去頁面使用,使用的方法是在頁面上使用style綁定變數值
1.:style="{ 'background-color': themeType2}"
2.:style="'background-color:' + themeType2" (微信小程式用這種)
themeType2就是一個全局的顏色值,在需要用的地方直接使用就行了
在這裡其實已經可以實現根據後端的值去改變主題顏色了,
7.接下來寫功能.根據自己的需求在對應的地方添加下拉框,或者選擇框,由於我這邊的框架是uniapp而且需要在頂部顯示,我就在對應的文件寫以下的代碼
在你需要的地方的文件加入下拉框(uniapp官網),我這邊的下拉框數據是後端已經寫好的,方便後期維護(你們根據自己的情況來,也可以自己定義下拉框內容)
我的數據長這樣
接下來在這個頁面的created()或者onLoad()里把本地存儲的拿出來存到vuex中
主要代碼:
let SwitchNameID = parseInt(uni.getStorageSync('theme')); //當前配色ID
if (SwitchNameID == '') {
SwitchNameID = 1;
}
// Vuex
that.setCurThemeType(SwitchNameID);
//用於動態的改變定義在vuex當中的變數,達到動態換膚的效果
that.$store.dispatch('handleActionAgree', SwitchNameID);
window.document.documentElement.setAttribute('data-theme', SwitchNameID);
然後寫一個方法,在用戶在下拉框選擇了其他顏色,就是去修改vuex的值,實現切換項目中的主題顏色,然後再去修改資料庫該用戶裡面的值
代碼:
// 配色
ChangeSwitchTopic(e) {
const that = this;
let i = e.detail.value
that.SwitchTopicName = that.SwitchTopicAddList[i].BasicDataName;
let SwitchValue = that.SwitchTopicAddList[i].BasicDataCode;
// 將選中的模式存儲緩存
uni.setStorageSync('theme', parseInt(SwitchValue));
// Vuex
that.setCurThemeType(SwitchValue);
//用於動態的改變定義在vuex當中的變數,達到動態換膚的效果
that.$store.dispatch('handleActionAgree', parseInt(SwitchValue));
// 然後再調用介面去修改當前用戶喜歡的配色,下次就還是這套
let value = uni.getStorageSync("user");
api.get({
url: 'User/SetTheme',
data: {
UserID: value, //登錄的商家用戶ID
LanguageType: that.LanguageTypeId,
Theme: SwitchValue, //配色ID
},
success: data => {
console.log('配色切換', data);
}
});
//--------- color色--------------------------
// 顏色跟單選多選的顏色是在APP.vue跟top-window.vue設置的,如果要添加或者修改,需要修改兩個地方
let colorS = '';
if (SwitchValue == 1) {
colorS = '#7AC463';
} else if (SwitchValue == 2) {
colorS = '#EFB46F';
} else if (SwitchValue == 3) {
colorS = '#cf2532';
} else if (SwitchValue == 4) {
colorS = '#3c9cff';
}
// Vuex
this.setCurThemeType2(colorS);
//用於動態的改變定義在vuex當中的變數,達到動態換字體顏色換單選多選顏色的效果
this.$store.dispatch('handleActionAgree2', colorS);
window.document.documentElement.setAttribute('data-theme', SwitchValue);
},
結束---------
這樣已經可以實現基本切換主題顏色的顏色值了
註意:微信小程式以下方法不可用
但是那些用了uniapp組件的沒辦法直接在頁面上修改,就只能再添加一個混合了(mixin.scss)
1.再創建一個mixin.scss
代碼:
// 想要在css用,需要先在uni.scss里引入
// 添加或者修改,需要在uni.scss里添加或者修改
// @include ft_color($bj-color-theme1);
// @include bg_color($bj-color-theme1);
// $bj-color-theme1 是在uni.scss里定義的顏色,data-theme會判斷當前是什麼值用對應的顏色
//該方法針對uniapp原生組件無法在view視圖直接修改,要操作css樣式修改的
@mixin bg_color($color) { //更換背景
background-color: $color ;
[data-theme = "1"] & {
background-color: $bj-color-theme1 !important;
}
[data-theme = "2"] & {
background-color: $bj-color-theme2 !important;
}
[data-theme = "3"] & {
background-color: $bj-color-theme3 !important;
}
[data-theme = "4"] & {
background-color: $bj-color-theme4 !important;
}
}
@mixin ft_color($color) { //更換文字顏色
color: $color;
[data-theme = "1"] & {
color: $bj-color-theme1 !important;;
}
[data-theme = '2'] & {
color: $bj-color-theme2 !important;;
}
[data-theme = "3"] & {
color: $bj-color-theme3 !important;;
}
[data-theme = '4'] & {
color: $bj-color-theme4 !important;;
}
}
然後去uni.scss引入並且定義初始顏色
@import '@/common/mixin.scss';//引入混入背景
/*
切記一定要在 uni.scss 預載入文件中 引入 自定義的 mixin.scss 並設置皮膚色
*/
$bj-color-theme1: #7AC463; //背景主題顏色預設(綠色)
$bj-color-theme2: #EFB46F; //背景主題顏色1(黃色)
$bj-color-theme3: #cf2532; //背景主題顏色2(紅色)
$bj-color-theme4: #3c9cff; //背景主題顏色3(藍色)
2.再去APP.vue修改組件顏色,F12找到對應的類名,然後修改
<style lang="scss">
//時間選擇器選中顏色
.uni-calendar-item--multiple .uni-calendar-item--before-checked,
.uni-calendar-item--multiple .uni-calendar-item--after-checked,
.uni-calendar-item__weeks-box .uni-calendar-item--checked,
.uni-datetime-picker--btn,
{
@include bg_color($bj-color-theme1);
}
//時間選擇器選中顏色 -- 確定按鈕
.confirm-text{
@include ft_color($bj-color-theme1);
}
</style>
效果;
這是我的工作中實現的,有很多不足,還需要努力,供大家參考,網上還有很多方式,根據自己的需求來修改