Vue导入scss,但将其应用于插槽内容

zte4gxcn  于 2023-11-21  发布在  Vue.js
关注(0)|答案(1)|浏览(159)

我试图在Histoire中创建一个主题切换器,它允许我在两个不同的主题中显示一个组件。
为此,我有两个导入不同scss文件(主题文件)的 Package 器组件。 Package 器的目的是 Package 一个组件并将该主题文件应用于它 Package 的组件。
foo.scss

.my-table {
    background-color: blue;
}

字符串
bar.scss

.my-table {
    background-color: red;
}


对于这两个样式表,我有一个 Package 器,可以像这样导入它们:
WrapperComponent.vue

<template>
    <div id="fooThemeWrapper">
        <slot></slot>
    </div>
</template>

<script lang="ts" setup>

</script>

<style lang="scss" scoped>
@use '../scss/themes/foo';
</style>


Package 器组件应用于Histoire变体,如下所示

const fooThemeSetup = defineSetupVue3(({ addWrapper }) => {
    addWrapper(fooThemeWrapper);
});


我面临的问题是scss文件中的规则没有应用到插槽内容。
我试着让style标签没有作用域。这将两个scss文件的样式应用到slot内容,但这导致一个scss文件与另一个scss文件重叠。我希望 Package 器组件导入的样式只应用到 Package 器组件slot内容。
有没有一种方法可以将组件作用域标识符(添加到所有作用域组件元素的属性)也应用到组件插槽内容?

rggaifut

rggaifut1#

我面临的问题是scss文件中的规则没有应用到插槽内容。
这是因为:
使用scoped,父组件的样式不会泄漏到子组件中。但是,子组件的根节点将受到父组件的作用域CSS和子组件的作用域CSS的影响。这是通过设计,以便父组件可以为布局目的设计子根元素的样式。-https://vuejs.org/api/sfc-css-features.html#scoped-css
下一页:
我试着让样式标签不限定作用域,这将两个scss文件的样式应用到插槽内容,但这导致一个scss文件覆盖另一个。
全局样式将被捆绑,所以即使你的组件是有条件渲染的,它也只是在渲染中是有条件的,而不是捆绑的。最终,它将被打包到一个css文件中。
因为它们都是相同的选择器,所以它们将级联。
要构建主题系统,您可以像这样修改:
1.将每个主题 Package 到数据选择器中。例如:

[data-theme="foo"] {
        .my-table {
        }
    }

字符串

  1. data属性的条件值
    假设您可以访问body标记
<body :data-theme="condition ? 'foo' : 'bar'">
</body>


备注:

  • <body>标签只是一个例子,它们可以是<html>标签和容器标签(只要它是使用my-table类的任何标签的父标签)。
  • 这只是一种方法,但相当流行。还有另一种方法使用CSS的变量,但它不是关闭到您当前的代码库,有点复杂。

相关问题