<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        在vue中有關如何使用style的scoped屬性

        來源:懂視網(wǎng) 責編:小OO 時間:2020-11-27 19:35:12
        文檔

        在vue中有關如何使用style的scoped屬性

        在vue組件中,為了使樣式私有化(模塊化),不對全局造成污染,可以在style標簽上添加scoped屬性以表示它的只屬于當下的模塊,這是一個非常好的舉措,但是為什么要慎用呢?因為在我們需要修改公共組件(三方庫或者項目定制的組件)的樣式的時候,scoped往往會造成更多的困難,需要增加額外的復雜度。scoped實現(xiàn)私有化樣式的原理。為什么會說,會增加復雜度?那么我們先從的實現(xiàn)模塊的原理說起。為了方便稱呼,我們假設把這種組件叫做模塊私有組件,其他的未加scoped的叫做模塊一般組件。通過查看DOM結構發(fā)現(xiàn):vue通過在DOM結構以及css樣式上加唯一不重復的標記,以保證唯一,達到樣式私有化模塊化的目的。具體的渲染結果是怎樣的,通過一個例子來說明。公共組件button組件。
        推薦度:
        導讀在vue組件中,為了使樣式私有化(模塊化),不對全局造成污染,可以在style標簽上添加scoped屬性以表示它的只屬于當下的模塊,這是一個非常好的舉措,但是為什么要慎用呢?因為在我們需要修改公共組件(三方庫或者項目定制的組件)的樣式的時候,scoped往往會造成更多的困難,需要增加額外的復雜度。scoped實現(xiàn)私有化樣式的原理。為什么會說,會增加復雜度?那么我們先從的實現(xiàn)模塊的原理說起。為了方便稱呼,我們假設把這種組件叫做模塊私有組件,其他的未加scoped的叫做模塊一般組件。通過查看DOM結構發(fā)現(xiàn):vue通過在DOM結構以及css樣式上加唯一不重復的標記,以保證唯一,達到樣式私有化模塊化的目的。具體的渲染結果是怎樣的,通過一個例子來說明。公共組件button組件。

        本篇文章主要介紹了淺談vue中慎用style的scoped屬性,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

        在vue組件中,為了使樣式私有化(模塊化),不對全局造成污染,可以在style標簽上添加scoped屬性以表示它的只屬于當下的模塊,這是一個非常好的舉措,但是為什么要慎用呢?因為在我們需要修改公共組件(三方庫或者項目定制的組件)的樣式的時候,scoped往往會造成更多的困難,需要增加額外的復雜度。

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

        為什么會說,會增加復雜度?那么我們先從的實現(xiàn)模塊的原理說起。為了方便稱呼,我們假設把這種組件叫做模塊私有組件,其他的未加scoped的叫做模塊一般組件。

        通過查看DOM結構發(fā)現(xiàn):vue通過在DOM結構以及css樣式上加唯一不重復的標記,以保證唯一,達到樣式私有化模塊化的目的。具體的渲染結果是怎樣的,通過一個例子來說明。

        公共組件button組件

        一個公共組件button,為了樣式模塊化,給其加上scoped屬性,

        //button.vue
        <template>
         <p class="button-warp">
         <button class="button">text</button>
         </p>
        </template>
        ...
        <style scoped>
         .button-warp{
         display:inline-block;
         }
         .button{
         padding: 5px 10px;
         font-size: 12px;
         border-radus: 2px;
         }
        </style>

        瀏覽器渲染button組件

        button組件在瀏覽器渲染出的html部分和css部分分別為:

        <p data-v-2311c06a class="button-warp">
         <button data-v-2311c06a class="button">text</button>
        </p>
        .button-warp[data-v-2311c06a]{
         display:inline-block;
        }
        .button[data-v-2311c06a]{
         padding: 5px 10px;
         font-size: 12px;
         border-radus: 2px;
        }

        從上面的字可以看出,添加了scoped屬性的組件,為了達到組件樣式模塊化,做了兩個處理:

        1. 給HTML的DOM節(jié)點加一個不重復data屬性(形如:data-v-2311c06a)來表示他的唯一性

        2. 在每句css選擇器的末尾(編譯后的生成的css語句)加一個當前組件的data屬性選擇器(如[data-v-2311c06a])來私有化樣式

        大家都知道css樣式有一個優(yōu)先級的說法,scoped的這一操作,雖然達到了組件樣式模塊化的目的,但是會造成一種后果:每個樣式的權重加重了:理論上我們要去修改這個樣式,需要更高的權重去覆蓋這個樣式。這是增加復雜度的其中一個維度。

        其他組件引用button組件

        上面分析了單個組件渲染后的結果,那么組件互相調(diào)用之后會出現(xiàn)什么樣的結果呢?,具體分兩種情況:模塊一般組件引用模塊私有組件(本質(zhì)和模塊私有組件引用模塊一般組件一樣);模塊私有組件引用模塊私有組件。

        舉個例子:在組件content.vue中使用了button組件,那么content.vue組件是否添加scoped屬性渲染出來的結果有什么區(qū)別呢?

        //content.vue
        <template>
         <p class="content">
         <p class="title"></p>
         <!-- v-button假設是上面定義的組件 -->
         <v-button></v-button>
         </p>
        </template>
        ...
        <style>
         .content{
         width: 1200px;
         margin: 0 auto;
         }
         .content .button{
         border-raduis: 5px;
         }
        </style>

        模塊一般組件(未添加scoped)引用模塊私有組件

        如果style上沒有加scoped屬性,那么渲染出來html和css分別就是:

        <p class="content">
         <p class="title"></p>
         <!-- v-button假設是上面定義的組件 -->
         <p data-v-2311c06a class="button-warp">
         <button data-v-2311c06a class="button">text</button>
         </p>
        </p>
        /*button.vue渲染出來的css*/
        .button-warp[data-v-2311c06a]{
         display:inline-block;
        }
        .button[data-v-2311c06a]{
         padding: 5px 10px;
         font-size: 12px;
         border-radus: 2px;
        }
        /*content.vue渲染出來的css*/
        .content{
         width: 1200px;
         margin: 0 auto;
        }
        .content .button{
         border-raduis: 5px;
        }

        可以看出,雖然在content組件中,修改了button的border-raduis屬性,但是由于權重關系,生效的依然是組件內(nèi)部的樣式(此時是外部的樣式被覆蓋)。所以如果要達到修改樣式的目的,就必須加重我們要修改樣式的權重(增加選擇器層級,ID選擇器,并列選擇器,impotant等)

        模塊私有組件(添加scoped)引用模塊私有組件

        如果加了scoped屬性呢?按照開始分析出來的規(guī)則(事實也是這么的):

        首先是在所有的DOM節(jié)點加上data屬性

        然后在css選擇器尾部加上data屬性選擇器

        那么渲染出來html和css分別就是:

        <p data-v-57bc25a0 class="content">
         <p data-v-57bc25a0 class="title"></p>
         <!-- v-button假設是上面定義的組件 -->
         <p data-v-57bc25a0 data-v-2311c06a class="button-warp">
         <button data-v-2311c06a class="button">text</button>
         </p>
        </p>
        /*button.vue渲染出來的css*/
        .button-warp[data-v-2311c06a]{
         display:inline-block;
        }
        .button[data-v-2311c06a]{
         padding: 5px 10px;
         font-size: 12px;
         border-radus: 2px;
        }
        /*content.vue渲染出來的css*/
        .content[data-v-57bc25a0]{
         width: 1200px;
         margin: 0 auto;
        }
        .content .button[data-v-57bc25a0]{
         border-raduis: 5px;
        }

        對于上面的兩種情況,可以明顯看出來渲染后的結果大不相同。

        雖然我們在content添加了想要修改button組件的樣式的代碼,但是仔細看,由于.content .button這句在末尾加的是content組件的scoped標記,最后這句其實根本作用不到我們想要的DOM節(jié)點上,所以這種情況我們在content內(nèi)部寫的任何樣式都不會影響到button.vue組件,所以這就尷尬了。。

        當然這個問題也是可以解決的,就是直接加全局樣式可以修改到,但這勢必會影響全部地方的組件;所以需要另外一種方法在content.vue組件內(nèi)再加一個不帶scoped屬性的style標簽,也就意味著要加兩個style,一個用于私有樣式,一個用于共有樣式。這肯定是有點shit的,并且這兩種解決方案都回避不了一個問題:權重?。。?/p>

        //content.vue
        <template>
         <p class="content">
         <p class="title"></p>
         <!-- v-button假設是上面定義的組件 -->
         <v-button></v-button>
         </p>
        </template>
        ...
        <style scoped>
         .content{
         width: 1200px;
         margin: 0 auto;
         }
        </style>
        <style>
         .content .button{
         border-raduis: 5px;
         }
        </style>

        這樣符合規(guī)范么?貌似沒看到不能這么寫,并且這么寫也確實生效了。。但這樣確實增加了思維的復雜度,有點苦惱啊。

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

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

        1. 給HTML的DOM節(jié)點加一個不重復data屬性(形如:data-v-2311c06a)來表示他的唯一性

        2. 在每句css選擇器的末尾(編譯后的生成的css語句)加一個當前組件的data屬性選擇器(如[data-v-2311c06a])來私有化樣式

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

        解決方案

        對于引用的三方庫,如果對方使用了scoped,我們無力改變什么,如果確實需要修改他的樣式最能在不加scoped的組件中修改樣式,或者全局樣式直接修改,這很粗暴!

        對于自己維護的組件,一定要想清楚,組件的樣式能否滿足所有的情況。如果確實需要加,無疑會增加使用這個組件的開發(fā)同學的工作!

        當然對于這個問題,如果諸君有更好的解決方案,請諸君TELL ME一下下!

        趣事

        <del> 在使用scoped一定要謹慎scoped的這個特性,本人以為這是一個BUG,就去提了issue </del>,結果尤大很霸氣的回復
        scoped設計的初衷就是不能讓當前組件的樣式修改其他任何地方的樣式,因為設計如此。所以理所當然的這個issue已被干掉

        上面是我整理給大家的,希望今后會對大家有幫助。

        相關文章:

        在Nodejs中有關crypto模塊安全知識(詳細教程)

        在Angular中如何實現(xiàn)下拉框模糊查詢功能

        在js中如何實現(xiàn)登錄需要滑動驗證

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        在vue中有關如何使用style的scoped屬性

        在vue組件中,為了使樣式私有化(模塊化),不對全局造成污染,可以在style標簽上添加scoped屬性以表示它的只屬于當下的模塊,這是一個非常好的舉措,但是為什么要慎用呢?因為在我們需要修改公共組件(三方庫或者項目定制的組件)的樣式的時候,scoped往往會造成更多的困難,需要增加額外的復雜度。scoped實現(xiàn)私有化樣式的原理。為什么會說,會增加復雜度?那么我們先從的實現(xiàn)模塊的原理說起。為了方便稱呼,我們假設把這種組件叫做模塊私有組件,其他的未加scoped的叫做模塊一般組件。通過查看DOM結構發(fā)現(xiàn):vue通過在DOM結構以及css樣式上加唯一不重復的標記,以保證唯一,達到樣式私有化模塊化的目的。具體的渲染結果是怎樣的,通過一個例子來說明。公共組件button組件。
        推薦度:
        標簽: 使用 VUE style
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲夜夜欢A∨一区二区三区| 国产精品视_精品国产免费 | 91精品国产亚洲爽啪在线观看| a一级毛片免费高清在线| 深夜国产福利99亚洲视频| 亚洲成a人片在线观看天堂无码 | 亚洲成人在线免费观看| 亚洲黄色免费网站| 97在线线免费观看视频在线观看| 亚洲六月丁香婷婷综合| 免费看少妇作爱视频| 免费人人潮人人爽一区二区| 免费在线不卡视频| 很黄很污的网站免费| 中文字幕亚洲综合久久2| 野花高清在线观看免费3中文| 亚洲久热无码av中文字幕| 免费很黄很色裸乳在线观看| 一区二区视频免费观看| 亚洲国产第一站精品蜜芽| 亚洲无砖砖区免费| 粉色视频成年免费人15次| 自拍偷自拍亚洲精品第1页| 少妇无码一区二区三区免费| 亚洲视频日韩视频| 永久黄网站色视频免费| 中文无码日韩欧免费视频| 亚洲天堂中文字幕在线观看| 免费看AV毛片一区二区三区| 国产精品成人啪精品视频免费| 亚洲国产无套无码av电影| 四虎永久在线精品免费网址 | 免费在线观看亚洲| 午夜精品免费在线观看| 亚洲小说图区综合在线| 亚洲男人av香蕉爽爽爽爽| 国产精品1024永久免费视频 | 精品无码一区二区三区亚洲桃色 | 亚洲成人精品久久| 四虎www免费人成| 成全视频高清免费观看电视剧|