53

JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

  • Upload
    others

  • View
    13

  • Download
    0

Embed Size (px)

Citation preview

Page 1: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы
Page 2: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

JSX? Пфф!

Владимир Гриненко WSD, Москва, 28 января 2017

Page 3: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Я не умею в React

Page 4: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы
Page 5: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

React

Page 6: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Чего не хватает

Модификаторов

Уровней переопределения

(для любителей) Предметной области БЭМ

6

Page 7: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

bem-react-core

Page 8: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Что это

Обертка над стандартными React-компонентами

Полностью совместима со стандартными компонентами

Не требует знания БЭМ

Не требует использования модификаторов

Не требует использования уровней переопределения

8

Page 9: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Что это

Автоматизирует генерацию классов

Позволяет использовать элементы, модификаторы и миксы

Позволяет использовать уровни переопределения

Оперирует компонентами, а не путями

9

Page 10: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы
Page 11: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Пример

<div class='hello'>world</div>

11

Page 12: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Было

12

import React, {Component} from 'react';

export default class Hello extends Component {

render() {

return (

<div className='hello'>world</div>

);

}

}

Page 13: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Стало

13

import {decl} from 'bem-react-core';

export default decl({

block: 'hello',

content() {

return 'world';

}

});

Page 14: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Lifecycle-методы

14

import decl from 'bem-react-core';

export default decl({

block: 'Hello',

willMount() {},

didMount() {},

willReceiveProps() {},

shouldUpdate() {},

willUpdate() {},

didUpdate() {},

willUnmount() {}

});

Page 15: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Импорт

import Hello from 'b:hello';

ReactDOM.render(

<Hello />,

//...

);

15

Page 16: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Импорт

var Hello = [

require('path/to/hello/hello.js')

][0].applyDecls();

ReactDOM.render(<Hello />);

16

Page 17: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Траншпиллеры

webpack-bem-loader

babel-plugin-bem-import

17

Page 18: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Зачем все это?

Page 19: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Модификаторы

Page 20: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Модификаторы

.block1 { color: red; }

.b1_modified { color: green; font-size: 24px; }

<div class="b1"></div> <div class="b1 b1_modified"></div>

20

Page 21: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Модификаторы

.block1 { color: red; }

.block1_modified { color: green; font-size: 24px; }

<div class="b1"></div> <div class="b1 b1_modified"></div>

21

Page 22: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Модификаторы

.block1 { color: red; }

.block1_modified { color: green; font-size: 24px; }

<div class="block1"></div> <div class="block1 block1_modified"></div>

22

Page 23: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Какие проблемы в React?

Page 24: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Какие проблемы?

Модификации бывают опциональными

отдельные файлы

можно выразить через class InputWithClear extends Input

24

Page 25: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Какие проблемы?

Опциональные модификацииКомпозитные модификации

пересечение всех вариантов не выражается через наследование

Input, Input_with-clear, Input_with-icon

25

Page 26: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Модификатор: bem-react-core

26

// CheckBox_type_button.js

import {declMod} from 'bem-react-core';

import React from 'react';

import Button from 'b:Button';

export default declMod(({ type }) => type === 'button', {

block: 'CheckBox',

mods({ type }) {

return { ...this.__base.apply(this, arguments), type };

},

content() { return <Button … /> }

});

Page 27: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Модификатор: bem-react-core

27

import CheckBox from 'b:MyBlock m:type=button';

<CheckBox type="button">my check box</CheckBox>

Page 28: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы
Page 29: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Уровни переопределения

Page 30: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Для чего?Общая библиотека и проекты

30

Page 31: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Для чего?Общая библиотека и проекты

31

lego

serp images video news

Page 32: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Для чего?Общая библиотека и проектыПлатформы

32

Page 33: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Для чего?Общая библиотека и проектыПлатформы

33

common

desktop touch

Page 34: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Для чего?Общая библиотека и проектыПлатформы

34

common

desktop touch

pad phone

Page 35: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Для чего?Общая библиотека и проектыПлатформыДизайн

35

Page 36: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Для чего?Общая библиотека и проектыПлатформыДизайнЭксперименты

36

experiments

exp1 exp2 exp3

Page 37: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы
Page 38: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Как это работает/* level1/b1/b1.css */

.block1 { color: red; }

/* level2/b1/b1.css */

.block1 { color: green; font-size: 24px;

}

38

Page 39: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Уровни переопределения

[

'path/to/level1', 'path/to/level2' ]

39

Page 40: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Уровни переопределения

/* styles.css */

@import path/to/level1/block1/block1.css; @import path/to/level2/block1/block1.css;

40

Page 41: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Уровень переопределения: bem-react-core

41

// blocks/Link/Link.js

import decl from 'bem-react-core';

export default decl({

block: 'Link',

tag: 'a',

attrs({ url }) {

return { href: url };

}

});

<Link url="…">… <a class="Link" href="…">…

Page 42: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Уровень переопределения: bem-react-core

42

// blocks/Link/Link.js

// a11y/blocks/Link/Link.js

import decl from 'bem-react-core';

export default decl({

block : 'Link',

attrs() {

return { ...this.__base.apply(this, arguments), role : 'link' };

}

}

<Link url="…">… <a class="Link" href="…" role="link">…

Page 43: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы
Page 44: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы
Page 45: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

github.com/awinogradov/bem-

react-stub

Page 46: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

github.com/bem/bem-xjst/

Page 47: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Итого

Page 48: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

ИтогоБЭМ не только для CSS!Зачем нужно что-то кроме обычного React-компонента?

местами меньше кода за счёт стандартного render()

переопределения по маленьким составным частям

1. модификаторы

2. уровни переопределения

БЭМ, если вы привыкли48

Page 49: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы
Page 50: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы
Page 51: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

Work In Progress!

bem.infogithub.com/bem/bem-react-coregithub.com/bem/webpack-bem-loadergithub.com/bem/bem-react-components

51

Page 52: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы

52

Контакты

@tadatuta

i.tadatuta

+7 (978) 096 88 87

[email protected]

Page 53: JSX? Пфф · Что это Автоматизирует генерацию классов Позволяет использовать элементы, модификаторы