基于Vue2.0和Typescript實(shí)現(xiàn)多主題切換的示例
之前在項(xiàng)目中用了Sass的多主題切換,感覺太麻煩,后面發(fā)現(xiàn)直接用CSS的很方便,所以整理一下,希望可以幫到大家,也是對(duì)自己的積累。
第一步: 需要?jiǎng)?chuàng)建一個(gè)colorConfig.ts文件,用于配置主題信息 (我創(chuàng)建的目錄是src/config/colorConfig.ts)
colorConfig.ts文件的主要定義的內(nèi)容
/**
* 全局顏色配置項(xiàng),換膚配置
* 主題名稱theme1以及對(duì)應(yīng)的顏色名稱color1后面根據(jù)實(shí)際主題名和顏色名進(jìn)行修改
* 主題名稱和顏色名稱可以實(shí)際情況定義
*/
const COLOR_MAP = {
// 第一套主題顏色
theme1: {
color1: '#FFCDD2', // 主要背景
color2: '#E1BEE7', // 文字顏色
color3: '#70767f', // 按鈕顏色(灰色)
color4: '#EF9A9A',
color5: '#F06292', //彈框背景灰色
color6: '#7986CB', //主要內(nèi)容區(qū)域背景
color7: '#64B5F6', //選中狀態(tài)
},
// 第二套主題顏色
theme2: {
color1: '#FF7043', // 主要背景
color2: '#4E342E', // 文字顏色
color3: '#263238', // 按鈕顏色(灰色)
color4: '#FF6E40',
color5: '#DD2C00', //彈框背景灰色
color6: '#616161', //主要內(nèi)容區(qū)域背景
color7: '#212121', //選中狀態(tài)
},
// 第三套主題顏色
theme3: {
color1: '#E65100', // 主要背景
color2: '#FF6D00', // 文字顏色
color3: '#1B5E20', // 按鈕顏色(灰色)
color4: '#827717',
color5: '#00C853', //彈框背景灰色
color6: '#0091EA', //主要內(nèi)容區(qū)域背景
color7: '#00BFA5', //選中狀態(tài)
}
}
/**
* 類型定義
* 定義COLOR_MAP中的主題類型,及每個(gè)主題中顏色值的類型
*/
export type THEME_TYPE = keyof (typeof COLOR_MAP)
type THEME_ITEM = keyof (typeof COLOR_MAP['theme1'])
/**
* 主題切換
* @param theme 主題,默認(rèn)使用主題一
*/
export function changeTheme (theme: THEME_TYPE = 'theme1'): void {
const themeList = Object.keys(COLOR_MAP[theme]) as THEME_ITEM[]
themeList.forEach((v: THEME_ITEM) => {
document.body.style.setProperty(`--${v}`, COLOR_MAP[theme][v])
})
}第二步,根據(jù)接口獲取當(dāng)前主題信息,并進(jìn)行切換設(shè)置
// 在App.vue中引入主題模塊
import { changeTheme } from '@/config/colorConfig'
// 在created讀取緩存信息
created () {
const theme = localStorage.getItem('theme') || 'theme1'
// 將主題獲取到的主題存到vuex中,記錄當(dāng)前的主題信息,默認(rèn)主題一 theme1
store.commit('common/setTheme', theme)
changeTheme(theme)
// 如果主題信息存儲(chǔ)在后端,此時(shí)需要獲取主題信息 (不建議使用)
getThemeInfo()
}
/**
* 主題信息也可以存儲(chǔ)在后端,定義獲取后臺(tái)存儲(chǔ)的主題信息的方法(不過不建議后端存主題信息,直接 localstorage就夠了,還能防止主題閃屏問題)
*/
async getThemeInfo() {
// 入?yún)?
const requestData = {
method: 'xxxx',
params: { method: 'xxx' }
}
const response = await this.$axios({
method: 'POST',
url: `${this.$baseUrl}/xxxx/xxxx/`,
data: requestData
}).catch(() => {
// 接口響應(yīng)失敗默認(rèn)主題一
store.commit('common/setTheme', 'theme1')
changeTheme('theme1')
})
let { code, data } = response?.data || {}
// 根據(jù)code碼獲取接口響應(yīng)狀態(tài)
if (code === '0000') {
const theme = data?.theme
// 將主題獲取到的主題存到vuex中,記錄當(dāng)前的主題信息,默認(rèn)主題一 theme1
store.commit('common/setTheme', theme ? theme : 'theme1')
changeTheme(theme ? theme : 'theme1')
} else {
// 接口響應(yīng)失敗默認(rèn)主題一
store.commit('common/setTheme', 'theme1')
changeTheme('theme1')
}
}第三步,切換主題時(shí),更新緩存
import { changeTheme, THEME_TYPE } from '@/config/colorConfig'
// 主題切換
themeChange(themeVal): void {
changeTheme(themeVal as THEME_TYPE)
store.commit('common/setTheme', themeVal)
// 存儲(chǔ)到緩存中
localStorage.setItem('theme', themeVal)
// 也可以通過接口調(diào)用將themeVal,保存到后端
}第四步, 頁面上使用css變量來動(dòng)態(tài)展示顏色值
/*例如var(--color1)*/
#app {
width: 100%;
height: 100%;
background-color: var(--color1);
box-sizing: border-box;
color: var(--color2);
font-size: 1rem;
}效果圖如下圖所示



到此這篇關(guān)于基于Vue2.0和Typescript實(shí)現(xiàn)多主題切換的示例的文章就介紹到這了,更多相關(guān)Vue Typescript多主題切換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3.0利用vue-grid-layout插件實(shí)現(xiàn)拖拽布局
這篇文章主要介紹了Vue3.0利用vue-grid-layout插件實(shí)現(xiàn)拖拽布局,工作中難免遇到需要對(duì)頁面布局進(jìn)行拖拽然后改變布局,保存布局,下面文章就圍繞Vue3.0利用vue-grid-layout插件實(shí)現(xiàn)拖拽布局的相關(guān)資料展開詳細(xì)內(nèi)容,需要的朋友可以參考一下2021-11-11
vue圖片加載失敗時(shí)用默認(rèn)圖片替換的方法
這篇文章主要給大家介紹了關(guān)于vue圖片加載失敗時(shí)用默認(rèn)圖片替換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Vuex數(shù)據(jù)持久化實(shí)現(xiàn)的思路與代碼
Vuex數(shù)據(jù)持久化可以很好的解決全局狀態(tài)管理,當(dāng)刷新后數(shù)據(jù)會(huì)消失,這是我們不愿意看到的。這篇文章主要給大家介紹了關(guān)于Vuex數(shù)據(jù)持久化實(shí)現(xiàn)的思路與代碼,需要的朋友可以參考下2021-05-05
vue vite之LogicFlow安裝核心依賴及項(xiàng)目初始化詳解
這篇文章主要為大家介紹了vue vite之LogicFlow安裝核心依賴及項(xiàng)目初始化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
vue項(xiàng)目中使用mapbox地圖切換底圖的詳細(xì)教程
最近開始入坑前端mapbox地圖,跟大家一起慢慢深入學(xué)習(xí),下面這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目中使用mapbox地圖切換底圖的詳細(xì)教程,文中給出了詳細(xì)的實(shí)例代碼,需要的朋友可以參考下2023-04-04
利用Vue3實(shí)現(xiàn)一個(gè)可以用js調(diào)用的組件
最近遇到個(gè)功能要求,想要在全局中調(diào)用組件,而且要在某些js文件內(nèi)調(diào)用,所以這篇文章主要給大家介紹了關(guān)于如何利用Vue3實(shí)現(xiàn)一個(gè)可以用js調(diào)用的組件的相關(guān)資料,需要的朋友可以參考下2021-08-08

