在 VueJS 组件之间共享公共 CSS

Sharing common CSS across VueJS components

我正在处理 VueJS 2 项目,我正在尝试清理代码,但在作用域样式方面遇到困难。

这是我的要求。 :)

我有 3 个组件,它们彼此非常相似,所以我决定使用 mixins 将代码合并到一个文件中。每个组件都将使用 templatevuejs 中的那个 mixins。当我想自定义特定组件的条件时,我可以简单地覆盖其中的代码并且它在这部分工作正常。

但是,我还想做的一件事是将 scoped style 也移动到混音中。目前,该样式包含在 <style lang="scss" scoped></style> 标签中,并且该样式在其组件上运行良好,但我必须将样式代码复制到所有 3 个组件中。

我知道我可以将这些样式添加到全局 css 文件,但我不想将某些样式添加到全局范围,这 3 个组件中只有一个适用于这些。

有什么方法可以添加这些样式并应用到 mixin 中吗?

编写此特定案例的最佳做法是什么?

也许使用模块而不是设置具有作用域属性的 style 部分。

https://vue-loader.vuejs.org/en/features/css-modules.html

这样,您的 CSS 仍将处于范围内,而不是全局样式的一部分。

我刚发现 scoped style 也会影响子组件。

因此,我找到了解决方案,不确定它是否是最佳实践,但我觉得非常好。

创建一个 WrapperComponent,然后我将 scoped style 和一个小模板放在这里。

<template>
    <div>
        <slot></slot>
    </div>
</template>

<style lang="scss" scoped>
    /* css style that will apply to all children */
</style>

这里发生的事情是,当我们用这个 WrapperComponent 包装任何组件时,模板将通过 slot 传递给 HTML 而无需任何修改,样式将能够即日起申请。

mixins 中,我导入了这个包装器并用 WrapperComponent 包装了组件模板。这是例子。

import WrapperComponent from './WrapperComponent'

let MyMixins = {

    template: `<wrapper-component>
        <div>
            Whatever HTML code here
        </div>
    </wrapper-component>`,


    components: {
        WrapperComponent,
    },
};

当我们使用此 mixins 或子组件时,来自 WrapperComponent 的样式将自动应用,并且也可以与其他想要使用相同父样式的组件组一起使用。

Vue 让这一切变得简单。

解决方案

要在组件中使用共享样式,您可以这样做。

MyComponent.js

<template>
</template>

<script>
</script>

<style lang="scss" scoped>
  @import '@/scss/shared-styles.scss';
  @import 'styles.scss'; // this is the regular CSS used just by the component
</style>

备选

您也可以导入组件 CSS 文件中的共享 CSS 文件,而不是像下面这样。

MyComponent.js

<template>
</template>

<script>
</script>

<style lang="scss" scoped>
  @import 'styles.scss';
</style>

styles.scss

@import '@/scss/shared-styles.scss'

// rest of your component CSS

自动导入全局样式

如果您希望某些样式在您的所有组件中可用,您可以这样做。

vue.config.js

module.exports = {
  ...
  css: {
    loaderOptions: {
      sass: {
        prependData: `
          @import "@/scss/global.scss";
        `
      },
    },
  },
}

我刚刚将 fadeTransition.css 文件放入我的 vue app /assets 文件夹中,然后像这样导入:

<template>
  <transition name="fade">
    <div v-if="showContent">test</div>
  </transition>
</template>
<script>
  import '@/assets/fadeTransition.css';
  // component definition
</script>

fadeTransition.css

/* fade menus in, not out */
.fade-enter-active {
  transition: opacity .5s;
}
.fade-enter {
  opacity: 0;
}

简洁明了。应该也适用于 scss。

干杯!