Vue 中,父组件使用了 scoped,为什么操作子组件的非根节点样式就不生效了!

本文探讨了Vue中使用`scoped`属性时,父组件样式无法影响子组件的问题。当添加`scoped`后,Vue会为每个组件的样式添加唯一属性,导致父组件样式无法直接作用于子组件。解决这个问题可以使用`/deep/`或`>>>`深度选择器,以避免复合选择器的影响,使得父组件样式能够穿透到子组件。了解这一机制对于优化Vue项目的样式隔离和管理至关重要。
摘要由CSDN通过智能技术生成

不加 scoped

父组件 App.vue

<template>
  <div class="app">
    <HelloWorld />
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue';

export default {
  name: 'App',
  components: {
    HelloWorld,
  },
};
</script>

<style lang="less">
// 在父组件中操作子组件的样式,没什么问题,正常生效!
h1 {
  background-color: pink;
}
</style>

子组件 HelloWorld.vue

<template>
  <div class="hello">
    <h1>Hello World</h1>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  }
}
</script>

编译后的样式和结构如下图,h1 背景颜色变粉,合情合理!

在这里插入图片描述

加 scoped

父组件 App.vue

<style lang="less" scoped>
h1 {
  background-color: pink;
}
</style>

编译后的样式和结构如下图,h1 背景没有生效!

在这里插入图片描述

原因解释

加了 scoped 后

1、Vue 会给当前组件的所有节点以及子组件的根节点加上一个唯一的属性

2、编译后的样式也都会以复合选择器(属性选择器)的形式自动加上这个属性

3、例如你写的 h1 { background-color: pink; },本意是操作子组件的 h1 标签,实际编译后的样式可能是 h1[data-v-7ba5bd90] { background-color: pink; } ,但是!子组件的 h1 节点并没有这个属性,所以 h1[data-v-7ba5bd90] { background-color: pink; } 并不会命中 h1 标签,所以不会生效!

怎么解决

父组件 App.vue

<style lang="less" scoped>
/deep/ h1 {
  background-color: pink;
}
</style>

解决原理,保证编译后的 h1 样式不被加复合选择器(属性选择器),编译结果如下图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

当铺鬼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值