Vue为何打包后的样式不一致?

作者站长头像
站长
· 阅读数 5

有两个组件<Layout><HelloWorld>,代码如下:

<!-- layout -->
<template>
    <div>
        <div class="header">
            <slot></slot>
        </div>
    </div>
</template>

<script>
export default {
    name: 'Layout',
}
</script>

<style lang="scss" scoped>
.header {
    background: linear-gradient(135deg, #7f7fd5, #86a8e7, #91eae4);
    height: 100px;
    display: flex;
    align-items: center;
}
</style>
<!-- helloworld -->
<template>
    <Layout>
        <div class="header">Installed CLI Plugins</div>
    </Layout>
</template>

<script>
import Layout from './Layout.vue'

export default {
    name: 'HelloWorld',
    components: { Layout },
}
</script>
<style lang="scss" scoped>
.header {
    background: rgb(38, 57, 224);
    height: 200px;
}
</style>

此时打包后样式应用如下:Vue为何打包后的样式不一致?第一个header使用第一组样式,第二个header在继承的基础上覆盖了部分样式

但将layout最外一层div标签去掉后:

<div>
    <div class="header">
        <slot></slot>
    </div>
</div>

变成

<div class="header">
    <slot></slot>
</div>

再次打包,得到的结果是Vue为何打包后的样式不一致?两个header应用相同的样式

请问为什么多了一层div标签会造成打包结果不同?

回复
1个回答
avatar
test
2024-06-24

和 CSS 作用域有关系,可以看到你 slot 进来的 .header 元素,同时拥有了当前层级和layoutscope 属性。自然可以应用到两个组件各自的CSS样式。

answer image

如果需要避免这个问题,BEM的命名方式还是需要的。其实很多开发者在最后并不会默认开启组件样式的 scope 属性。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容