Vue?中的?deep、v-deep?和?>>>區(qū)別解析
???? 寫(xiě)在開(kāi)頭
“你用 Element Plus 寫(xiě)了個(gè)按鈕,想改下 hover 顏色,結(jié)果死活不生效!最后查了半天,發(fā)現(xiàn)得加個(gè) :deep() 才行”
其實(shí),這是 Vue 中一個(gè)非常常見(jiàn)的坑:樣式作用域沖突。那為什么用 UI 庫(kù)時(shí),加上 :deep()、::v-deep 或 >>>后,樣式就能生效呢?
它們是什么?有什么區(qū)別?什么時(shí)候該用哪個(gè)?
一、先說(shuō)背景
我們?cè)?Vue 單文件組件(.vue 文件)里寫(xiě)樣式時(shí),通常會(huì)加上 scoped 屬性:
<template>
<el-button>點(diǎn)我</el-button>
</template>
<style scoped>
.el-button {
background: red;
}
</style>加了 scoped 后,Vue 會(huì)自動(dòng)給這個(gè)組件里的所有元素加上一個(gè)唯一的屬性(比如 data-v-123456),然后把 CSS 選擇器也加上這個(gè)屬性,變成:
.el-button[data-v-123456] {
background: red;
}這樣做的好處是:樣式只作用于當(dāng)前組件,不會(huì)污染全局。、
但問(wèn)題來(lái)了:Element Plus 的 <el-button> 組件內(nèi)部結(jié)構(gòu),是在它自己的組件里定義的。也就是說(shuō),你寫(xiě)的 .el-button 元素,其實(shí)是 Element Plus 渲染出來(lái)的子組件,它身上沒(méi)有你當(dāng)前組件的 data-v-xxx 屬性!
所以你的樣式根本匹配不到它,自然就失效了。
二、那怎么辦?
為了解決這個(gè)問(wèn)題,Vue 提供了樣式穿透(style penetration)的語(yǔ)法,讓你能穿透當(dāng)前組件的作用域,去影響子組件內(nèi)部的元素。
Vue 社區(qū)出現(xiàn)過(guò)三種寫(xiě)法:

下面我們一個(gè)個(gè)拆解。
1. >>>:曾經(jīng)的快捷方式,但問(wèn)題很多
早期 Vue2 時(shí)代,很多人用:
<style scoped>
.parent >>> .child {
color: blue;
}
</style>它的意思是:從 .parent 開(kāi)始,穿透到所有后代中的 .child。
但問(wèn)題在于:
- Sass/Less 等預(yù)處理器不認(rèn)
>>>,會(huì)報(bào)錯(cuò)。 - 不是標(biāo)準(zhǔn) CSS 語(yǔ)法。
- Vue3 已經(jīng)明確不再支持。
所以現(xiàn)在基本可以忘掉它了。
2. ::v-deep:Vue2 到 Vue3 的橋梁
為了兼容預(yù)處理器,Vue 引入了 ::v-deep:
<style scoped lang="scss">
.parent ::v-deep(.child) {
color: blue;
}
</style>或者更常見(jiàn)的寫(xiě)法:
<style scoped lang="scss">
.parent ::v-deep(.child) {
color: blue;
}
</style>它在 Vue2 和 Vue3 中都能用,算是一個(gè)安全的過(guò)渡方案。
但注意:在 Vue3 中,官方文檔已經(jīng)明確建議使用 :deep() 替代它。
3. :deep():Vue3 的標(biāo)準(zhǔn)答案
Vue3 引入了更簡(jiǎn)潔、更符合 CSS 規(guī)范的偽類函數(shù)寫(xiě)法:
<style scoped>
:deep(.el-button) {
background: red !important;
}
</style>或者配合父級(jí)選擇器:
<style scoped>
.my-wrapper :deep(.el-input__inner) {
border-radius: 10px;
}
</style>優(yōu)點(diǎn):
- 語(yǔ)法清晰,像原生 CSS。
- 支持所有預(yù)處理器(Sass/Less/Stylus)。
:deep() 本質(zhì)上是一個(gè)編譯時(shí)轉(zhuǎn)換,Vue 在構(gòu)建時(shí)會(huì)把它展開(kāi)成帶 data-v-xxx 的復(fù)雜選擇器,從而實(shí)現(xiàn)穿透。
三、怎么正確修改 Element Plus 的樣式?
舉個(gè)真實(shí)例子:你想把 Element Plus 的輸入框圓角改成 8px。
錯(cuò)誤寫(xiě)法(不生效):
<style scoped>
.el-input__inner {
border-radius: 8px;
}
</style>正確寫(xiě)法:
<template>
<div class="my-form">
<el-input v-model="value" />
</div>
</template>
<style scoped>
.my-form :deep(.el-input__inner) {
border-radius: 8px;
}
</style>為什么要加 .my-form 這個(gè)父級(jí)?
避免全局污染!如果直接寫(xiě) :deep(.el-input__inner),那么這個(gè)頁(yè)面里所有 Element 輸入框都會(huì)被改掉。加上父級(jí)限定,就能精準(zhǔn)控制范圍。
到此這篇關(guān)于Vue 中的 deep、v-deep 和 >>>區(qū)別解析的文章就介紹到這了,更多相關(guān)Vue deep、v-deep 和 >>> 區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue.js iview打包上線后字體圖標(biāo)不顯示解決辦法
這篇文章主要介紹了vue.js iview打包上線后字體圖標(biāo)不顯示解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
vue實(shí)現(xiàn)通過(guò)手機(jī)號(hào)發(fā)送短信驗(yàn)證碼登錄的示例代碼
本文主要介紹了vue實(shí)現(xiàn)通過(guò)手機(jī)號(hào)發(fā)送短信驗(yàn)證碼登錄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
Vue異步請(qǐng)求導(dǎo)致頁(yè)面數(shù)據(jù)渲染錯(cuò)誤問(wèn)題解決方法示例
這篇文章主要為大家介紹了Vue中異步請(qǐng)求導(dǎo)致頁(yè)面數(shù)據(jù)渲染錯(cuò)誤問(wèn)題解決方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
vant?toast?關(guān)閉棧溢出問(wèn)題及解決
這篇文章主要介紹了vant?toast?關(guān)閉棧溢出問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
Vant Uploader實(shí)現(xiàn)上傳一張或多張圖片組件
這篇文章主要為大家詳細(xì)介紹了Vant Uploader實(shí)現(xiàn)上傳一張或多張圖片組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Vue 實(shí)現(xiàn)穿梭框功能的詳細(xì)代碼
本文給大家介紹Vue 實(shí)現(xiàn)穿梭框功能,代碼分為css,html和js代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-10-10
詳解Webstorm 新建.vue文件支持高亮vue語(yǔ)法和es6語(yǔ)法
這篇文章主要介紹了Webstorm 添加新建.vue文件功能并支持高亮vue語(yǔ)法和es6語(yǔ)法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-10-10
Vue2中使用自定義指令實(shí)現(xiàn)el-table虛擬列表的代碼示例
在實(shí)際開(kāi)發(fā)中,我們可能會(huì)面臨其他需求,例如在 el-table 中無(wú)法使用分頁(yè)技術(shù)的情況下展示海量數(shù)據(jù),這種情況下,頁(yè)面可能會(huì)出現(xiàn)卡頓,嚴(yán)重時(shí)甚至可能引發(fā)瀏覽器崩潰,所以針對(duì)這個(gè)問(wèn)題本文給大家介紹了vue2中使用自定義指令實(shí)現(xiàn)el-table虛擬列表,需要的朋友可以參考下2025-01-01

