elementUI及vuetifyjs動態換色實踐

lmr發表於2018-12-23

前言

背景 :

1.專案中,需要通過一個後臺系統操作配色,為另一個系統實現配色; 2.專案開發使用的ui是elementUI。

目的 :

使用elementUI實現系統的動態更改主題色。

功能分析

調研了vuetifyjs的主題色實現方案及elementUI官方實現的更換主題色的方案。把兩者結合到一起,實現我們系統需要的配色功能。

下面分別介紹一下兩者配色方案的實現:

vuetifyjs

首先,去看了它的線上主題色生成器,

image
更換顏色時候,主要是紅色框出裡面的css程式碼發生了改變。

接著,看了其實現配色的核心原始碼部分**,得出結論:核心css程式碼是動態生成的**。

程式碼分析:

流程如下:

第一步,初始化的時候,根據配置的主題色,生成主題色的css樣式

在vue的生命週期created階段:呼叫核心方法 genStyle()和applyTheme();

genStyle方法:生成一個id="vuetify-theme-stylesheet"style標籤,並插入到dom結構中。

applyTheme方法:將主題色樣式放到id="vuetify-theme-stylesheet"的style標籤中。

image
image

可以看出,applyTheme()方法依賴“generatedStyles”,

第二步:watch了“generatedStyles”,generatedStyles一旦發生改變,則會呼叫applyTheme()方法,將id為"vuetify-theme-stylesheet"的style標籤內容實現更換。

image

第三步:檢視generatedStyles這個計算屬性,可以看出其主要依賴parsedTheme這個計算屬性,而發生改變。

image

parsedTheme獲取的是主題色值;

當更改主題色的時候,parsedTheme發生改變; generatedStyles計算屬性就也會隨之改變,然後呼叫genBaseColor()方法(此方法主要就是生成style標籤裡面的內容) watch監測到“generatedStyles”發生了改變,就會呼叫applyTheme(),將“genBaseColor()”方法生成的css放入到style標籤內,主色系就發生了變化。

image

image

看下面這個圖,基本上就是其依賴關係,及發生改變時的呼叫

image

elementUI動態換膚

Element官網提供了自定義主題的方案,同時也提供了一個線上自定義主題的demo

下面是demo實現動態換膚的思路:

image
圖片來自:github.com/ElemeFE/ele…

下載了官網的Demo之後,進行了一些優化(適合我們專案)。

主要如下: 將樣式檔案放到本地;只保留涉及到顏色的樣式css。不需要全部的css(體力活,有點耗時)

優點:

1.不需要去請求element的樣式檔案;

2.第一次初始化的時候,系統就會很快的根據配色去替換調相應的顏色程式碼。 而不會讓使用者發現顏色的變化(藍色-->綠色),採用本地的方式替換,使用者看到的就是綠色。

自定義顏色Demo

github.com/merrylmr/el…

相關文件

github.com/ElemeFE/ele… panjiachen.github.io/vue-element…

相關文章