vue中深度选择器

Posted 喝西瓜汁的兔叽Yan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue中深度选择器相关的知识,希望对你有一定的参考价值。

scoped的作用

scoped
可以使当前的样式只在自己当前的组件内起作用。为了防止在一个组件内引入了子组件,而子组件没有加scoped。这个时候如果父子组件有相同的类名,就会产生样式的影响。
原理:
加了scoped就相当于给当前组件所有的标签添加一个【data-v-hash】的属性,而vue中采用的是属性选择器的方式来进行解析,具体解析如下图:

<style scoped>
</style>

scoped对父子组件的影响

首先,我定义了一个父组件和子组件(child)

父组件:

子组件(加了scoped):

效果:
我们可以看到,子组件加了scoped后,父组件对h3的css样式就不会影响到子组件,如果子组件没加scoped,就会影响到也变成红色。

那么,我们就是想在子组件有scoped的情况下,影响到子组件的样式怎么办?就引出了深度选择器

深度选择器

首先,我们来认识下三个深度选择器:

原生css: >>> (在没有用less/scss的时候使用)
less: /deep/
scss: ::v-deep(如果使用了预处理器都可以使用这个(推荐))

我们上面的实例没有用到scss和less,所以我们使用>>>

效果:
子组件也变成了红色

附加:

/deep/
如果项目中用到了预处理器 sass less scss 会因为无法编辑而报错 可以使用/deep/
注意:vue-cli3以上版本不可以

<style lang="scss" scoped>
/*用法1*/
.a 
 /deep/ .b  
  /* ... */
 
 
/*用法2*/
.a /deep/ .b  
  /* ... */
 
</style>

::v-deep 如果使用了预处理器都可以使用

<style lang="scss" scoped>
/*用法1*/
.a
 ::v-deep .b  
  /* ... */
 
 
/*用法2*/
.a ::v-deep .b 
  /* ... */

</style>

注意:

我们深度处理器经常用在这样的情况:
例如你使用了ElementUI的走马灯(轮播图)组件,你想修改其中的样式,但是你设置样式不起作用,这个时候就是因为组件的scoped的影响。
解决办法:
1.不妨试试我们的深度处理器吧。(推荐)
2.将 scoped 移除。
3.新建一个没有 scoped 的 style(一个.vue文件允许多个style),如下:

<style scoped>
	//有scoped的style,此处放当前组件的css代码
</style>

<style>
//没有scoped的style,此处放修改ElementUI轮播图的css
</style>

Vue2、Vue3中 CSS 穿透(深度选择器)

参考技术A // 插槽选择器
:slotted()
// 全局选择器
:global()

以上是关于vue中深度选择器的主要内容,如果未能解决你的问题,请参考以下文章

Angular和Vue.js 深度对比

Vue自学笔记(1)引入vue.js步骤

Vue.js 创建选择器,显示来自选定数据集的数据

04 Vue Router路由管理器

vue 笔记(十三)vue-router

Vue之路由