关于vue的scoped和v-deep的那件事

之前没有接触过::v-deep/deep/>>>这些深度选择器,但是考虑到最近接触到的项目封装程度比较高,所以有时候在改动公共组件而不影响其他地方使用的时候,这些东西就能起到作用了。除了深度选择器,也还可以利用父传子传参数进行实现,当然,这很暴力qwq。

例如:

  1. 直接设置一个custom-style的属性,然后进行传递style值:{width:"100px"}
  2. 假如用的是windicss这类原子化css框架的话,也可以传递类名:w-[100px]
  3. 第三种方法就行利用深度选择器了。

使用

在使用深度选择器的时候,需要先设置一个parent类,然后在进行针对子组件编写style样式。

javascript 复制代码
// parent.vue-template
<div class="parent">
  <child></child>
</div>

// child.vue-template
<div class="child">child</div>

然后再在parent组件里面编写style样式

xml 复制代码
<style lang='scss'>
  .parent {
  	&::v-deep(.child) {
      color: "red";
    }
  }
</style>

这个时候就基本上使用成功了。

原理

什么是scoped?

在了解它如何工作之前,得需要先了解一下vuescoped是如何隔离命名冲突 的。在进行对vuestyle添加完scoped属性后,vue在进行编译的期间,会将单文件组件的唯一哈希进行绑定到css选择器上。例如:.child[data-v-xxx],打开f12查看网页的html也可以看见vue组件的盒子会多一个属性。如图所示:

当有了这个玩意后,vue在编译style的时候,进行判断是否添加了scoped,如果有,就将此哈希进行添加到所有选择器上去,从而实现样式隔离。

加了 scoped

没加 scoped

详细原理可以看这篇文章:知乎-vue的scoped原理

深度选择器是如何工作的?

当了解完scoped后,deep就很简单了,原理跟scoped差不多,也是利用scopedId进行,但是不通的是:

  • scoped是给自己的style加并且是给最后一个选择器进行加。
  • deep是给父级加,子不加。

看代码和图就懂了

xml 复制代码
<template>
  <div class="text">
    text
    <p class="p">p标签</p>
  </div>
</template>

<style scoped>
.text .p {
  color: red;
}
</style>

xml 复制代码
<script setup name="parent">
import child from './components/child.vue'
</script>

<template>
  <div class="flex flex-col h-screen  w-screen parent justify-center items-center">
    <child  msg="Vite + Vue" />
  </div>
</template>

<style scoped lang="scss">

.parent {
  &::v-deep(.text) .p{
    color: #f0f;
  }
} 
</style>

看见两个的差别了没,一个是.text .p[data-v-xxx]另外一个是.text[data-v-xxx] .text .p,前者的权重为[0,3,0],后者权重为[0,4,0]。也就是这里值得特定性。所以浏览器会使用深度选择器所指定的样式。但是如果子组件内部用了!important,那这个特定性 就是[1,0,2,0]了,比deep所指定的要大了。就改不动了。除非你deep的地方也加!important

最后

大致分享就这些了,这只是我个人学习的记录,希望对你们有帮助,如有说的不对,也希望大佬评价进行指错。

相关推荐
Z思学几秒前
promise 有几种状态 async/await 和promise 有什么关系
前端
han_2 分钟前
JavaScript设计模式(四):发布-订阅模式实现与应用
前端·javascript·设计模式
27669582924 分钟前
租车帮(悟空)订单查询算法分析
java·服务器·前端·悟空·悟空app·租车帮·租车帮逆向
__雨夜星辰__16 分钟前
TypeScript 入门学习笔记(面向对象 + 常用设计模式)
前端·学习·typescript
晚霞的不甘31 分钟前
HarmonyOS ArkTS 进阶实战:深入理解边距、边框与嵌套布局
前端·计算机视觉·华为·智能手机·harmonyos
_野猪佩奇_牛马版31 分钟前
ReACT Agent 开发知识点总结
前端
牛奶43 分钟前
你发送的消息,微信到底怎么送到的?
前端·websocket·http
酉鬼女又兒1 小时前
零基础快速入门前端DOM 元素获取方法详解:从代码到实践(可用于备赛蓝桥杯Web应用开发)
前端·javascript·职场和发展·蓝桥杯·js
牛奶1 小时前
为什么关掉浏览器再打开,你还是登录状态?
前端·网络协议·https
bjxiaxueliang1 小时前
一文掌握Python aiohttp:异步Web开发从入门到部署
开发语言·前端·python