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

Vue中的scoped和 elememt-plus的樣式修改方法

 更新時間:2025年01月16日 10:31:52   作者:xuxuejian9824  
Vue中的scoped屬性用于實現(xiàn)樣式隔離,確保組件間的樣式互不影響,通過在組件的style標簽內(nèi)添加任何內(nèi)容,可以為組件生成一個唯一的哈希值,從而實現(xiàn)樣式的定位,本文通過實例代碼講解Vue中的scoped和 elememt-plus的樣式修改方法,感興趣的朋友一起看看吧

1. style的scoped屬性

scoped屬性是為了實現(xiàn)樣式隔離,使得組件之間的樣式互不影響。
現(xiàn)在我們有
組件A.vue

<template>
  <div class="wrapper">
    <el-statistic :value="output[0]" prefix="¥" />
    <div class="mt-1 title">本月銷售總額</div>
  </div>
</template>
<!-- js代碼省略,用不到 -->
<style scoped lang="scss"></style>

這個組件是一個單根組件,外層有一個div包裹,class=wrapper,內(nèi)部使用了element-plus的數(shù)據(jù)統(tǒng)計組件el-statistic
這個組件渲染出的DOM元素如下:

可以發(fā)現(xiàn)此時,只有外層容器wrapper上有哈希值:data-v-447f2f22,實際上這個哈希值是A組件父組件的哈希值,如下:

當(dāng)前的A組件并沒有生成自己的哈希值data-v-xxx,現(xiàn)在只要我們在style內(nèi)部寫入樣式代碼,即使是注釋代碼也行,就可以生成A組件自己的哈希值。如下:

<style scoped lang="scss">
//
</style>

這時候A組件生成了自己的哈希值:data-v-d48692a9(我們暫時不考慮父組件的哈希值)?,F(xiàn)在如果我要選中wrapper容器,設(shè)置背景色,就可以有如下代碼:

<style scoped lang="scss">
//
.wrapper {
  background-color: coral;
}
</style>

實際的選擇器為:

就是把A組件自帶的哈希值data-v-d48692a9,加到了選擇器上,使用了類選擇器加上屬性選擇器,選中了wrapper容器。如果選擇內(nèi)部的元素,比如 文本 本月銷售總額,scss代碼如下:

<style scoped lang="scss">
//
.wrapper {
  background-color: coral;
  .title {
    color: red;
  }
}
</style>

對應(yīng)的DOM元素為:

實際的css選擇器為:

.wrapper .title[data-v-d48692a9] {
    color: red;
}

編譯機制解析

.wrapper .title的實際編譯結(jié)果是.wrapper .title[data-v-d48692a9]。
在Vue的scoped樣式機制處理后代選擇器時,會將data-v-*作用于選擇器的最右側(cè)部分(即目標元素),而不是每一級都添加。不僅是目標元素,同時還要是當(dāng)前組件內(nèi)部的元素,才會添加這個data-v-*

瀏覽器在運行時會從右到左解析選擇器。

結(jié)合scoped編譯機制瀏覽器匹配機制,就可以理解為為什么可以選中對應(yīng)的元素。

如果最后的目標元素,不是當(dāng)前組件內(nèi)部的元素,比如是子組件內(nèi)部的DOM元素,則 Vue 不會為該元素附加當(dāng)前組件的 data-v-* 標識。當(dāng)然,樣式匹配不到目標元素。

2. :deep()

:deep() 的作用是讓特定的樣式可以穿透到子組件的 DOM 中,作用于子組件的某些元素。
比如我們希望在父組件中修改子組件的樣式。
示例代碼:

子組件test.vue:
<template>
  <div class="test">這里是test組件,是子組件</div>
</template>
<style scoped></style>

在父組件A中使用這個組件:

父組件A.vue:
<template>
  <div class="wrapper">
    <el-statistic :value="output[0]" prefix="¥" />
    <div class="mt-1 title">本月銷售總額</div>
    <!-- 引入子組件 -->
    <test></test>
  </div>
</template>

現(xiàn)在我在A組件的樣式文件中,選擇test組件中根元素div class="test",是可以選中的。

<style scoped lang="scss">
.wrapper {
  background-color: coral;
  .title {
    color: red;
  }
}
//test子組件
.test {
  color: blue;
}
</style>

能選中的原因是因為,test組件的根元素上存在著父組件Adata-v-d48692a9哈希值:

根據(jù)scoped樣式機制,針對選擇器.test,他選中的元素是在當(dāng)前組件A.vue中的,同時也是目標元素,那么就給這個選擇器加上了哈希值data-v-d48692a9,變成.test[data-v-d48692a9],這樣正好可以選中。

如果我們的test組件中還有其它嵌套的DOM,我們還是這樣選擇,可以選中嗎?

test.vue
<template>
  <div class="test">
    這里是test組件,是子組件
    <div class="test-inner">test內(nèi)部</div>
  </div>
</template>
//A組件的style
<style scoped lang="scss">
.wrapper {
  background-color: coral;
  .title {
    color: red;
  }
}
.test {
  color: blue;
  .test-inner {
    font-size: 30px;
    color: green;
  }
}
</style>

這樣是不能生效的,如圖。

原因是因為:在這種父子嵌套的結(jié)構(gòu)中,子組件是一個單根組件,那么這個子組件的根元素上就會帶著父組件的哈希值,但是其內(nèi)部的DOM并不會帶上,如圖:

這也就意味著,子組件的根元素是在渲染父組件中的,所以有父組件的哈希值,但是子組件內(nèi)部的dom元素,是屬于子組件
那么我們寫的這個選擇器,理論上是.test .test-inner[data-v-d48692a9],雖然.test-inner是目標元素,但他不是A.vue組件內(nèi)部的元素,他沒有data-v-d48692a9屬性,vue也不會把data-v-d48692a9附加到.test-inner上。

這時候就輪到了:deep()登場了。
如果我們把A組件中的樣式代碼改為:

.test {
  color: blue;
  :deep(.test-inner) {
    font-size: 30px;
    color: green;
  }
}

效果如圖

我們查看css選擇器如下:

根據(jù)GPT的回答,和我自己的總結(jié),
加上:deep()以后,用來表示當(dāng)前樣式應(yīng)該跳過 scoped 的作用域限制,因此編譯后其選擇器部分不會附加 data-v-*,意味著不要編譯為.test-inner[data-v-*]的形式,而是保留為.test-inner的形式。

然后vue的scoped樣式機制是針對你的選擇器,從左向右的添加data-v-*的,從左向右開始找,找到你的目標元素,同時也是當(dāng)前組件的內(nèi)部元素,就會添加這個data-v-*,因為這針對目標元素,所有只會有一個元素被添加這個哈希值。
比如.test :deep(.test-inner),deep的作用是告訴vue不給.test-inner添加哈希值,但是他是目標元素啊,不給他加就會給他的最近的祖先(猜的),同時還是當(dāng)前組件內(nèi)部的元素添加,這里就是.test元素,也就有了上面的編譯結(jié)果。

那如果沒有祖先呢,比如:

:deep(.test) {
  color: red;
}

實際編譯后的css為[data-v-d48692a9] .test
首先.test是A組件內(nèi)部的元素,也是目標元素,但是加上deep則是告訴vue不要給他加哈希值,這個選擇器又沒有父級,這時就會直接添加[data-v-d48692a9] 相當(dāng)于選中所有的帶有這個屬性的元素。

deep的用途就是用來在父組件中修改子組件內(nèi)部元素的樣式,所以通常是用來修改組件庫內(nèi)部的樣式的,針對我們自己的組件,直接在組件中修改樣式就行了,基本用不到deep。

3. 使用el-statistic組件,并修改樣式

組件代碼:

<template>
  <div class="wrapper">
    <el-statistic :value="output[0]" prefix="¥" />
    <div class="mt-1 title">本月銷售總額</div>
  </div>
</template>
<style scoped lang="scss">
.wrapper {
  background-color: lightgrey;
}
</style>

el-statistic現(xiàn)在就是一個組件,作為當(dāng)前組件的子組件,被引入進來,現(xiàn)在我們的需求是將目前的樣式:

修改為下面的樣式:

假如直接添加類class="statistic",然后添加樣式,實際是不生效的,如下:

 <el-statistic :value="output[0]" prefix="¥" class="statistic" />
<style scoped lang="scss">
.statistic {
  color: #fff;
}
</style>

查看元素:

可以看到符號和數(shù)字74811并不是statistic元素的直接文本,有其它盒子包裹了這個文本。當(dāng)前的樣式選中的元素是class=el-statistic statisticdiv。實際上我們需要選中的是這個子組件內(nèi)部的元素:el-statistic__prefix內(nèi)部的span元素,所有首先我們需要選中el-statistic__prefix元素,這個邏輯正好就是在父組件中選中子組件內(nèi)部的元素,所以這里使用:deep()可以生效。

.el-statistic {
  color: green;
  :deep(.el-statistic__prefix) {
    color: blue;
  }
  :deep(.el-statistic__number) {
    color: red;
  }
}

到此這篇關(guān)于Vue中的scoped和 elememt-plus的樣式修改的文章就介紹到這了,更多相關(guān)Vue scoped和 elememt-plus樣式修改內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何查看vue項目的node版本

    如何查看vue項目的node版本

    文章總結(jié):查看Vue項目中使用的Node版本,特別是當(dāng)項目使用Yarn和TypeScript時,可以通過查看yarn.lock文件中的@types/node@version來確定版本
    2025-01-01
  • 使用Element ui Table組件動態(tài)控制列的顯示隱藏方式

    使用Element ui Table組件動態(tài)控制列的顯示隱藏方式

    這篇文章主要介紹了使用Element ui Table組件動態(tài)控制列的顯示隱藏方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • 解決新建一個vue項目過程中遇到的問題

    解決新建一個vue項目過程中遇到的問題

    這篇文章主要介紹了解決新建一個vue項目過程中遇到的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • vue項目Network: unavailable的問題及解決

    vue項目Network: unavailable的問題及解決

    這篇文章主要介紹了vue項目Network: unavailable的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Vue3+Canvas實現(xiàn)坦克大戰(zhàn)游戲(二)

    Vue3+Canvas實現(xiàn)坦克大戰(zhàn)游戲(二)

    本文主要給大家講解一下子彈擊中物體、物體銷毀、敵方坦克構(gòu)建生成、運動算法、爆炸效果、以及障礙物的生成,感興趣的小伙伴可以了解一下
    2022-03-03
  • Vue.js原理分析之nextTick實現(xiàn)詳解

    Vue.js原理分析之nextTick實現(xiàn)詳解

    這篇文章主要給大家介紹了關(guān)于Vue.js原理分析之nextTick實現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Vue使用echarts可視化組件的方法

    Vue使用echarts可視化組件的方法

    這篇文章主要介紹了Vue使用echarts可視化組件的方法,本文通過實例代碼案例給大家詳細介紹,需要的朋友可以參考下
    2021-07-07
  • Vue中的vue-resource示例詳解

    Vue中的vue-resource示例詳解

    Vue與后臺Api進行交互通常是利用vue-resource來實現(xiàn)的,本質(zhì)上vue-resource是通過http來完成AJAX請求相應(yīng)的。這篇文章主要介紹了Vue中的vue-resource示例詳解,需要的朋友可以參考下
    2018-11-11
  • 基于VUE.JS的移動端框架Mint UI的使用

    基于VUE.JS的移動端框架Mint UI的使用

    本篇文章主要介紹了基于VUE.JS的移動端框架Mint UI的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Vue腳手架模式與環(huán)境變量示例詳解

    Vue腳手架模式與環(huán)境變量示例詳解

    在Vue開發(fā)中環(huán)境變量管理是構(gòu)建多環(huán)境配置的核心技術(shù),這篇文章主要介紹了Vue腳手架模式與環(huán)境變量的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-11-11

最新評論

通许县| 淳安县| 吉林市| 确山县| 邹城市| 林芝县| 禹城市| 东乡| 沙湾县| 襄汾县| 集安市| 林芝县| 冀州市| 周口市| 湘潭市| 清徐县| 郸城县| 冷水江市| 宜良县| 铁岭县| 宝应县| 柘荣县| 长宁区| 民和| 当雄县| 凤翔县| 东安县| 安义县| 宽城| 赫章县| 大冶市| 若羌县| 巩义市| 莱西市| 大方县| 麻阳| 兰西县| 新安县| 容城县| 酉阳| 马关县|