Vue CSS模块

时间:2019-02-28 18:27:20

标签: vuejs2 vue-cli-3 css-modules

我一直在尝试为我们的组件库提供一个解决方案,该解决方案将根据导入的项目来呈现不同的样式。在我的研究中,我发现了CSS模块中可能的解决方案。我目前面临的问题是,当我使用命名模块时,它们会编译为相同的CSS类,因此两个不同命名模块中的样式会相互覆盖。 Vue网站上的文档非常狭窄,因此我不确定当前是否正确实现我的代码。有人可以让我知道我是否缺少某些东西,或者他们之前有过类似的问题吗?

<template>
  <button :class="a.button" type="button" v-on="$listeners">
    <slot/>
  </button>
</template>

<script>
export default {
  console.log(this.a, this.b)
}
</script>

<style module="a">
.button {
  background-color: red;
}
/* identifiers injected as a */
</style>

<style module="b">
.button {
  background-color: blue;
}
/* identifiers injected as b */
</style>

在我的console.log(this.a, this.b)中,控制台将两个渲染的类名返回为相同的{button: "index_button_2JdpP"} {button: "index_button_2JdpP"},因此很明显我的代码中有问题,或者我误解了命名CSS模块的目的。

2 个答案:

答案 0 :(得分:0)

通过将CSS文件导入脚本并使用计算属性设置样式,我找到了解决方法。

<template>
  <button type="button" :class="styles.button" v-on="$listeners">
    <slot/>
  </button>
</template>

<script>
import remax from './remax.scss'
import crm from './crm.scss'

export default {
  computed: {
    styles() {
      return remax
    },
  }
}
</script>

<style modules lang="scss"></style>

不幸的是,这种方式使我的项目流失了一些样式,但这可能是由于我在scss文件中的实现。

答案 1 :(得分:0)

有一种解决此问题或类似问题的方法,如果通过导入,请在文件末尾指定模块并处理Computed。然后您可以将css类命名为相同的名称,它们不会被覆盖。至少对我来说。

 <template>
  <div id="app" :class="BaseApp.Container">
    <router-view :class="BaseView.Container" />
  </div>
</template>
<script>
import BaseApp from "@/components/Base/Styles/BaseApp.css?module";
import BaseView from "@/components/Base/Styles/BaseView.css?module";
export default {
  components: {},
  computed: {
    BaseApp() {
      return BaseApp;
    },
    BaseView() {
      return BaseView;
    },
  },
};
</script>