欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 前端技术 > vue >内容正文

vue

vue中style的scoped属性的设计方式

发布时间:2023/12/31 vue 56 豆豆
生活随笔 收集整理的这篇文章主要介绍了 vue中style的scoped属性的设计方式 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

vue中style的scoped属性这里是怎实现的呢?

scoped三条渲染规则

  • 给HTML的DOM节点加一个不重复data属性(形如:data-v-2311c06a)来表示他的唯一性
  • 在每句css选择器的末尾(编译后的生成的css语句)加一个当前组件的data属性选择器(如[data-v-2311c06a])来私有化样式
  • 如果组件内部包含有其他组件,只会给其他组件的最外层标签加上当前组件的data属性

  • 一个简单组件例子:

    //button.vue <template><div class="button-warp"><button class="button">text</button></div> </template> ... <style scoped>.button-warp{display:inline-block;}.button{padding: 5px 10px;font-size: 12px;border-radus: 2px;} </style>

    浏览器渲染组件

    HTML

    <div data-v-2311c06a class="button-warp"><button data-v-2311c06a class="button">text</button> </div>

    CSS

    .button-warp[data-v-2311c06a]{display:inline-block; } .button[data-v-2311c06a]{padding: 5px 10px;font-size: 12px;border-radus: 2px; }

    从上面的字可以看出,添加了scoped属性的组件,为了达到组件样式模块化,做了两个处理:

    • 给HTML的DOM节点加一个不重复data属性(形如:data-v-2311c06a)来表示他的唯一性
    • 在每句css选择器的末尾(编译后的生成的css语句)加一个当前组件的data属性选择器(如[data-v-2311c06a])来私有化样式

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


    其他组件引用button组件

    上面分析了单个组件渲染后的结果,那么组件互相调用之后会出现什么样的结果呢?,具体分两种情况:模块一般组件引用模块私有组件(本质和模块私有组件引用模块一般组件一样);模块私有组件引用模块私有组件。

    举个例子:在组件content.vue中使用了button组件,那么content.vue组件是否添加scoped属性渲染出来的结果有什么区别呢?

    //content.vue <template><div class="content"><p class="title"></p><!-- v-button假设是上面定义的组件 --><v-button></v-button></div> </template> ... <style>.content{width: 1200px;margin: 0 auto;}.content .button{border-raduis: 5px;} </style>

    模块一般组件(未添加scoped)引用模块私有组件(渲染后)

    如果style上没有加scoped属性,那么渲染出来html和css分别就是:
    HTML

    <div class="content"><p class="title"></p><!-- v-button假设是上面定义的组件 --><div data-v-2311c06a class="button-warp"><button data-v-2311c06a class="button">text</button></div> </div>

    CSS

    /*button.vue渲染出来的css*/ .button-warp[data-v-2311c06a]{display:inline-block; } .button[data-v-2311c06a]{padding: 5px 10px;font-size: 12px;border-radus: 2px; } /*content.vue渲染出来的css*/ .content{width: 1200px;margin: 0 auto; } .content .button{border-raduis: 5px; }

    可以看出,虽然在content组件中,修改了button的border-raduis属性,但是由于权重关系,生效的依然是组件内部的样式(此时是外部的样式被覆盖)。所以如果要达到修改样式的目的,就必须加重我们要修改样式的权重(增加选择器层级,ID选择器,并列选择器,impotant等)


    模块私有组件(添加scoped)引用模块私有组件

    如果加了scoped属性呢?按照开始分析出来的规则(事实也是这么的):
    首先是在所有的DOM节点加上data属性
    然后在css选择器尾部加上data属性选择器

    那么渲染出来html和css分别就是:

    <div data-v-57bc25a0 class="content"><p data-v-57bc25a0 class="title"></p><!-- v-button假设是上面定义的组件 --><div data-v-57bc25a0 data-v-2311c06a class="button-warp"><button data-v-2311c06a class="button">text</button></div> </div> /*button.vue渲染出来的css*/ .button-warp[data-v-2311c06a]{display:inline-block; } .button[data-v-2311c06a]{padding: 5px 10px;font-size: 12px;border-radus: 2px; } /*content.vue渲染出来的css*/ .content[data-v-57bc25a0]{width: 1200px;margin: 0 auto; } .content .button[data-v-57bc25a0]{border-raduis: 5px; }

    原文链接:https://segmentfault.com/a/1190000012184604?utm_source=tuicool&utm_medium=referral

    总结

    以上是生活随笔为你收集整理的vue中style的scoped属性的设计方式的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。