Ответ 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 */
}
}
Если вы хотите установить другое значение по умолчанию, вам просто нужно проверить это конкретное значение в инструкции 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 */
}
}
Но с корнем вы можете комбинировать оба подхода... проверьте, что что-то передано в $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;
}
}
Теперь это будет работать для всего, кроме логического значения false
, поскольку null
и false
проверяются на false
с помощью директивы @if
. Поэтому, чтобы разрешить передачу false
в качестве значения аргумента, вам нужно будет использовать более конкретное выражение. Например:
...
@if ($p != null) {
...
И вуаля, это должно сделать трюк - если вы по какой-то причине не захотите передать null
в качестве аргумента. Затем вам нужно использовать что-то еще по умолчанию, как строку, которая крайне маловероятна для передачи в качестве аргумента, например. "no arguments have been passed"
=)