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