Входные данные — BEMJSON
Введение
Любой JS-объект уже можно считать BEMJSON-ом. Но, чтобы управлять результатом шаблонизации, нам понадобятся стандартные поля, которые bem-xjst ожидает.
Соглашение о стандартных полях BEMJSON
block — имя блока
elem — имя элемента
mods — хеш модификаторов блока
elemMods — хеш модификаторов элемента
content — дочерние узлы
mix — БЭМ-сущности, которые нужно примиксовать
bem — нужно ли добавлять классы и JS-параметры для самой БЭМ-сущности и её миксов
js — JS-параметры
attrs — хеш HTML-атрибутов
cls — HTML-класс
tag — HTML-тег
block
{String}
имя блока.
// BEMJSON
{ block: 'page' }
elem
{String}
имя элемента.
// BEMJSON
{
block: 'page',
content: {
// В этом узле блок указывать необязательно, он берётся из контекста (page).
elem: 'header'
}
}
mods
{Object}
хеш модификаторов блока. Ключами могут быть любые корректные ключи для JS-объектов. Значения могут быть типа String
или Boolean
.
// BEMJSON
{
block: 'tab',
mods: { name: 'index', visible: true }
}
Результат шаблонизации:
<div class="tab tab_name_index tab_visible"></div>
mods
будет проигнорирован если указаны elem
и elemMods
.
// BEMJSON
{
block: 'control',
// Будет проигнорирован, так как указаны elem и elemMods
mods: { type: 'nav' },
elem: 'input',
elemMods: { type: 'search' }
}
Результат шаблонизации:
<div class="control__input control__input_type_search"></div>
elemMods
{Object}
хеш модификаторов элемента. elemMods
не будет учитываться, если не указан элемент.
// BEMJSON
{
block: 'page',
elem: 'header',
elemMods: { type: 'search' }
}
content
{*}
Дочерние узлы.
// BEMJSON
{
block: 'page',
content: [
{ block: 'header'},
{ block: 'article', content: '…' },
'© 2017'
]
}
Объект с полем html
является специальным типом возможных объектов в BEMJSON. Все другие поля в этом объекте будут проигнорированы. В поле html
ожидается строка, которая будет выведена без изменений.
{
block: 'markup',
content: {
html: '<code>new Date();</code>'
}
}
Результат шаблонизации:
<div class="markup"><code>new Date();</code></div>
mix
{Object|Object[]|String}
БЭМ-сущности, которые нужно примиксовать к текущей.
// BEMJSON
{
block: 'link',
mix: { block: 'controller' }
}
Результат шаблонизации:
<div class="link controller"></div>
js
{Boolean|Object}
JS-параметры. Если значение не falsy, то миксует i-bem
и добавляет содержимое в JS-параметры. По умолчанию undefined
.
Подробнее про i-bem и JS-параметры.
// BEMJSON
{
block: 'link',
js: true
}
Результат шаблонизации:
<div class="link i-bem" data-bem='{"link":{}}'></div>
Значения будут экранированы:
// BEMJSON
{
block: 'link',
js: { title: 'film "Sid & Nancy"' }
}
Результат шаблонизации:
<div class="link i-bem" data-bem='{"link":{title:"film 'Sid & Nancy'"}}'>
</div>
bem
{Boolean}
указывает шаблонизатору, нужно ли добавлять классы и JS-параметры для самой БЭМ-сущности и её миксов. По умолчанию true
.
// BEMJSON
{
block: 'menu',
elem: 'item',
bem: false
}
Результат шаблонизации:
<div></div>
attrs
{Object}
хеш HTML-атрибутов. Значения атрибутов будут экранированны функцией attrEscape.
// BEMJSON
{
attrs: {
id: 'anchor',
name: 'Мультфильм "Tom & Jerry"'
}
}
Результат шаблонизации:
<div id="anchor" name="Мультфильм "Tom & Jerry""></div>
Если любое поле объекта attrs
содержит БЭМ-cущность (в данном случае просто объект с полями block
/elem
/mods
/elemMods
), то для такого объекта шаблонизатор попробует применить шаблоны. Пример:
// BEMJSON
{
block: 'button',
attrs: {
'data-text': {
block: 'i-bem',
elem: 'i18n',
key: 'button-success'
}
}
}
// Шаблон
block('i-bem').elem('i18n')({
// Здесь I18N.get просто метод, который возвратит строку
def: (node, ctx) => node.I18N.get(ctx.key)
});
Результат шаблонизации:
<div id="button" data-text="Поздравляем!"></div>
cls
{String}
HTML-класс или классы (через пробел), не принадлежащие к предметной области БЭМ. Например, применение микроформатов или семантической разметки из schema.org.
// BEMJSON
{
block: 'user',
cls: 'h-card p-name',
content: 'Андрей Линде'
}
Результат шаблонизации:
<div class="user h-card p-name">Андрей Линде</div>
tag
{Boolean|String}
HTML-тег. false
или ''
укажет движку BEMHTML пропустить этап генерации HTML-тега. По умолчанию div
.
// BEMJSON
{
tag: false,
content: 'start'
}
Результат шаблонизации:
start
Пользовательские поля
Вы можете добавлять любые другие поля с данными, чтобы потом обработать их в теле шаблона по своему усмотрению.
// BEMJSON
{
block: 'link'
url: '/',
target: '_blank'
}
Подробнее о том, как обрабатывать пользовательские поля BEMJSON, читайте в разделе про шаблоны.
Читать далее: синтаксис шаблонов