当然这个问题也是可以解决的,就是直接加全局样式可以修改到,但这势必会影响全部地方的组件;所以需要另外一种方法在content.vue组件内再加一个不带scoped属性的style标签,也就意味着要加两个style,一个用于私有样式,一个用于共有样式。这肯定是有点shit的,并且这两种解决方案都回避不了一个问题:权重!!!
//content.vue <template> <div class="content"> <p class="title"></p> <!-- v-button假设是上面定义的组件 --> <v-button></v-button> </div> </template> ... <style scoped> .content{ width: 1200px; margin: 0 auto; } </style> <style> .content .button{ border-raduis: 5px; } </style>
这样符合规范么?貌似没看到不能这么写,并且这么写也确实生效了。。。但这样确实增加了思维的复杂度,有点苦恼啊。
总结scoped的渲染规则
总结一下scoped三条渲染规则
- 给HTML的DOM节点加一个不重复data属性(形如:data-v-2311c06a)来表示他的唯一性
- 在每句css选择器的末尾(编译后的生成的css语句)加一个当前组件的data属性选择器(如[data-v-2311c06a])来私有化样式
- 如果组件内部包含有其他组件,只会给其他组件的最外层标签加上当前组件的data属性
解决方案
对于引用的三方库,如果对方使用了scoped,我们无力改变什么,如果确实需要修改他的样式最能在不加scoped的组件中修改样式,或者全局样式直接修改,这很粗暴!
对于自己维护的组件,一定要想清楚,组件的样式能否满足所有的情况。如果确实需要加,无疑会增加使用这个组件的开发同学的工作!
当然对于这个问题,如果诸君有更好的解决方案,请诸君TELL ME一下下!
趣事
<del> 在使用scoped一定要谨慎scoped的这个特性,本人以为这是一个BUG,就去提了issue </del>,结果尤大很霸气的回复
scoped设计的初衷就是不能让当前组件的样式修改其他任何地方的样式,因为设计如此。所以理所当然的这个issue已被干掉
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持黑区网络。