如何在 angular 组件中处理多个主题?

How can I handle multiple themes in an angular component?

我正在开发一个 Angular 9 项目,我正在创建两个主题,每个主题都有自己的 css 输出文件。 我修改了 angular.json 文件来处理:

"styles": [
  {
    "input": "src/styles/themes/light-theme.scss",
    "lazy": true,
    "bundleName": "light-theme"
  },
  {
    "input": "src/styles/themes/dark-theme.scss",
    "lazy": false,
    "bundleName": "dark-theme"
  }
],

light-themedark-theme 是我的输入文件,我在其中设置变量,例如:

我的问题是我无法使用每个组件中的那些变量,因为我的组件不知道这些变量是什么。我无法导入一个或另一个主题,因为我想使用我在输入文件中声明的值。 我该如何处理?有什么方法可以 "importing" 我在 angular.json 文件上写的输入文件吗?

谢谢!

如果您在全局样式中定义 sass 变量,您将无法在动态更改主题后访问它们。这是因为动态加载的主题将只包含 css 规则,而不是 sass;除了在 运行 时间你的组件 scss 也已经编译为 css 所以没有更多的 sass 变量的概念。

您可以改为使用 CSS variables, which have good browser support(除了 IE 和 opera mini)。

例如,您可以在主题文件中定义这些变量

暗-theme.scss

:root{
  --button-background: darkgrey;
  --button-color: white;
}

浅色-theme.scss

:root{
  --button-background: lightgrey;
  --button-color: black;
}

然后在你的组件中,使用这些变量

component.scss

button
{
  cursor: pointer;
  padding: 10px;
  border: 0;
  color:var(--button-color);
  background-color:var(--button-background);
}

然后,当您动态加载浅色主题时,它会覆盖现有的变量。如果您随后动态删除 light-theme.css,它将返回使用深色主题的变量。