最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文徹底搞懂Vue中scoped和/deep/原理

 更新時間:2023年08月08日 10:47:43   作者:liuwei9413  
在Vue中,有兩種常用的CSS選擇器,用于修改組件樣式:scoped?和?/deep/(或?::v-deep),它們都是為了實現(xiàn)樣式的作用域,本文小編就來分別給大家介紹一下這兩種選擇器的原理,需要的朋友可以參考下

背景

我們做 Vue 項目在組件里寫 css 的時候,經(jīng)常會給 <style> 標(biāo)簽加上 scoped ,比如這樣: <style lang="less" scoped> ,這樣寫出來的 css 就是局部的,不會影響其他組件。

另外,假設(shè)我們在自己的組件中引入了一個子組件,并且希望在我的組件中修改子組件中的樣式,由于我們用了 scoped ,直接修改是不生效的。去掉 scoped 是可以的,不過沒了局部 css 風(fēng)險不可控。有一種更好的方式,用深度選擇器修改,比如 less 中的 /deep/ 。用過組件庫(如 element ui )的朋友,在覆蓋組件庫樣式的時候應(yīng)該會經(jīng)常用到深度選擇器 /deep/ 。

基于以上兩點,我們來聊一聊:

  1. 為什么 scoped 可以形成局部 css ?原理是什么?
  2. 為什么 /deep/ 可以跨組件修改 css ?原理是什么?

scoped 形成局部 css 原理

先看一張圖:

image.png

我們審查 html 元素時發(fā)現(xiàn)多了很多類似 data-v-f321cf6 屬性,這些屬性其實就是 scoped hash 出來的。

再來看一張頁面生成的 css 截圖:

image.png

仔細(xì)看第一張圖標(biāo)記了兩種顏色,他們分別對應(yīng)兩種 hash 屬性值: data-v-f5321cf6 data-v-6a6ef68c ,其實這里就是兩個不同的組件生成的兩個不同的值,每個加過 scoped 的組件生成的值都是唯一的。

結(jié)合兩張圖,不難發(fā)現(xiàn) scoped 形成局部 css 的原理其實很簡單,就是先給元素加上 hash 出來的屬性,再通過屬性選擇器來選擇這些元素,由于每個組件 hash 出來的屬性值都是唯一的, css 屬性選擇器選出來的元素當(dāng)然也是組件級的了,因為形成了組件內(nèi)局部 css

/deep/  跨組件修改 css  原理

一個例子

一個列表頁面 ,需要在數(shù)據(jù)為空的時候展示空白頁,這個空白頁我們引入的是第三方組件庫的空白頁組件 <no-data> 。

image.png

假設(shè)我們現(xiàn)在要修改空白頁組件中圖片的寬高, <no-data> 不支持傳入寬高,并且我們無法改動這個第三方組件,只能在列表頁通過 css 覆蓋空白頁組件的樣式。

我們第一時間想到改樣式嘛,這還不簡單,于是寫下:

<style lang="less" scoped>
.no-data{
    img {
        width: 200px;
        height: 200px;
    }
}
</style>

自信滿滿的點開瀏覽器查看效果,發(fā)現(xiàn)設(shè)置的寬高并沒起到作用,空白頁圖片還是默認(rèn)的偏大。

仔細(xì)一想,父組件用了 scoped 是不能直接改子組件內(nèi)樣式的,得用 /deep/ ,于是乎有了下面的代碼:

<style lang="less" scoped>
.no-data{
    /deep/img {
        width: 200px;
        height: 200px;
    }
}
</style>

再查看效果:

image.png

生效了,圖片小了很多!

我們再來審查一下頁面渲染出來的代碼,沒加 /deep/ 的:

image.png

注意看 css 部分,這里的選擇器是 .acl-nodata img[data-v-6a6ef68c] ,這里的 data-v-6a6ef68c 屬性是 <no-data> 組件中的 scoped 生成的。

接著往下看,加上 /deep/ 后的:

image.png

還是重點看 css 部分,這里的選擇器是 .integral-detail .no-data[data-v-f5321cf6] img ,這里的 data-v-f5321cf6 是列表頁的 scoped 生成的。

核心區(qū)別在于: img[data-v-6a6ef68c] .no-data[data-v-f5321cf6] img

/deep/ 原理

通過上面的例子,我們可以分析出,在使用了 /deep/ 選擇器后,會把當(dāng)前元素 img [data-v-6a6ef68c] 干掉,并通過他的父級(準(zhǔn)確的說是 img 元素所屬空白頁組件的根元素 <div ></div> ),來查找到 img ,也就是通過 .no-data[data-v-f5321cf6] img 來定位到 img 元素。

因為我們的代碼是在列表頁寫的,列表頁 hash 出來的屬性是 [data-v-f5321cf6] ,在我們使用 /deep/ 之前, img hash [data-v-6a6ef68c] ,在列表頁中的 css 代碼當(dāng)然是識別不到空白頁組件的 [data-v-6a6ef68c] ,所以修改寬高不生效。使用 /deep/ 之后,通過 .no-data[data-v-f5321cf6] img ,由于 [data-v-f5321cf6] 本身就是列表 hash 出來的,自然是可以識別的,修改寬高自然也就生效了。

為了加深理解,這里再提一點,仔細(xì)看 <div ></div> 這一塊的 html 代碼,你會發(fā)現(xiàn)它是同時具有 [data-v-f5321cf6] [data-v-6a6ef68c] 兩種屬性,因為 <no-data> 組件的根元素是 <div ></div> ,在列表頁引入 <no-data> , <div ></div> 也相當(dāng)于是列表中的一個元素,所以 scoped 也會給它 hash [data-v-f5321cf6] 。 (這一塊在實際開發(fā)中,有些朋友會搞一些騷操作,比如在父組件和子組件同時改 .no-data

以上就是一文徹底搞懂Vue中scoped和/deep/原理的詳細(xì)內(nèi)容,更多關(guān)于Vue scoped和/deep/原理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue中 數(shù)字相加為字串轉(zhuǎn)化為數(shù)值的例子

    vue中 數(shù)字相加為字串轉(zhuǎn)化為數(shù)值的例子

    今天小編就為大家分享一篇vue中 數(shù)字相加為字串轉(zhuǎn)化為數(shù)值的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • VUE3自定義指令防止重復(fù)點擊多次提交的實現(xiàn)方法

    VUE3自定義指令防止重復(fù)點擊多次提交的實現(xiàn)方法

    vue3項目,新增彈框連續(xù)點擊確定按鈕防止多次提交,在按鈕上添加自定義指令,這篇文章主要介紹了VUE3自定義指令防止重復(fù)點擊多次提交的實現(xiàn)方法,需要的朋友可以參考下
    2024-08-08
  • vue中如何下載excel流文件及設(shè)置下載文件名

    vue中如何下載excel流文件及設(shè)置下載文件名

    這篇文章主要介紹了vue中如何下載excel流文件及設(shè)置下載文件名,對vue感興趣的同學(xué),可以參考下
    2021-05-05
  • vue使用國密SM4進(jìn)行加密、解密的過程

    vue使用國密SM4進(jìn)行加密、解密的過程

    國密SM4算法是一種對稱加密算法,適用于對稱密鑰加密和解密的場景,這篇文章主要介紹了vue使用國密SM4進(jìn)行加密、解密,需要的朋友可以參考下
    2023-07-07
  • Vue3中事件總線的具體使用

    Vue3中事件總線的具體使用

    本文主要介紹了Vue3中事件總線的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Vue3進(jìn)行打包配置的優(yōu)化指南

    Vue3進(jìn)行打包配置的優(yōu)化指南

    隨著 Vue3 項目的業(yè)務(wù)迭代,打包體積過大、首屏加載緩慢逐漸成為影響用戶體驗的核心問題,本文將詳細(xì)介紹如何通過精細(xì)化的打包配置,實現(xiàn)代碼分包、剔除冗余 Console 日志,并結(jié)合最佳實踐,幫助你將項目打包體積縮減 70%,首屏加載速度提升 60%
    2026-06-06
  • Vue2.x配置路由導(dǎo)航守衛(wèi)實現(xiàn)用戶登錄和退出

    Vue2.x配置路由導(dǎo)航守衛(wèi)實現(xiàn)用戶登錄和退出

    之前在Vue的學(xué)習(xí)中通過路由導(dǎo)航守衛(wèi)控制實現(xiàn)了用戶登錄模塊的功能,本文基于Vue2.x進(jìn)行實現(xiàn),在此將實現(xiàn)過程進(jìn)行記錄與總結(jié),感興趣的可以了解一下
    2021-08-08
  • Vue鼠標(biāo)右鍵畫矩形和Ctrl按鍵多選組件方式

    Vue鼠標(biāo)右鍵畫矩形和Ctrl按鍵多選組件方式

    文章介紹了一個Vue組件,該組件允許用戶通過鼠標(biāo)右鍵在畫布上繪制矩形,并且支持通過Ctrl鍵進(jìn)行多選,文章附帶了組件代碼和一個示例,建議讀者將代碼復(fù)制到自己的開發(fā)環(huán)境中進(jìn)行調(diào)試
    2024-12-12
  • vue3聲明字段名為枚舉的類型詳解

    vue3聲明字段名為枚舉的類型詳解

    這篇文章主要介紹了vue3聲明字段名為枚舉的類型方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue props 一次傳多個值實例

    vue props 一次傳多個值實例

    這篇文章主要介紹了vue props 一次傳多個值實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07

最新評論

无锡市| 都江堰市| 广河县| 敦煌市| 萨嘎县| 平乡县| 泊头市| 平阴县| 襄垣县| 阳春市| 西林县| 广安市| 通河县| 德格县| 宽甸| 大荔县| 明星| 博兴县| 长垣县| 城市| 响水县| 河北省| 虞城县| 金塔县| 凉城县| 郎溪县| 灵璧县| 宁波市| 大连市| 嘉义县| 景泰县| 建湖县| 抚远县| 孟村| 扎鲁特旗| 宝山区| 乳源| 金沙县| 社会| 永康市| 滦南县|