Sass检查变量是否传递给mixin

Sha*_*ins 37 variables sass

假设我有一个默认值的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指令.而你想要将参数默认为nullfalse,这意味着没有传递任何东西).

@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)

DEMO

如果要将不同的值设置为默认值,则只需在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)

DEMO

但是你可以结合使用两种方法...检查是否传递了某些东西$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)

DEMO

这应该适用于除了布尔值之外的所有内容false,因为null并且false两者都false使用@if指令进行验证.因此,要允许false作为参数值传递,您需要使用更具体的表达式.例如:

...
    @if ($p != null) {
...
Run Code Online (Sandbox Code Playgroud)

DEMO

而且,这应该可以解决问题 - 除非你出于某种原因想要null作为一个论点来传递.然后你需要使用其他东西作为默认值,就像一个极不可能作为参数传递的字符串,例如"no arguments have been passed"=)

DEMO