Size: a a a

2019 May 25

Р

Роман in БЭМ
Пытаюсь сделать «magic mods», чтобы модификаторы темы и размеров назначались автоматически или от родительского блока:
block( '*' )(
 def()( node => {
   node.mods.size = node.mods.size || 'm';
   node.mods.theme = node.defaultTheme = node.mods.theme || node.defaultTheme || 'light';

   return applyNext();
 } )
);

block( '*' ).elem( '*' )(
 def()( node => {
   node.defaultTheme = node.mods.theme || node.elemMods.theme || node.defaultTheme || 'light';

   return applyNext();
 } )
);
источник
2019 May 26

AY

Alexey Yarrr (qfox) in БЭМ
никак. но можно явно передавать её в applyNext({ parent: node }), и потом забирать из node.parent
источник

AY

Alexey Yarrr (qfox) in БЭМ
хотелка про блок для элемента была, но не рискнули реализовывать
источник

Р

Роман in БЭМ
Alexey Yarrr (qfox)
никак. но можно явно передавать её в applyNext({ parent: node }), и потом забирать из node.parent
спасибо, думаю, может помочь
источник

AY

Alexey Yarrr (qfox) in БЭМ
Роман
спасибо, думаю, может помочь
Я бы, кстати, предложил по аналогии с решением из whitepaper писать в тему по умолчанию из специального блока:
block('theme').def(node => applyNext({ defaultMods: { ...node.defaultMods, ...node.mods } });
источник

Р

Роман in БЭМ
так и делаю. Этот шаблон лежит в блоке theme, просто решил избавиться от микса
источник

VH

Vitaly Harisov in БЭМ
@veged почему для Реакта была выбрана схема именования BlockName-ElemName, а не BlockName__ElemName? В этом случае же получаются неоднозначные имена классов в JS. Невозможно отличить программно блок NavItem от элемента Item блока Nav. В обоих случаях получается имя класса NavItem. Нарушается один из базовых принципов БЭМ, что именование одинаково во всех технологиях и по имени всегда можно программно узнать, что это за сущность.
источник

A

Anton in БЭМ
Vitaly Harisov
@veged почему для Реакта была выбрана схема именования BlockName-ElemName, а не BlockName__ElemName? В этом случае же получаются неоднозначные имена классов в JS. Невозможно отличить программно блок NavItem от элемента Item блока Nav. В обоих случаях получается имя класса NavItem. Нарушается один из базовых принципов БЭМ, что именование одинаково во всех технологиях и по имени всегда можно программно узнать, что это за сущность.
А почему невозможно?
NavItem очевидно блок
Nav-Item блок nav элемент item, не?
источник

VH

Vitaly Harisov in БЭМ
Anton
А почему невозможно?
NavItem очевидно блок
Nav-Item блок nav элемент item, не?
Имя класса в JS у них будет NavItem и NavItem соответственно
источник

AY

Alexey Yarrr (qfox) in БЭМ
Vitaly Harisov
Имя класса в JS у них будет NavItem и NavItem соответственно
Будет NavItem и Item
источник

VH

Vitaly Harisov in БЭМ
Alexey Yarrr (qfox)
Будет NavItem и Item
Имя элемента же должно содержать в себе имя блока
источник

AY

Alexey Yarrr (qfox) in БЭМ
В JS — нет. import { Item as ANYTHING } from 'Nav-Item';
источник

VH

Vitaly Harisov in БЭМ
Alexey Yarrr (qfox)
В JS — нет. import { Item as ANYTHING } from 'Nav-Item';
Ты же понимаешь о чём я, нейминг получается неконсистентный
источник

SB

Sergey Berezhnoy in БЭМ
Vitaly Harisov
@veged почему для Реакта была выбрана схема именования BlockName-ElemName, а не BlockName__ElemName? В этом случае же получаются неоднозначные имена классов в JS. Невозможно отличить программно блок NavItem от элемента Item блока Nav. В обоих случаях получается имя класса NavItem. Нарушается один из базовых принципов БЭМ, что именование одинаково во всех технологиях и по имени всегда можно программно узнать, что это за сущность.
потому что 1) два подчёркивания это зашквар и 2) в реальности в одном JS файле очень маловероятен такой конфликт имён, обычно в блок импортится элемент под своим коротким именем и всё
источник

VH

Vitaly Harisov in БЭМ
Sergey Berezhnoy
потому что 1) два подчёркивания это зашквар и 2) в реальности в одном JS файле очень маловероятен такой конфликт имён, обычно в блок импортится элемент под своим коротким именем и всё
Дело не в конфликте имён, а в неконсистентности. В разных технологиях получается разный нейминг, а БЭМ делался в том числе для того, чтобы в разных технологиях нейминг был одинаковый
источник

AY

Alexey Yarrr (qfox) in БЭМ
Согласен, не очень вычитать Item из Nav
источник

Р

Роман in БЭМ
Alexey Yarrr (qfox)
никак. но можно явно передавать её в applyNext({ parent: node }), и потом забирать из node.parent
Шаблонизатор идёт сразу вглубь, захватывая значение последнего вложенного элемента и, когда возвращается на начальный уровень, будет значение не родителя, а самого глубокой сущности из предыдущего прохода.
источник

AY

Alexey Yarrr (qfox) in БЭМ
Роман
Шаблонизатор идёт сразу вглубь, захватывая значение последнего вложенного элемента и, когда возвращается на начальный уровень, будет значение не родителя, а самого глубокой сущности из предыдущего прохода.
Не, зависит от applynext сразу или нет.
источник

SB

Sergey Berezhnoy in БЭМ
Vitaly Harisov
Дело не в конфликте имён, а в неконсистентности. В разных технологиях получается разный нейминг, а БЭМ делался в том числе для того, чтобы в разных технологиях нейминг был одинаковый
и он одинаковый — в JS элемент называется Elem

необходимости в JS в локальных переменных использовать полное название исчезающе мала, а вот уродство двух подчёркиваний сильно хуже бросается в глаза (даже если бы так было, то у нормального человека от названий переменных в JS вида `var Block__Elem` будет взрываться голова)
источник

AY

Alexey Yarrr (qfox) in БЭМ
Sergey Berezhnoy
и он одинаковый — в JS элемент называется Elem

необходимости в JS в локальных переменных использовать полное название исчезающе мала, а вот уродство двух подчёркиваний сильно хуже бросается в глаза (даже если бы так было, то у нормального человека от названий переменных в JS вида `var Block__Elem` будет взрываться голова)
да не, все привыкли уже
источник