Vue scoped及deep使用方法解析
眾所周知,在組件中給style 標(biāo)簽添加屬性 scoped 屬性可以避免組件內(nèi)樣式對(duì)外界造成污染,scoped使得組件內(nèi)的樣式變成局域樣式,只作用于當(dāng)前組件。
原理如下-------
在編譯組件的時(shí)候,如果當(dāng)前組件內(nèi)style標(biāo)簽上有scoped屬性,那么會(huì)在當(dāng)前所有標(biāo)簽上添加一個(gè)【data-v-hash】屬性,而當(dāng)前樣式表內(nèi)的所有末尾選擇器后面也會(huì)加上該屬性,那么就使得當(dāng)前組件內(nèi)的樣式只會(huì)作用于當(dāng)前組件內(nèi)的元素。值得注意的是,當(dāng)父組件,子組件同時(shí)使用scoped屬性時(shí),子組件最外層的標(biāo)簽既會(huì)被加上當(dāng)前組件的hash值,又會(huì)加上父級(jí)組件的hash值,像這樣
//子組件最外層標(biāo)簽
<div data-v-b45036b2 data-v-384b136e ></div>
但是有個(gè)問(wèn)題------
在我們用scoped的時(shí)候回發(fā)現(xiàn)一個(gè)問(wèn)題,就是我們?cè)诋?dāng)前組件內(nèi)使用的scoped,但是我想在當(dāng)前組件內(nèi)改變子組件的樣式(非最外層標(biāo)簽),的時(shí)候會(huì)發(fā)現(xiàn)不好使。
<style scoped> .father-div .child-div{color:red;} </style>
因?yàn)榈搅藶g覽器上會(huì)解析成
<div data-v-384b136e ></div>
不好使的原因是應(yīng)為父組件內(nèi)樣式內(nèi)解析的是父組件的hash值,而子組件內(nèi)標(biāo)簽上添加的是子組件的hash值,對(duì)應(yīng)不上當(dāng)然沒(méi)效果,那怎么解決呢?
使用deep------
當(dāng)遇到這種困擾的時(shí)候我們可以另寫(xiě)一個(gè)style標(biāo)簽,然后不加scoped屬性,來(lái)蓋子組件的樣式,當(dāng)前這么寫(xiě)是可以的,但是不太優(yōu)雅,這時(shí)我們可以用到/deep/屬性,
.father-div /deep/ .child-div{color:red;}
當(dāng)遇到"/deep/"的時(shí)候會(huì)將"/deep/"的位置替換成組件的hash值,解析成
.father-div[data-v-b45036b2] .child-div{color:red;}
這樣只需要注意css的權(quán)重就可以覆蓋子組件內(nèi)的樣式了,
注意:子組件內(nèi)最外層的樣式由于是帶了父子組件的兩個(gè)hash值,所以是會(huì)被兩頭控制的,不需要/deep/就可以在父組件內(nèi)覆蓋樣式
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue項(xiàng)目使用lodash節(jié)流防抖函數(shù)問(wèn)題解決方案
在lodash函數(shù)工具庫(kù)中,防抖 _.debounce 和節(jié)流 _.throttle 函數(shù)在一些頻繁觸發(fā)的事件中比較常用,這篇文章主要介紹了vue項(xiàng)目使用lodash節(jié)流防抖函數(shù)問(wèn)題與解決,需要的朋友可以參考下2023-10-10Vue 中頁(yè)面?zhèn)髦档亩喾N方式小結(jié)
本文主要介紹了Vue 中頁(yè)面?zhèn)髦档亩喾N方式小結(jié),主要包括路由傳參、Vuex 狀態(tài)管理、Props 屬性和事件傳遞數(shù)據(jù)這幾種,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10ElementUI中的el-dropdown傳入多參數(shù)的實(shí)現(xiàn)方法
本文主要介紹了ElementUI中的el-dropdown傳入多參數(shù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12如何去掉ElementUI Table的hover變色問(wèn)題
這篇文章主要介紹了如何去掉ElementUI Table的hover變色問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09Vue+Element樹(shù)形表格實(shí)現(xiàn)拖拽排序示例
本文主要介紹了Vue+Element樹(shù)形表格實(shí)現(xiàn)拖拽排序示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08vue中路由跳轉(zhuǎn)的多種方式(和$router下路由跳轉(zhuǎn)的那幾個(gè)方法的區(qū)別)
Vue.js是一款流行的前端JavaScript框架,它提供了多種方式來(lái)實(shí)現(xiàn)路由跳轉(zhuǎn),本文給大家分享vue中路由跳轉(zhuǎn)的幾種方式(和$router下路由跳轉(zhuǎn)的那幾個(gè)方法的區(qū)別),感興趣的朋友一起看看吧2023-11-11Vite創(chuàng)建Vue3項(xiàng)目及Vue3使用jsx詳解
vite是新一代的前端構(gòu)建工具,下面這篇文章主要給大家介紹了關(guān)于Vite創(chuàng)建Vue3項(xiàng)目以及Vue3使用jsx的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08vue-cli-service build 環(huán)境設(shè)置方式
這篇文章主要介紹了vue-cli-service build 環(huán)境設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2023-01-01vue實(shí)現(xiàn)點(diǎn)擊出現(xiàn)操作彈出框的示例
這篇文章主要介紹了vue實(shí)現(xiàn)點(diǎn)擊出現(xiàn)操作彈出框的示例,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下2020-11-11