理解:
在 .vue
文件中,scoped
是 <style>
標簽的一個屬性,作用是讓樣式只作用于當前組件,避免樣式污染其他組件
scoped
讓樣式只在自己的組件內生效,不會影響到其他組件的同名元素
舉例
沒有 scoped
的情況(樣式全局生效):
<!-- ComponentA.vue -->
<style>
p {color: red;
}
</style>
<!-- ComponentB.vue -->
<template><p>我是B組件的文字</p> <!-- 這里的文字也會變成紅色,因為ComponentA的樣式是全局的 -->
</template>
有 scoped
的情況(樣式僅當前組件生效):
<!-- ComponentA.vue -->
<style scoped>
p {color: red;
}
</style>
<!-- 只有ComponentA里的<p>會變紅,ComponentB的<p>不受影響 -->
原理:
Vue 會給加了 scoped
的組件內所有 DOM 元素自動添加一個唯一的屬性(比如 data-v-xxxxxx
),同時給樣式也加上這個屬性選擇器,讓樣式只匹配當前組件的元素。
編譯后大概是這樣:
/* 原樣式 */
p { color: red; }/* 編譯后(帶scoped) */
p[data-v-xxxxxx] { color: red; }
注意:
如果需要在當前組件中修改子組件的樣式,scoped
可能會限制效果,這時可以用 ::v-deep
穿透:
<style scoped>
/* 穿透scoped,修改子組件的樣式 */
::v-deep .child-component-class {margin-top: 20px;
}
</style>