Условный миксин на основе существования параметра

Любое предложение, как создать условный миксин на основе существования параметра? Например, мне нужно проверить, что все параметры переданы, чтобы что-то выполнить или нет, например:

.margin (@margintop:0,@marginbottom:0,@marginright:0,@marginleft:0) {

  // if @marginright:0 or @marginleft:0 are passed do that...

  // else...

}

person Dee    schedule 27.11.2013    source источник


Ответы (1)


1:

В общем, когда вам нужно сгенерировать разные вещи для разного количества переданных аргументов, вам вообще не нужно использовать значения аргументов по умолчанию, например:

.margin(@top, @bottom, @right, @left) {
    /* right and left are passed */
}

.margin(@top, @bottom) {
    /* right and left are not passed */
}

.margin() {
    /* no arguments passed */
}

// etc.

Обратите внимание, что каждый из этих миксинов может повторно использовать другие, например, .margin(@top, @bottom) может сделать что-то особенное для «без правого и левого регистра», а затем вызвать .margin(@top, @bottom, 0, 0) для выполнения основной работы.

2:

Но если по какой-то причине вам все еще нужны эти значения по умолчанию, вы можете использовать какое-то специальное значение по умолчанию, которое не может быть допустимым полем, например. что-то вроде этого:

.margin(@top: undefined, @bottom: undefined, @right: undefined, @left: undefined) {
    .test-args();

    .test-args() when (@right = undefined) {
        /* right is not passed */
    }
    .test-args() when (@left = undefined) {
        /* left is not passed */
    }

    .test-args()
        when not(@right = undefined)
        and  not(@left  = undefined) {
            /* right and left are passed */
    }

    // etc.
}

3:

И третий вариант — использовать вариативные аргументы и проверять их количество, но я думаю, что этот вариант самый подробный и глупый:

.margin(@args...) {
    .eval-args(length(@args));  // requires LESS 1.5.+
    .eval-args(@nargs) {
        // default values:
        @top:    not passed;
        @bottom: not passed;
        @right:  not passed;
        @left:   not passed;
    }
    .eval-args(@nargs) when (@nargs > 0) {
        @top:    extract(@args, 1);
    }
    .eval-args(@nargs) when (@nargs > 1) {
        @bottom: extract(@args, 2);
    }
    .eval-args(@nargs) when (@nargs > 2) {
        @right:  extract(@args, 3);
    }
    .eval-args(@nargs) when (@nargs > 3) {
        @left:   extract(@args, 4);
    }

    args: @top, @bottom, @right, @left;
}

Хотя, вероятно, в некоторых особых случаях использования у него могут быть свои плюсы.

person seven-phases-max    schedule 27.11.2013
comment
Спасибо, метод 2 подходит для меня! - person Dee; 07.12.2013