標籤:

vue scoped 穿透vue 修改內部組件樣式

vue scoped 穿透vue 修改內部組件樣式

來自專欄前端MVVM三劍客

樣式的模塊化

在vue文件中的style標籤上,有一個特殊的屬性:scoped。當一個style標籤擁有scoped屬性時,它的CSS樣式就只能作用於當前的組件,也就是說,該樣式只能適用於當前組件元素。通過該屬性,可以使得組件之間的樣式不互相污染。如果一個項目中的所有style標籤全部加上了scoped,相當於實現了樣式的模塊化。

scoped的實現原理

vue中的scoped屬性的效果主要通過PostCSS轉譯實現,如下是轉譯前的vue代碼:

<style scoped>.aa { color: red;}</style> <template> <div class="aa">hi</div></template>

轉譯後:

<style>.aa[data-v-255588312333a] { color: red;}</style> <template> <div class="aa" data-v-255588312333a>hi</div></template>

為什麼需要穿透scoped?

scoped看起來很美,但是,在很多項目中,會出現這麼一種情況,即:引用了第三方組件,比如,taro-ui , element-ui, iview等等 需要在組件中局部修改第三方組件的樣式,而又不想去除scoped屬性造成組件之間的樣式污染。此時只能通過特殊的方式,穿透scoped。

<style scoped> 外層 >>> 第三方組件 { 樣式 }</style>

通過 >>> 可以使得在使用scoped屬性的情況下,穿透scoped,修改其他引入組件的值

多個style解決問題

即在定義一個含有scoped屬性的style標籤之外,再定義一個不含有scoped屬性的style標籤,即在一個vue組件中定義一個全局的style標籤,一個含有作用域的style標籤:

此時,你只需要將修改第三方樣式的css寫在第一個style中即可。

<style>/* global styles */</style> <style scoped>/* local styles */</style>

不使用scoped時

當然,我們可以在引入每個組件的外層DOM上添加一個CLASS樣式,來鎖定每一個組件的樣式作用域。也類似於scoped的效果。又方便修改各種第三方組件的樣式

總結:

方法一:

穿透方法實際上違反了scoped屬性的使用意義

方法二:

也一樣違反了scoped屬性的使用意義

推薦閱讀:

redux-saga v1.0.0-beta.2 發布日誌
React 16+版本中為什麼用更新生命周期函數?
BEM作者Vitaly確認出席React會議,並發表主題演講
如何評價阿里巴巴飛冰(ICE)的 GUI 構建工具 ICEWORKS ?
[譯] 你可能不需要 Derived State

TAG:React | 組件 | Vuex |