vue scoped,子組件的根節點依然受其父組件的CSS 的影響


vue scoped,子組件的根節點依然受其父組件的CSS 的影響

vue-loader文檔

我們都知道,vue scoped 的作用是避免 css 全局作用域的影響

以下截圖來自vue-loader 官網頁面對scoped css 原理的介紹

 

  官網文檔上也說明了子組件根元素會受到父組件同名css樣式影響,截圖如下

文檔中提到,子組件根節點樣式會受到父組件樣式影響,這樣設計是為了讓父組件可以從布局的角度出發,調整其子組件根元素的樣式。

但是,現在,我不希望子組件根元素樣式受到父組件影響,怎么做呢?

我們先來看一下,具體是怎么相互影響的呢?

父組件

<template>
  <div class="root">
    <span>父組件</span>
    <child-component></child-component>
  </div>
</template>

<script>
import Child from "./child";
export default {
  components: {
    "child-component": Child
  }
};
</script>

<style scoped>
.root {
  color: green;
  padding: 40px;
}
</style>
父組件代碼

父組件中給根元素添加字體綠色和 padding 間距

子組件

<template>
  <div class="root">
    <span>子組件</span>
  </div>
</template>

<script>
export default {};
</script>

<style scoped>
.root {
  background-color: red;
}
</style>
子組件代碼

子組件只添加了背景色紅色

結果

結果顯示子組件被額外添加了 padding 樣式(這非預想設計的樣式)

 分析

本來子組件中我們通過 .root 給了背景色樣式為紅色,但是在父組件中由於我們意外給了一個同名 .root 樣式,導致我們給子組件額外添加了padding間距(注:字體色理論上由於繼承關系也會顯示為綠色,我們暫不考慮這個)。

原因,因為父組件的生成的唯一標識 'data-v-a83bd3b0' ,也會給子組件根元素加上這個標識,巧合的是,子組件根元素具有 .root 的選擇器,剛好使得  .root[data-v-a83bd3b0] 生效

即使得該樣式生效了

通過以上分析,我們知道,以上問題(樣式干擾)由兩個條件產生:

  ①,父組件唯一標識符屬性 data-v-id 也會被添加到 子組件根元素上

  ②,子組件根元素上具有和父組件同名class

解決問題方案(解決原理是將上述任意一個條件使得它不成立,那么問題就不會產生啦)

方案一,避免父組件使用和子組件根元素同名 class(往往很難避免,還需要頁面調試查看子組件根元素className)

方案二,給子組件根元素添加一層 div,不添加 class樣式(這樣的話,父組件生成的data-v-id 便會在該div上,從而使得)推薦

如圖使用方案二,這樣就避免啦問題

 

vue插槽內的樣式沖突問題

vue插槽打包之后,插槽中的所有內容,均會被打上組件唯一標識id,若在插槽中存在和提供插槽組件存在同名class樣式,也會產生沖突問題。如下圖所示

 

 目前解決方案,如圖中所示,換一個不同名字的class名字

 

 

@萍2櫻釋ღ( ´・ᴗ・` )


免責聲明!

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



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