是否可以从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;
}