БЭМ + Flux – БЭМ – i-bem.js



БЭМ + Flux – БЭМ – i-bem.js

0 0


bem-flux-slides

BEM♥FLUX slides

On Github sameoldmadness / bem-flux-slides

БЭМ + Flux

EkbJS 2. 2015-09-04

Роман Парадеев

разработчик, Яндекс

БЭМ

 

 

Блок — независимый компонент страницы

Элемент — составная часть блока

Элемент — составная часть блока

Элемент — составная часть блока

Модификатор задаёт особые свойства

<button class="button button_theme_action button_size_m wizard-phone2__action wizard-phone2__action_type_confirm-phone i-bem button_js_inited" type="button" role="button" onclick="return {&quot;button&quot;:{}}"><span class="button__text">Подтвердить</span></button>
bh.apply({
    block: 'button',
    mods: { theme: 'action', size: 'm' },
    content: 'Подтвердить'
})
  • github.com/bem/bem-tools
  • github.com/enb-make/enb
  • github.com/floatdrop/gulp-bem
  • bem.info/tools/templating-engines/bemxjst
  • github.com/bem/bh
  • github.com/bem/bem-core
  • github.com/bem-node/bem-node
  • github.com/baby-loris/baby-bem

i-bem.js

 

i-bem.js

фреймворк для управления блоками

button.setMod('pressed', 'yes')
button.elem('text')
button.on('change', fn)
button.setText('Нажми меня!')
button.findBlockOutside('form').submit();
form.findBlockInside('button').on('click', cb);

vs

$button.parent('.form').submit();
$form.find('.button').on('click', cb);
button.on('click', function () {
    BEM.channel('form').trigger('submit');    
})

BEM.channel('form').on('submit', function () {
    // реагируем на событие
})

vs

$button.on('click', function () {
    $('body').trigger('form.submit');    
})

$('body').on('form.submit', function () {
    // реагируем на событие
})

Как сделать систему понятной,не увеличивая связность блоков?

i-bem.js

the good parts

form → phone
form → phone

Ограничим видимость

Блок не должен знать о том, что происходит снаружи.

Поток данных

вниз — вызов API блока

form.findBlockInside('phone').setVal('223-322')

вверх — подписка на события

form.findBlockInside('phone').on('change', fn);
form → summary → phone → input
form → summary → phone → input
form → summary → phone → input
form → summary → phone → input

Ограничим полномочия

Не все блоки могут знать о других блоках

form → summary → phone → input
form.findBlockInside('summary').calc();
summary.findBlockInside('phone').submit();
phone.findBlockInside('input').setVal('223-322');
form.findBlockInside('summary').calc();
form.findBlockInside('phone').submit();
form.findBlockInside('input').setVal('223-322');
form → summary → phone → input
form.findBlockInside('summary').calc();
summary.findBlockInside('phone').submit();
phone.findBlockInside('input').setVal('223-322');
form.findBlockInside('summary').calc();
form.findBlockInside('phone').submit();
form.findBlockInside('input').setVal('223-322');

Отделим данные

Данные должны храниться в особых блоках

userStore.register(header);
userStore.register(form);

userStore.set('name', 'Роман Парадеев');
userStore.emitChange();

Ну что там,когда уже про Flux?

А это он и есть

BEM ♥ FLUX

Спасибо за внимание : )

1
#author { font-size: .8em; line-height: 1; margin-top: 5em; } #author-desc { font-size: .7em; line-height: 1; } .reveal pre.shaded code { color: #777; } .shaded .hljs-keyword, .shaded .hljs-tag, .shaded .css .hljs-class, .shaded .css .hljs-id, .shaded .lisp .hljs-title, .shaded .nginx .hljs-title, .shaded .hljs-request, .shaded .hljs-status, .shaded .clojure .hljs-attribute { color: #777; } .shaded .dos .hljs-keyword, .shaded .python .hljs-decorator, .shaded .hljs-title, .shaded .haskell .hljs-type, .shaded .diff .hljs-header, .shaded .ruby .hljs-class .hljs-parent, .shaded .apache .hljs-tag, .shaded .nginx .hljs-built_in, .shaded .tex .hljs-command, .shaded .hljs-prompt { color: #777; } .shaded .diff .hljs-deletion, .shaded .hljs-string, .shaded .hljs-tag .hljs-value, .shaded .hljs-preprocessor, .shaded .hljs-pragma, .shaded .hljs-built_in, .shaded .sql .hljs-aggregate, .shaded .hljs-javadoc, .shaded .smalltalk .hljs-class, .shaded .smalltalk .hljs-localvars, .shaded .smalltalk .hljs-array, .shaded .css .hljs-rules .hljs-value, .shaded .hljs-attr_selector, .shaded .hljs-pseudo, .shaded .apache .hljs-cbracket, .shaded .tex .hljs-formula, .shaded .coffeescript .hljs-attribute { color: #777; } .shaded .hljs-tag:nth-child(1) .hljs-value:nth-child(3) { color: #CC9393; } БЭМ + Flux EkbJS 2. 2015-09-04 Роман Парадеев разработчик, Яндекс