vue中的scoped底層怎么實(shí)現(xiàn)的,為何慎用

scoped的作用:

在vue組件中,為了使樣式私有化(模塊化)糠涛,不對(duì)全局造成污染,可以在 style 標(biāo)簽上添加scoped 屬性以表示它的只屬于當(dāng)下的模塊兼犯,這是一個(gè)非常好的舉措忍捡,但是為什么要慎用呢集漾?因?yàn)樵谖覀冃枰薷墓步M件(三方庫(kù)或者項(xiàng)目定制的組件)的樣式的時(shí)候,scoped 往往會(huì)造成更多的困難砸脊,需要增加額外的復(fù)雜度具篇。

scoped 實(shí)現(xiàn)樣式私有化原理

通過(guò)查看 DOM 結(jié)構(gòu)發(fā)現(xiàn):vue 通過(guò)在 DOM 結(jié)構(gòu)以及 css 樣式上加唯一不重復(fù)的標(biāo)記,以保證唯一凌埂,達(dá)到樣式私有化模塊化的目的驱显。
注意:當(dāng) <style> 標(biāo)簽有 scoped 屬性時(shí),它的 CSS 只作用于當(dāng)前組件中的元素瞳抓。這類(lèi)似于 Shadow DOM 中的樣式封裝埃疫。它有一些注意事項(xiàng),但不需要任何 polyfill孩哑。它通過(guò)使用 PostCSS 來(lái)實(shí)現(xiàn)以下轉(zhuǎn)換:
轉(zhuǎn)換之前

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

轉(zhuǎn)換之后

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

為何慎用

從上面可以看出栓霜,添加了 scoped 屬性的組件,為了達(dá)到組件樣式模塊化横蜒,做了兩個(gè)處理:

  • 給 HTML 的 DOM 節(jié)點(diǎn)加一個(gè)不重復(fù) data 屬性(形如:data-v-2311c06a )來(lái)表示他的唯一性
  • 在每句 css 選擇器的末尾(編譯后生成的 css 語(yǔ)句)加一個(gè)當(dāng)前組件的 data 屬性選擇器(如[data-v-2311c06a])來(lái)私有化樣式胳蛮。

我們都知道 css 選擇器有優(yōu)先級(jí),scoped 的這一波操作丛晌,雖然實(shí)現(xiàn)了組件樣式模塊化的目的仅炊,但是每個(gè)樣式的權(quán)重加重了,這意味著若要修改這個(gè)樣式澎蛛,需要更高的權(quán)重去覆蓋這個(gè)樣式茂洒。這是增加復(fù)雜度的其中一個(gè)維度。

深度作用選擇器

如果你希望 scoped 樣式中的一個(gè)選擇器能夠作用得“更深”瓶竭,例如影響子組件,你可以使用 >>> 操作符:

<style scoped>
  .a >>> .b { /* ... */ }
</style>

上述代碼將會(huì)編譯成:

.a[data-v-f3f3eg9] .b { /* ... */ }

有些像 Sass 之類(lèi)的預(yù)處理器無(wú)法正確解析 >>>渠羞。這種情況下你可以使用 /deep/ 操作符取而代之——這是一個(gè) >>> 的別名斤贰,同樣可以正常工作。
eg:

<style scoped>
  .q-tab /deep/ ul {
      padding-top: 20px;
  }
</style>

總結(jié)scoped的渲染規(guī)則

  • 給 HTML 的 DOM 節(jié)點(diǎn)加一個(gè)不重復(fù) data 屬性(形如:data-v-2311c06a)來(lái)表示他的唯一性
  • 在每句 css 選擇器的末尾(編譯后的生成的 css 語(yǔ)句)加一個(gè)當(dāng)前組件的 data 屬性選擇器(如 [data-v-2311c06a] )來(lái)私有化樣式
  • 如果組件內(nèi)部包含有其他組件次询,只會(huì)給其他組件的最外層標(biāo)簽加上當(dāng)前組件的data屬性:
  1荧恍、當(dāng)父組件樣式為scoped,且子組件樣式也為scoped屯吊,父組件會(huì)給子組件的最外層標(biāo)簽加上
    當(dāng)前組件的data屬性送巡,在父組件中只能修改子組件根標(biāo)簽的樣式,重寫(xiě)不了組件內(nèi)部的樣式盒卸,
    可以使用`深度作用選擇器`骗爆。
  2、當(dāng)父組件樣式為全局樣式蔽介,且子組件樣式為scoped摘投,或者煮寡,父子組件均為全局組件,
    父組件內(nèi)可以修改子組件的樣式犀呼,比權(quán)重幸撕。

總結(jié):當(dāng) <style> 標(biāo)簽有 scoped 屬性時(shí),該組件的樣式是私有樣式外臂,只作用于該組件不影響其他組件(尤大大)坐儿。

推薦方案

混用本地和全局樣式
你可以在一個(gè)組件中同時(shí)使用有 scoped 和非 scoped 樣式:

<style>
/*全局樣式*/
</style>

<style scoped>
/*本地樣式*/
</style>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宋光,隨后出現(xiàn)的幾起案子貌矿,更是在濱河造成了極大的恐慌,老刑警劉巖跃须,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件站叼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡菇民,警方通過(guò)查閱死者的電腦和手機(jī)尽楔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)第练,“玉大人阔馋,你說(shuō)我怎么就攤上這事〗刻停” “怎么了呕寝?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)婴梧。 經(jīng)常有香客問(wèn)我下梢,道長(zhǎng),這世上最難降的妖魔是什么塞蹭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任孽江,我火速辦了婚禮,結(jié)果婚禮上番电,老公的妹妹穿的比我還像新娘岗屏。我一直安慰自己,他們只是感情好漱办,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布这刷。 她就那樣靜靜地躺著,像睡著了一般娩井。 火紅的嫁衣襯著肌膚如雪暇屋。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天撞牢,我揣著相機(jī)與錄音率碾,去河邊找鬼叔营。 笑死,一個(gè)胖子當(dāng)著我的面吹牛所宰,可吹牛的內(nèi)容都是我干的绒尊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼仔粥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼婴谱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起躯泰,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谭羔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后麦向,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瘟裸,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年诵竭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了话告。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卵慰,死狀恐怖沙郭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裳朋,我是刑警寧澤病线,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站鲤嫡,受9級(jí)特大地震影響送挑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜暖眼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一让虐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧罢荡,春花似錦、人聲如沸对扶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浪南。三九已至笼才,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間络凿,已是汗流浹背骡送。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工昂羡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摔踱。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓虐先,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親派敷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛹批,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 本文發(fā)布在我的博客vue中慎用style的scoped屬性許可協(xié)議: 署名-非商業(yè)性使用-禁止演繹4.0國(guó)際 ...
    2ue閱讀 9,052評(píng)論 2 7
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)篮愉。 注意:講述HT...
    kismetajun閱讀 27,422評(píng)論 1 45
  • 前端開(kāi)發(fā)面試題 面試題目: 根據(jù)你的等級(jí)和職位的變化腐芍,入門(mén)級(jí)到專(zhuān)家級(jí),廣度和深度都會(huì)有所增加试躏。 題目類(lèi)型: 理論知...
    怡寶丶閱讀 2,569評(píng)論 0 7
  • 作用功能: 實(shí)現(xiàn)組件的私有化猪勇,不對(duì)全局造成樣式污染,表示當(dāng)前style屬性只屬于當(dāng)前模塊雖然方便但是我們需要慎用颠蕴,...
    茶樹(shù)菇小學(xué)生閱讀 66,507評(píng)論 10 31
  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案泣刹? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,728評(píng)論 1 92