Подтвердить что ты не робот

Sass проверить, передается ли переменная mixin

Предположим, что у меня есть mixin со значениями по умолчанию

$default: 1;

@mixin test($p : $default) {
    @if () {
        // Do something if $p was 4passed?
    } @else {
        // Do something if $p was not passed?
    }

}

Если бы я должен был вызвать mixin так, два разных были:

@include test(); // A
@include test(1);  // B

Есть ли способ показать разницу между значением по умолчанию (A) и тем, что переписывает значение по умолчанию (B)?

4b9b3361

Ответ 1

Ваш mixin будет работать, если вы измените его на маленький бит (так как вам действительно нужно передать данный параметр в директиву @if. И вы хотите по умолчанию указать параметр null или false, который означало бы, что ничего не было принято).

@mixin test($p: null) {
    @if ($p) {
        /* Do something if $p was passed */
    } @else {
        /* Do something if $p was not passed */
    }
}

DEMO

Если вы хотите установить другое значение по умолчанию, вам просто нужно проверить это конкретное значение в инструкции if (например, "сделать что-то, если $p установлено значение по умолчанию" ). Вот как вы это сделаете, установив значение по умолчанию из переменной, как в своем примере. Однако это не будет различать "no argument pass" и "пройденное значение равно значению по умолчанию".

@mixin test($p: $default) {
    @if ($p == $default) {
      /* Do something if $p is set to $default */
    } @else {
      /* Do something else if $p is not $default */
    }
}

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;
    }
}

DEMO

Теперь это будет работать для всего, кроме логического значения false, поскольку null и false проверяются на false с помощью директивы @if. Поэтому, чтобы разрешить передачу false в качестве значения аргумента, вам нужно будет использовать более конкретное выражение. Например:

...
    @if ($p != null) {
...

DEMO

И вуаля, это должно сделать трюк - если вы по какой-то причине не захотите передать null в качестве аргумента. Затем вам нужно использовать что-то еще по умолчанию, как строку, которая крайне маловероятна для передачи в качестве аргумента, например. "no arguments have been passed" =)

DEMO