<font id="zqva1"></font>
<rt id="zqva1"></rt>
  • <tt id="zqva1"></tt>
    <cite id="zqva1"></cite>

    <cite id="zqva1"><noscript id="zqva1"></noscript></cite>
      <rp id="zqva1"><meter id="zqva1"></meter></rp>

        <cite id="zqva1"></cite>
          <b id="zqva1"></b>
          <rp id="zqva1"></rp>
          <cite id="zqva1"></cite>

          <rt id="zqva1"></rt>

        1. <rp id="zqva1"></rp>

          vue中慎用style的scoped屬性

          時間:?2017-11-23閱讀:?2461標簽:?vue

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

          scoped實現原理

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

          公共組件button組件

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

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

          瀏覽器渲染button組件

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

          <div data-v-2311c06a class="button-warp">
          <button data-v-2311c06a class="button">text</button>
          </div>
          .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樣式不容易修改

          其他組件引用button組件

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

          //content.vue
          <template>
          <div>
          <p></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分別就是:

          <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>
          .button-warp[data-v-2311c06a]{
          display:inline-block;
          }
          .button[data-v-2311c06a]{
          padding: 5px 10px;
          font-size: 12px;
          border-radus: 2px;
          }
          .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-warp[data-v-2311c06a]{
          display:inline-block;
          }
          .button[data-v-2311c06a]{
          padding: 5px 10px;
          font-size: 12px;
          border-radus: 2px;
          }
          .content[data-v-57bc25a0]{
          width: 1200px;
          margin: 0 auto;
          }
          .content .button[data-v-57bc25a0]{
          border-raduis: 5px;
          }

          對于上面的兩種情況,可以明顯看出來渲染后的結果大不相同。
          并且content也修改了button組件的樣式,但是仔細看,由于.content .button這句在末尾加的是content組件的標記,所以這句其實根本作用不到我們想要的DOM節點上,所以這種情況我們在content內部寫的任何樣式都不會影響到button組件,所以這就尷尬了。。。。當然這個問題也是可以解決的,就是在content屬性再加一個不帶scoped屬性的標簽,也就意味著要加兩個style,一個用于私有樣式,一個用于共有樣式。真是shit,即:

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

          這樣符合規范么?貌似沒看到不能這么寫,并且這么寫也確實生效了。。。不知道怎么感概!!!

          總結

          總結一下scoped三條渲染規則

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

          最后

          在使用scoped一定要謹慎這個巨坑,已提 issue 
          issue已被干掉,scoped設計的初衷就是不能讓當前組件的樣式修改其他任何地方的樣式,所以如果要修改其他組件的樣式,那么必定不能加scoped屬性
          如果大家有好的解決方案或者其他發現希望一起交流

          原始鏈接:http://2ue.github.io/2017/11/15/vue-style-scoped/   

          吐血推薦

          1.站長廣告聯盟: 整理了目前主流的廣告聯盟平臺,如果你有流量,可以作為參考選擇適合你的平臺點擊進入...

          2.休閑娛樂: 直播/交友    優惠券領取   網頁游戲   H5游戲

          鏈接: http://www.modern-decoration.com.cn/article/detial/162

          Vue 的 .sync 修飾符

          .sync 修飾符算是 Vue 的所有修飾符中較難理解的一個,本篇文章就帶你走近 .sync 的世界,深入理解后會發現,其實也就那么回事。修飾符和指令息息相關,下面從 指令 -> 修飾符 -> .sync 修飾符 由淺入深地來講解 .sync 的含義及用法。

          vue中is的作用和用法

          總所周知,ul里面嵌套li的寫法是html語法的固定寫法(還有如table,select等)。my-component是我們自己寫的組件,但是html在渲染dom的時候,my-component對ul來說并不是有效的dom,甚至會報錯。

          一點 Vue.observable 想法

          Vue 2.6.0 新增了 Vue.observable api,但最近才去嘗試使用它。這東西說新也不新,因為他就是 vue 本身的功能,只是暴露出來,成為新 api 了。在老版本中,直接用 new Vue({ data: {} }) 也一樣。

          Vue.use到底是什么?

          我們在使用Vue做項目開發的時候,看到不少輪子都是通過Vue.use來進行使用,感覺甚是高大上。不過Vue.use到底是什么鬼?不妨來看個究竟。

          Vue.js最佳實踐:五招讓你成為Vue.js大師

          本文面向對象是有一定Vue.js編程經驗的開發者。如果有人需要Vue.js入門系列的文章可以在評論區告訴我,有空就給你們寫。對大部分人來說,掌握Vue.js基本的幾個API后就已經能夠正常地開發前端網站

          vue介紹

          庫是一種插件,是一種封裝好的特定方法的集合。提供給開發者使用,控制器在使用者手里。框架是一套架構,會基于自身特定向用戶提供一套相當完整的解決方案,控制權在框架本身

          vue有時候你不需要 $emit & $on

          在此之前,子組件到父組件的傳遞事件我一般還是使用 $emit 和 $on,因為這個操作理解起來并不難,代碼一般也挺清晰。不過今天遇到這么個情況 ——

          Vue最佳實踐

          Vue 最佳實踐,是參考 Vue 官方風格指南并根據過去 Vue 實際項目開發中的經驗總結的一套規范建議。本項目的目的是希望每個 Vue 開發者都能盡快熟悉并上手項目代碼,志在幫助 Vue 新手開發者及時避免一些不規范的設計和由此而引發的問題

          vue知識點總匯

          keep-alive它是vue的內置組件在默認情況下,v-model 在每次 input 事件觸發后將輸入框的值與數據進行同步 。你可以添加 lazy 修飾符,從而轉變為使用 change 事件進行同步:

          vue中使用v-for時為什么不能用index作為key?

          Vue 和 React 都實現了一套虛擬DOM,使我們可以不直接操作DOM元素,只操作數據便可以重新渲染頁面。而隱藏在背后的原理便是其高效的Diff算法。Vue 和 React 的虛擬DOM的Diff算法大致相同,其核心是基于兩個簡單的假設

          fly63.com版權所有,內容以共享、參考、研究為目的,不存在任何商業目的。其版權屬原作者所有,如有侵權,請與小編聯系!情況屬實本人將予以刪除!

          文章投稿關于web前端網站點搜索站長推薦網站地圖站長QQ:522607023

          小程序專欄: 土味情話心理測試腦筋急轉彎幽默笑話段子句子語錄成語大全

          国产精品高清视频免费 - 视频 - 在线观看 - 影视资讯 - 唯爱网