假设我有一个默认值的mixin
$default: 1;
@mixin test($p : $default) {
@if () {
// Do something if $p was 4passed?
} @else {
// Do something if $p was not passed?
}
}
Run Code Online (Sandbox Code Playgroud)
如果我这样打电话给mixin,两个不同的是:
@include test(); // A
@include test(1); // B
Run Code Online (Sandbox Code Playgroud)
有没有办法可以区分默认值(A)和覆盖默认值(B)的默认值?
Mar*_*jak 74
如果你稍微修改它,你的mixin就可以工作了(因为你实际上需要将参数传递给@if
指令.而你想要将参数默认为null
或false
,这意味着没有传递任何东西).
@mixin test($p: null) {
@if ($p) {
/* Do something if $p was passed */
} @else {
/* Do something if $p was not passed */
}
}
Run Code Online (Sandbox Code Playgroud)
如果要将不同的值设置为默认值,则只需在if语句中检查该特定值(例如"如果$p
设置为默认值则执行某些操作").在这里,您将如何通过设置变量的默认值来完成此操作,就像您在示例中所做的那样.但是,这不会区分" 无参数传递 "和" 传递值等于默认值 ".
@mixin test($p: $default) {
@if ($p == $default) {
/* Do something if $p is set to $default */
} @else {
/* Do something else if $p is not $default */
}
}
Run Code Online (Sandbox Code Playgroud)
但是你可以结合使用两种方法...检查是否传递了某些东西$p
(如果传递或不传递,则执行不同的操作),如果没有传递,则将$p
值设置为默认值.
@mixin test($p: null) {
@if ($p) {
/* Do something if argument passed */
} @else {
/* Do something else if no argument passed. Set $p to default. */
$p: $default;
}
}
Run Code Online (Sandbox Code Playgroud)
这应该适用于除了布尔值之外的所有内容false
,因为null
并且false
两者都false
使用@if
指令进行验证.因此,要允许false
作为参数值传递,您需要使用更具体的表达式.例如:
...
@if ($p != null) {
...
Run Code Online (Sandbox Code Playgroud)
而且,这应该可以解决问题 - 除非你出于某种原因想要null
作为一个论点来传递.然后你需要使用其他东西作为默认值,就像一个极不可能作为参数传递的字符串,例如"no arguments have been passed"
=)