深入理解VUE樣式style層次分析

2022-01-20 11:30:08 字數 2872 閱讀 6409

剛開始使用vue的時候容易被裡面的樣式搞懵:

樣式可以在main.js中引入,在模組js檔案中引入,在元件中的style標籤引入,在元件中的script標籤引入,還可以在index.html的body中引入。

我不禁要問:

1、從不同位置引入的樣式到底是什麼關係?

2、在實際定義樣式時應該定義在哪個位置,以避免樣式產生的衝突?

紙上得來終覺淺,絕知此事要躬行。看十次文件,不如做乙個測試。

新建乙個最簡單的專案並執行:如果你人品沒問題,會看到彈出的瀏覽器中,head標籤內有這樣的style

在專案src目錄中找找看:

第二個style在\src\components\helloworld.vue檔案中

但是我想就開頭出現的問題了解得更深入。為避免多個問題糾纏在一起,我逐個去分析:

1、為方便看到測試的結果,我改造一下專案:

為什麼呢?我們來看看main.js是怎麼定義的:

隨後引入router,router裡引入了helloworld.vue,繼而載入hello.css

而所有元件的style都是script裡的**執行完後再載入。

所以我大致可以得出結論:

樣式從main.js入口開始順序載入,

遇到元件則載入元件中script所引入的樣式,

先處理完所有scipt中的引入,

再處理style,

style按包含關係從外到內載入

但是問題還沒完,我又得出另外的問題:這些頁面都是固定的,如果是非同步載入頁面,當路由切換到另乙個頁面時,此頁面原來的樣式是否會刪除,當前頁面的樣式會新增到**?

2、為此我又再路由中新增了comb.vue,並且使用非同步載入該元件。

點選hello之後,載入hello-style

點選comb之後,非同步載入comb元件,先引入comb-import,再引入comb-style

可以看到,瀏覽器先載入1.js元件檔案,然後執行script載入comb.css,再載入comb.vue的style,而當我切換回coma頁面時,head標籤內的樣式不再有變化。

另外可以看到,當我更改路由使helloworld不在根路徑顯示,helloworld就只載入hello.css,而不會載入helloworld的style,只有helloworld頁面顯示出來時才載入。

3、我再看看如果把helloworld也改成非同步元件會怎麼樣?

可以看到之前第二個載入的hello-import沒有了,然後先點選誰,誰就先載入

所以可以知道:如果coma和comb都是非同步元件,則先開啟哪一頁就載入哪一頁的script和style

再定義乙個combb,在comb中引入,但不顯示,則combb只顯示comb_b.css,但不顯示style

所以:載入順序應再加兩條規則:

非同步元件先顯示的先載入

沒有顯示的頁面或者元件不載入style

4、再看乙個問題:乙個元件內可以定義不止乙個style,並且有scoped的style和沒有scoped的style可以並存,它們會按照所定義的順序載入。

看瀏覽器,按順序載入:

並且我把樣式稍微做了改變,比如先給noscope2加height,發現覆蓋了noscope1的高度;再然後,給.noscope1加上.noscope2,高度又變成50,

也就是說:跟普通css擁有一樣的權重優先機制。

5、再看

寫在body內的樣式

通過main.js控制的樣式都在head標籤中顯示,由此就可以知道,如果我在body內定義樣式,是可以把head標籤內的同名樣式覆蓋掉的。

但要注意的是,在body內引入的樣式,因為已經不在main.js控制範圍內,也就是不參與打包,所以必須定義在static靜態資源目錄內。

同時要注意,在body引入的樣式不在src資料夾內,沒有熱更新的功能,所以每次更改後需要手動重新整理頁面。

6、總結

經過以上的測試,可以得知style出現的順序跟你定義的位置,是否非同步元件,初始狀態是否顯示有關。而樣式的覆蓋又可以通過新增scoped和在body內新增樣式檔案來控制。相信單頁應用要精準控制樣式絕對不是難事。

vue的深入理解

1.vue的初步認識 var data var vm new vue document.write vm.data data true document.write true document.write vm.el document.getelementbyid vue det true new ...

深入理解vue元件

當使用table select等標籤時,元件標籤化可能會有bug,此時應該使用 is 接受元件。在子元件定義data時,data必須是乙個函式,不能是乙個物件。在vue中如果要操作dom,需要使用 ref 引用,從而獲取dom節點。需求 定義乙個子元件,使其數字自加,在父元件中對子元件的數字求和。單...

Vue元件深入理解 插槽

插槽相當於佔位符,用表示 用於父元件填充子元件的資訊 在中間填充內容,則擋傳入的slot中不存在時,則會使用使用填好的內容。type submit submitslot button 父級元件模板不能編譯子元件的變數,因此需要值傳遞。插槽有點類似於父子元件傳值,但傳的不是值,而是傳進去復用的模板 實...