2013-09-13 2 views
3

Я использовал то, что я считал очень элегантным шаблоном для определения стилей повторно используемых компонентов/виджетов, используя LESS. Он отлично работает в LESS 1.3-, но после обновления в последнее время вся моя библиотека сломана. Кто-нибудь знает способ сделать что-то подобное в версии 1.4+?Как переопределить mixins в LESS CSS 1.4+

Вот очень простой пример компонента:

#componentName { 
    .loadMixins(){ 
    .text() {} 
    .header() {} 
    } 

    .apply(){ 
    > h3 { 
     // markup-specific styles 
     padding: 3px; 
     margin-bottom: 0; 

     // custom styles 
     .header(); 
    } 

    > div.body, > div.popup p { 
     color: red; 

     // custom styles 
     .text() 
    } 
    } 
} 

А вот как он будет использоваться:

.coolWidget { 
    #componentName.loadMixins(); 

    // override mixins here 
    .text(){ 
    color: green; 
    } 

    #componentName.apply(); 
} 

Это сохраняет все разметки в зависимости от стилей абстрагируется от пользователя. Я мог бы полностью изменить свою разметку, и стили пользователя все равно будут работать. Согласно less.js changelog, 1.4.0 Beta 1 имеет строку «переменные в mixins больше не« течет »в их область видимости».

Есть ли какой-либо путь вокруг этого?

ответ

1

Строго говоря, вложенные переменные и миксины по-прежнему расширены в область вызова, если только в этой области уже определены эти имена.

Ваш пример выше, приводит к ошибке:

SyntaxError: .header is undefined... 

и ожидается, как не .header() фактически не определяется в .coolWidget (или где-либо еще). Это можно устранить, предоставив определения по умолчанию для .text и .header где-то внутри #componentName. Например, если изменить .loadMixins() для:

.loadMixins() { 
    .text(); 
    .header(); 

    // default properties in case a caller does not provide its own: 
    .text() {} 
    .header() {} 
} 

то пример компилирует ОК, и все свойства текста/заголовка отменяются, как и ожидалось.


Я могу себе представить, как ваша библиотека может порваться из-за новых правил области видимости, но этот конкретный пример, который вы дали выше, не иллюстрирует эту проблему.

+0

Hi Max! Большое спасибо за ответ - вы правы, я ошибся своим примером - предполагается, что mixloads() mixin устанавливает значения по умолчанию. Просто сделал пример http://codepen.io/anon/pen/wGyHb, и похоже, что они используют 1.3.x, поэтому переопределения работают. Если вы запустите его в 1.4.x, но не кубики :(Мне бы хотелось найти другой способ сделать это. –

+0

Конечно, мой ответ выше 1.4.x (я тестировал с lescc 1.4.2 и 1.5.0 -b2), где этот код все еще работает (и нет причин, почему он не должен). –

+0

Вы, сэр, совершенно правы - я просто запускал это в другой среде, и это сработало. Похоже, у меня есть проблема, связанная с окружающей средой. Большое спасибо за помощь и за все ваше время! –

Смежные вопросы