vue中style scope深度访问方式

作者 : 开心源码 本文共1943个字,预计阅读时间需要5分钟 发布时间: 2022-05-13 共213人阅读

背景:
vue-cli3.0项目中需要修改element-ui collapse collapse-item 的样式(背景色等),template简单如下:

  <el-collapse class="my-collapse">      <el-collapse-item title="分类1" name="1" class="plugins-collapse-item">        <span>分类1</span>      </el-collapse-item>      <el-collapse-item title="分类2" name="2">       <span>分类2</span>      </el-collapse-item>    </el-collapse>

试了scoped局部样式,完全不生效。

<style lang="scss" scoped> .el-collapse-item {    .el-collapse-item__header {      background: #262720;      color: #ffffff;      height: 24px;      line-height: 24px;      font-size: 12px;      border-bottom: 1px solid #4b4c44;      display: flex;      flex-direction: row-reverse;      justify-content: flex-end;      .el-collapse-item__arrow {        margin: 0;        margin-right: 5px;      }    }    .el-collapse-item__wrap {      background: #262720;      border-bottom: 1px solid #4b4c44;      color: #ffffff;      .el-collapse-item__content {        color: #ffffff;        padding-bottom: 0;        line-height: 18px;      }    }  }</style>

去掉scoped,写在全局样式里,生效了!

<style lang="scss">///上述代码</style>

第一次试全局样式没生效,找到起因:没写父类class .el-collapse-item,层级加载顺序出了问题,样式被覆盖了。

尽管全局样式可以处理,但是不想写在全局样式里,怎样办呢?找到了Deep Selectors,可以在父组件中修改子组件的样式,那咱就来尝个鲜吧。

  • 在css中,使用 >>>
<style > .el-collapse-item >>> .el-collapse-item__header {  background: #262720;  color: #ffffff;  height: 24px;  line-height: 24px;  font-size: 12px;  border-bottom: 1px solid #4b4c44;  display: flex;  flex-direction: row-reverse;  justify-content: flex-end;}.el-collapse-item >>> .el-collapse-item__wrap {  background: #262720;  border-bottom: 1px solid #4b4c44;  color: #ffffff;} </style>
  • 在无法正确解析>>>的预解决器中(例如sass)使用 /deep/ or ::v-deep
.el-collapse-item {    ::v-deep .el-collapse-item__header {      background: #262720;      color: #ffffff;      height: 24px;      line-height: 24px;      font-size: 12px;      border-bottom: 1px solid #4b4c44;      display: flex;      flex-direction: row-reverse;      justify-content: flex-end;      .el-collapse-item__arrow {        margin: 0;        margin-right: 5px;      }    }    ::v-deep .el-collapse-item__wrap {      background: #262720;      border-bottom: 1px solid #4b4c44;      color: #ffffff;      .el-collapse-item__content {        color: #ffffff;        padding-bottom: 0;        line-height: 18px;      }    }  }

编译后的结果:

/deep/ or ::v-deep

实现逻辑在插件component-compiler-utils里,附上component-compiler-utils解析scope的源码:

scope解析

参考:
vue中style scope深度访问新方式(::v-deep)

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » vue中style scope深度访问方式

发表回复