VUE中的scoped屬性和深度選擇器


scoped屬性

眾所周知,在vue中我們在style標簽中寫樣式時,為了防止當前組件或頁面的樣式對外界其它的頁面組件造成影響,會給vue中的 style標簽 加上 scoped 屬性,該屬性使樣式變成了局域樣式,只作用於當前組件。vue中的scoped屬性的設計思想就是讓當前組件的樣式不會修改到其它 地方的樣式。

原理

通過觀察頁面的DOM發現:vue中的scoped屬性給相應的DOM結構和CSS選擇器都加上了標識,這個唯一的標記保證了唯一性,從而達到了樣式的 私有化,不會污染全局的作用。這個標識就是給標簽添加上一個 [data-v-hash] 的屬性。

需要注意的是,如果當父組件、子組件同時使用 scoped 屬性時,子組件最外層的標簽會被加上當前組件的hash值,同時也會被加上父組件的hash 值。

同樣的CSS樣式部分的選擇器也會被加上這個標識屬性。
總結vue中的scoped屬性實現樣式私有化:
  • 給相應的HTML的DOM元素添加一個 [data-v-hash] 屬性的唯一標識。
  • 給相應的DOM元素的樣式選擇器添加一個與標簽相同的 [data-v-hash] 屬性標識。
  • 如果父子組件的style標簽都有scoped屬性時,子組件最外層的標簽會同時有父組件和子組件的 [data-v-hash] 的屬性標識
  • 如果組件中還有組件(沒有scoped屬性)或者第三方組件時,只會給最外層的組件里的標簽加上 [data-v-hash] 的屬性標識,對組件內部的組件不影響。

深度選擇器

在vue中,為了不讓當前組件的樣式修改其它地方的樣式,就有了scoped屬性。但有時候不想用默認的樣式,需要自定義自己的樣式時,比如:引用的第三方組件庫, 同時還不想去除scoped屬性,避免污染全局,可以選擇使用深度選擇器。
在vue中,可以使用深度選擇器 >>> 來穿透scoped,來修改樣式,但是像 sass 之類的預處理語言無法正確解析 >>>,可以使用 /deep/ 操作符(>>> 的別名) 或者 ::v-deep 操作符(>>> 的別名)來實現同樣的效果。
        <script scoped>
                外層類名 >>> 第三方組件類名{

                }
            </script>
      
        <script scoped>
                外層類名 /deep/ 第三方組件類名{

                }
            </script>
      
        <script scoped>
                外層類名 ::v-deep 第三方組件類名{

                }
            </script>
      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM