溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Vue中scoped如何使用

發(fā)布時(shí)間:2021-07-09 15:18:25 來(lái)源:億速云 閱讀:2486 作者:Leah 欄目:web開(kāi)發(fā)

本篇文章為大家展示了Vue中scoped如何使用,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

scoped的由來(lái)

css一直有個(gè)令人困擾的作用域問(wèn)題:即使是模塊化編程下,在對(duì)應(yīng)的模塊的js中import css進(jìn)來(lái),這個(gè)css仍然是全局的。為了避免css樣式之間的污染,vue中引入了scoped這個(gè)概念。

在vue文件中的style標(biāo)簽上,有一個(gè)特殊的屬性:scoped。當(dāng)一個(gè)style標(biāo)簽擁有scoped屬性時(shí),它的CSS樣式就只能作用于當(dāng)前的組件。通過(guò)設(shè)置該屬性,使得組件之間的樣式不互相污染。如果一個(gè)項(xiàng)目中的所有style標(biāo)簽全部加上了scoped,相當(dāng)于實(shí)現(xiàn)了樣式的模塊化。

但是這些樣式又是如何實(shí)現(xiàn)不相互影響呢?

scoped的原理

vue中的scoped 通過(guò)在DOM結(jié)構(gòu)以及css樣式上加唯一不重復(fù)的標(biāo)記:data-v-hash的方式,以保證唯一(而這個(gè)工作是由過(guò)PostCSS轉(zhuǎn)譯實(shí)現(xiàn)的),達(dá)到樣式私有化模塊化的目的。

總結(jié)一下scoped三條渲染規(guī)則:

  1. 給HTML的DOM節(jié)點(diǎn)加一個(gè)不重復(fù)data屬性(形如:data-v-19fca230)來(lái)表示他的唯一性

  2. 在每句css選擇器的末尾(編譯后的生成的css語(yǔ)句)加一個(gè)當(dāng)前組件的data屬性選擇器(如[data-v-19fca230])來(lái)私有化樣式

  3. 如果組件內(nèi)部包含有其他組件,只會(huì)給其他組件的最外層標(biāo)簽加上當(dāng)前組件的data屬性

上個(gè)栗子。轉(zhuǎn)譯前:

<style lang="scss" scoped>
  .test {
    background: blue;
    span{
      color:red;
    }
  }
</style>
<template>
  <div class="test">
    <span>hello world !</span>
  </div>
</template>

轉(zhuǎn)譯后:

<style lang="css">
  .test[data-v-ff86ae42] {
    background: blue;
  }
  .test span[data-v-ff86ae42]{
    color: red;
  }
</style>
<template>
  <div class="test" data-v-ff86ae42>
    <span data-v-ff86ae42>hello world !</span>
  </div>
</template>

可以看出:PostCSS會(huì)給一個(gè)組件中的所有dom添加了一個(gè)獨(dú)一無(wú)二的動(dòng)態(tài)屬性data-v-xxxx,然后,給CSS選擇器額外添加一個(gè)對(duì)應(yīng)的屬性選擇器來(lái)選擇該組件中dom,這種做法使得樣式只作用于含有該屬性的dom——組件內(nèi)部dom, 從而達(dá)到了'樣式模塊化'的效果.

穿透scoped

但是,在做項(xiàng)目中,會(huì)遇到這么一個(gè)問(wèn)題,即:引用了第三方組件,需要在組件中局部修改第三方組件的樣式,而又不想去除scoped屬性造成組件之間的樣式污染。那么有哪些解決辦法呢?

  1. 不使用scoped 省略(個(gè)人不推薦)

  2. 在模板中使用兩次style標(biāo)簽:

<style lang="scss">
  /*添加要覆蓋的樣式*/
</style>
<style lang="scss" scoped>
  /* local styles */
</style>
<!--vue官網(wǎng)中提到:一個(gè) .vue 文件可以包含多個(gè)style標(biāo)簽。所以上面的寫法是沒(méi)有問(wèn)題的。-->

穿透scoped >>>

<template>
 <div class="box">
  <dialog></dialog>
 </div>
</template>
<!--使用 >>>或者 /deep/ 操作符(Sass 之類的預(yù)處理器無(wú)法正確解析 >>>,可以使用/deep/)-->
<style lang="scss" scoped>
.box {
 /deep/ input {
  width: 166px;
  text-align: center;
 }
}
</style>
或者
<style lang="scss" scoped>
.box >>> input {
  width: 166px;
  text-align: center;
 }
}
</style>

上述內(nèi)容就是Vue中scoped如何使用,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI