在 mixin 中使用局部 Sass 变量

Using local Sass variables in mixin

我有一堆定义用于 light/dark 主题的变量(两个单独的文件):

$primary-1: red;
$primary-2: green;

而且我不想在消费它们时将它们全部声明两次。我写了一个 mixin 为我做作业:

@mixin assign-vars {
  --primary-1: #{$primary-1};
  --primary-2: #{$primary-2};
}

我想这样使用它:

@import 'assign-vars';

:root,
:root[data-theme='light'] {
  @import 'light-theme-variables';
  @include assign-vars;
}

:root[data-theme='dark'] {
  @import 'dark-theme-variables';
  @include assign-vars;
}

但这不起作用,因为我收到一条错误消息,指出 $primary-1 是一个未定义的变量。我怎样才能做到这一点而不必将所有声明都做两次?

我最终将变量移动到 map:

$light-vars: (
  $font-name: 'Some Font',
  $primary-1: red
);

$dark-vars: (
  $font-name: 'Some Other Font',
  $primary-1: green
);

并创建了一个帮助程序 mixin 以将它们分配给 CSS 个同名变量:

@mixin assign-map-properties($map) {
  @each $key, $value in $map {
    @if (type-of($value) == 'string') {
      --#{$key}: '#{$value}';
    }
    @else {
      --#{$key}: #{$value};
    }
  }
}

这让我完成了我需要的事情:

@import 'assign-map-properties';

:root,
:root[data-theme='light'] {
  @import 'light-vars';
  @include assign-map-properties($light-vars);
}

:root[data-theme='dark'] {
  @import 'dark-vars';
  @include assign-map-properties($dark-vars);
}

生成CSS:

:root,
:root[data-theme='light'] {
  --font-name: 'Some Font';
  --primary-1: red;
}

:root[data-theme='dark'] {
  --font-name: 'Some Other Font';
  --primary-1: green;
}