scoped作用域
在vue中,我们为了避免父组件的样式影响到子组件的样式,会在style中加
父组件:
<template>
<div>
<h1 class="title">{{ name }}</h1>
<input type="text" v-model.lazy="name" />
<child />
</div>
</template>
<script>
import child from "./child";
export default {
data() {
return {
name: "",
};
},
components: {
child,
},
};
</script>
<style scoped>
.title {
color: #ff0;
}
</style>
子组件:
<template>
<div>
<h1 class="title">child</h1>
</div>
</template>
<script>
export default {};
</script>
<style scoped>
.title {
color: #f00;
}
</style>
我们在加了 scoped 之后样式会自动添加一个hash值,如下:
.title[data-v-211e4c4a] {
color: #ff0;
}
但是这样也存在着一个问题,比如你使用了别人的组件或者自己开发一个组件,有时候你修改一处就可能影响到别的地方,这个时候要么你不用别人的组件,自己重新封装一个,但很多时候是不太现实的,所以就需要有一个方法或者方式,既不影响到别的地方,又能修改子组件在当前的样式。
深度作用选择器 /deep/和>>>和::v-deep
使用了外届的组件或者自己开发一个组件,修改一处就可能会影响到用这个组件的所有样式,所以就需要有一个方法或者方式,既不影响到别的地方,又能修改子组件在当前的样式。/deep/就能实现
>>>
只作用于css,不支持css预加载器(less/scss)
是/deep/的简写形式,适用于Vue2.x版本,Vue3.x版本使用会报错
/deep/
仅适用于Vue2.x版本
支持css预加载器
::v-deep
Vue3.x的深度作用选择器正式写法
例如
<style scoped>
/deep/ .title {
color: #f00;
}
</style>
<style scoped>
>>> .title {
color: #f00;
}
</style>
<style scoped>
::v-deep .title {
color: #f00;
}
</style>
注意
VUE3.0下/deep/的使用可能会有报错,如果/deep/报错,可采用::v-deep
项目中用到了预处理器 scss 、sass、less,操作符 >>> 可能会因为无法编译而报错 。可以使用 /deep/
总结
Vue2.x版本使用优先级/deep/,>>>
Vue3版本使用::v-deep