从mixin中创建sass映射值-全局保存

从mixin中创建sass映射值-全局保存,sass,Sass,是否可以从mixin中更新sass映射中的值,以便全局保存更改 乙二醇 我不确定我是否理解了您试图做的事情,但是您的代码似乎很好(虽然还没有测试),除了没有映射集函数,但您可以创建一个映射集函数,或者只使用映射合并(请检查此处:)。我希望这有帮助 @update 1:我想我现在明白你的问题了,你想通过mixin传递引用,因此如果你有多个映射,你可以将你想更新的映射发送到mixin,但是我认为这是不可能的,因为没有引用被保留,如果你需要更新变量,你必须直接链接到它,例如,这项工作(已测试): 但是

是否可以从mixin中更新sass映射中的值,以便全局保存更改

乙二醇


我不确定我是否理解了您试图做的事情,但是您的代码似乎很好(虽然还没有测试),除了没有映射集函数,但您可以创建一个映射集函数,或者只使用映射合并(请检查此处:)。我希望这有帮助

@update 1:我想我现在明白你的问题了,你想通过mixin传递引用,因此如果你有多个映射,你可以将你想更新的映射发送到mixin,但是我认为这是不可能的,因为没有引用被保留,如果你需要更新变量,你必须直接链接到它,例如,这项工作(已测试):

但是如果您引用$map而不是$obj
(在这一行$obj:map set($map,init,true)!global;)
,那么将创建一个新的全局映射(称为$map)。每次再次调用mixin时,它将被作为参数发送的映射所替换

@update 2:我找到了一种方法,但你必须保留一个全局“地图地图”,每次你更新这个家伙时,你都会发送你想更新的地图的名称作为参数,所以我想出了以下代码,它经过测试,运行良好:)


来源:我自己

以下来自@Paulo Munoz

这是解决办法

@function map-set($map, $key, $value) {
  $new: ($key: $value);
  @return map-merge($map, $new);
}

$extend : ();

$obj : (
 margin: 0,
 padding: 10
);

@mixin set($map, $name) {

  @if map-has-key($extend, $name) {

    map: has-key;

    // call placeholder class

  } @else {

    $extend: map-set($extend, $name, true) !global;

    map: does-not-have-key;
    // create placeholder class
    // call placeholder class


  }

}

.test {
  @include set($obj, test);
}

.test-2 {
  @include set($obj, test);
}
产生

.test {
  map: does-not-have-key;
}

.test-2 {
  map: has-key;
}

这就是我需要该功能的原因,这可能会有帮助,解释为什么自Sass 3.3以来删除了
map set
,以支持
map merge
@function map-set($map, $key, $value) {
  $new: ($key: $value);
  @return map-merge($map, $new);
}

$maps: (
  obj1: (
    init: false
  ),

  obj2: (
    init: false
  ),
);

@mixin set($prop) {

  @if map_get(map_get($maps, $prop), init) != true {
    $obj: map-set(map_get($maps, $prop), init, true);

    $maps: map-set($maps, $prop, $obj) !global;

    body {
      background-color: #000;
    }
  } @else {
    body {
      background-color: #ff0000;
    }
  }
}

@include set(obj1); //black
@include set(obj2); //black

@include set(obj1); //red
@include set(obj2); //red
@function map-set($map, $key, $value) {
  $new: ($key: $value);
  @return map-merge($map, $new);
}

$extend : ();

$obj : (
 margin: 0,
 padding: 10
);

@mixin set($map, $name) {

  @if map-has-key($extend, $name) {

    map: has-key;

    // call placeholder class

  } @else {

    $extend: map-set($extend, $name, true) !global;

    map: does-not-have-key;
    // create placeholder class
    // call placeholder class


  }

}

.test {
  @include set($obj, test);
}

.test-2 {
  @include set($obj, test);
}
.test {
  map: does-not-have-key;
}

.test-2 {
  map: has-key;
}