vue如何快速修改第三方组件的样式 -- 样式穿透 以及 data-v-xxx


前言

在前端开发的过程中,经常需要引用第三方的插件,同时需要改变第三方插件的样式。在改第三方插件个过程中会出现样式不生效的问题,如何才能有效的改掉第三方插件的样式呢?


一、问题描述

在开发过程中遇到的应用场景是要隐藏该树组件前的单选按钮,这棵树采用的第三方插件是vxe-table。
在这里插入图片描述
HTML结构如下:
在这里插入图片描述
将这一段话复制到style中,并将dispaly改成 none。
结果发现不生效。

<style lang="scss" scoped>
	.vxe-table .vxe-cell--radio .vxe-radio--icon{
        display: none;
    }
</style>

在这里插入图片描述
为什么会不生效呢?归根结底是由于vue中样式的隔离机制,scoped

<style lang="scss" scoped>

scope

  • 在vue组件中,为了使样式私有化(模块化),不对全局造成污染,可以在style标签上添加scoped属性以表示它的只属于当下的模块。
  • 添加了scoped属性的组件,为了达到组件样式模块化,做了两个处理:
    • 给HTML的DOM节点加一个不重复data属性(形如:data-v-xxx)来表示他的唯一性。
    • 在每句css选择器的末尾(编译后的生成的css语句)加一个当前组件的data属性选择器(如[data-v-2311c06a])来私有化样式。

css样式有一个优先级的说法,scoped的这一操作,虽然达到了组件样式模块化的目的,但是会造成一种后果:每个样式的权重加重了。理论上我们要去修改这个样式,需要更高的权重去覆盖这个样式。这是增加复杂度的其中一个维度。

二、解决方案

样式穿透

  • 样式穿透格式
外层Class >>> 第三方组件样式 {
}
  • 怎么确认外层Class是哪一个呢,找dom结构中最近的date-v。在下图中就是:
    在这里插入图片描述

按照上述思路,代码如下:

<style lang="scss" scoped>
	.vxe-table >>> .vxe-cell--radio .vxe-radio--icon{
        display: none;
    }

    .vxe-table >>> .is--checked.vxe-cell--radio .vxe-radio--checked-icon {
        display: none;
    }
</style>
  • 为了避免对全局的样式造成污染,对上述代码进行了优化。在外层又手动的包了一层class,然后再进行样式穿透。
<style lang="scss" scoped>
	.vxe-table-content >>> .vxe-table .vxe-cell--radio .vxe-radio--icon{
        display: none;
    }

	.vxe-table-content >>> .vxe-table .is--checked.vxe-cell--radio .vxe-radio--checked-icon {
        display: none;
    }
</style>

data-v-xxx

这是在标记vue文件中css时使用scoped标记产生的,因为要保证各文件中的css不相互影响,给每个component都做了唯一的标记,所以每引入一个component就会出现一个新的’data-v-xxx’标记,第三方组件内部不会出现data-v-xxx的标记

在这里插入图片描述


总结

以上就是vue如何快速修改第三方组件样式的全部思路。重点理解 样式穿透 以及data-v-xxx的相关知识点。若描述有误,请指正。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值