日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

vue中style的scoped属性的设计方式

發布時間:2023/12/31 vue 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vue中style的scoped属性的设计方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

vue中style的scoped屬性這里是怎實現的呢?

scoped三條渲染規則

  • 給HTML的DOM節點加一個不重復data屬性(形如:data-v-2311c06a)來表示他的唯一性
  • 在每句css選擇器的末尾(編譯后的生成的css語句)加一個當前組件的data屬性選擇器(如[data-v-2311c06a])來私有化樣式
  • 如果組件內部包含有其他組件,只會給其他組件的最外層標簽加上當前組件的data屬性

  • 一個簡單組件例子:

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

    瀏覽器渲染組件

    HTML

    <div data-v-2311c06a class="button-warp"><button data-v-2311c06a class="button">text</button> </div>

    CSS

    .button-warp[data-v-2311c06a]{display:inline-block; } .button[data-v-2311c06a]{padding: 5px 10px;font-size: 12px;border-radus: 2px; }

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

    • 給HTML的DOM節點加一個不重復data屬性(形如:data-v-2311c06a)來表示他的唯一性
    • 在每句css選擇器的末尾(編譯后的生成的css語句)加一個當前組件的data屬性選擇器(如[data-v-2311c06a])來私有化樣式

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


    其他組件引用button組件

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

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

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

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

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

    <div class="content"><p class="title"></p><!-- v-button假設是上面定義的組件 --><div data-v-2311c06a class="button-warp"><button data-v-2311c06a class="button">text</button></div> </div>

    CSS

    /*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屬性,但是由于權重關系,生效的依然是組件內部的樣式(此時是外部的樣式被覆蓋)。所以如果要達到修改樣式的目的,就必須加重我們要修改樣式的權重(增加選擇器層級,ID選擇器,并列選擇器,impotant等)


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

    如果加了scoped屬性呢?按照開始分析出來的規則(事實也是這么的):
    首先是在所有的DOM節點加上data屬性
    然后在css選擇器尾部加上data屬性選擇器

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

    <div data-v-57bc25a0 class="content"><p data-v-57bc25a0 class="title"></p><!-- v-button假設是上面定義的組件 --><div data-v-57bc25a0 data-v-2311c06a class="button-warp"><button data-v-2311c06a class="button">text</button></div> </div> /*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; }

    原文鏈接:https://segmentfault.com/a/1190000012184604?utm_source=tuicool&utm_medium=referral

    總結

    以上是生活随笔為你收集整理的vue中style的scoped属性的设计方式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。