如何在 SASS 中循环嵌套映射

How to loop nested maps in SASS

提问人:Meek 提问时间:11/15/2023 更新时间:11/15/2023 访问量:21

问:

我正在尝试在 sass 中循环嵌套地图,以便为主题列表创建某些 css 变量。

我有这样的主题地图:

$themes: (
    theme-1: (
        primary: (
            "el-background": #000,
            "el-background-hover": #0d0d0d,
            "el-color": #2c2f33,
            "el-link-color": #fff,
        ),
        secondary_1: (
            "el-background": #000,
            "el-background-hover": #ccc,
            "el-color": #f2f2f2,
            "el-link-color": #fff,
        )
    ),
    theme-2: (
        primary: (
            "el-background": #f90,
            "el-background-hover": #ccc,
            "el-color": #000,
            "el-link-color": #fff,
        ),
        secondary_1: (
            "el-background": #f2f2f2,
            "el-background-hover": #000,
            "el-color": #f2f2f2,
            "el-link-color": #fff,
        )
    )
);

我期待在css中得到这样的结果:

.theme-1 {
    .primary {
        --el-background: ...;
        --el-background-hover: ...;
        --el-color: ...;
        --el-link-color: ...;
    }

    .secondary_1 {
        --el-background: ...;
        --el-background-hover: ...;
        --el-color: ...;
        --el-link-color: ...;
    }
}

.theme-2 {
    .primary {
        --el-background: ...;
        --el-background-hover: ...;
        --el-color: ...;
        --el-link-color: ...;
    }

    .secondary_1 {
        --el-background: ...;
        --el-background-hover: ...;
        --el-color: ...;
        --el-link-color: ...;
    }
}

如何调整此循环以实现此目的?我想我需要把它包装在另一个中,但不确定如何。@each

@mixin theme() {
    @each $theme, $map in $themes {
        .#{$theme} {
            @each $key,
            $value in $map {
                --#{$key}: #{$value};
            }
        }
    }
}
飒爽

评论


答:

0赞 OlegWock 11/15/2023 #1

您只需要添加另一个循环来遍历“primary”和“secondary_1”中的值。像这样的东西:

@mixin theme() {
    @each $theme, $map in $themes {
        .#{$theme} {
            @each $key, $value in $map {
              .#{$key} {
                @each $varName, $varValue in $value {
                  --#{$varName}: #{$varValue};
                }
              }
            }
        }
    }
}

:root {
  @include theme();
}

SCSS playground 上的解决方案