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



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

例如

$obj: (
  init: false
)
@mixin set($map) {
 @if map-get($obj, init) != true {
  // mixin hasn't been called before
  $map: map-set($map, init, true); 
 }
 @else {
  // mixin has been called before
 }
}
.test {
 @include set($obj);
 // sets the init value to true
}
.test-2 {
 @include set($obj);
 // init value has already been set to true
}

我不确定我是否理解您想要做的事情,但您的代码似乎很好(不过还没有测试过),只是没有映射集函数,但您可以创建一个或只使用映射合并(请查看此处:http://oddbird.net/2013/10/19/map-merge/)。我希望这能有所帮助。

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

$obj: (
  init: false
);
@mixin set($map) {
  @if map_get($map, init) != true {
    $obj: map-set($map, init, true) !global;
    body {
      background-color: #000;
    }
  } @else {
    body {
      background-color: #ff0000;
    }
  }
}

@include set($obj);
@include set($obj);

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

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

@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

来源:我自己

来自@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;
}

最新更新