SlideShare una empresa de Scribd logo
1 de 40
Descargar para leer sin conexión
Win-win с react.js
Максим Климишин
!
CTO at Zakaz.ua
!
!
@maxmaxmaxmax
• Бегаю
• Рублю дрова
• Увлекаюсь политикой
Обо мне
React.js
React.js
JavaScript библиотека для создания UI
(Wikipedia)
!
!
Надо описать, как приложение должно
выглядеть в любой момент времени и
React.js автоматически будет управлять
всеми обновлениями UI, если основные
данные поменяются
Что такое UI?
UI – это интерактивная проекция
состояния приложения
React.js tree
• Компоненты React.js реализованы в
виде дерева
• Есть Root Node, от которой все пляшет
• Каждый компонент может содержать
дочерние компоненты
• В дочерние компоненты можно
передавать состояние в виде аттрибутов
• Дочерний компонент не может изменить
props, которые были ему переданы из
родительского компонента
Виртуальное DOM дерево
• Virtual DOM - это объекты JS, которые
описывают структуру UI
• Реакт использует алгоритм, для
нахождения минимального числа шагов
модификаций DOM дерева в браузере
JSX
• XML-похожий трансформер синтаксиса
в JavaScript (React.DOM)
!
• Визуализирует структуру DOM внутри
React.js компонент
!
• Помогает избежать избыточного кода на
чистом JavaScript и повысить
читаемость компонент
Hello, John!
/** @jsx React.DOM */!
var HelloMessage = React.createClass({!
render: function() {!
return <div>Hello {this.props.name}</div>;!
}!
});!
!
React.renderComponent(!
<HelloMessage name="John" />, mountNode);!
JSX to JS
/** @jsx React.DOM */!
var HelloMessage = React.createClass({displayName:
'HelloMessage',!
render: function() {!
return React.DOM.div(null, "Hello ", this.props.name);!
}!
});!
!
React.renderComponent(!
HelloMessage( {name:"John"} ),
document.getElementById("hello"));!
Rendering
• Во время вызова setState реакт
помечает его как “грязный” (dirty) и
перестраивает виртуальное DOM
дерево
• На следующей итерации event loop-a
происходит обновление
Diff алгоритмы и массивы
• Особый случай для списков - по
умолчанию элементы списка
ассоциировались последовательно
• Для однозначного маппинга между
элементом списка и компонентой
React.js необходимо указывать ключ
Решаем сами, что рендерим
• По желанию можно самостоятельно
решать изменилось ли дерево
boolean shouldComponentUpdate(
object nextProps, object nextState)
Синтетические события
• React.js слушает события только с
корневой ноды
• Когда событие происходит, react.js ищет
компонент, соответствующей ноде,
которая сгенерировала событие
• Дальше React.js оборачивает событие в
SyntheticEvent
• И это дело работает совершенно
одинаково во всех поддерживаемых
браузерах
Работа с CSS
• Поначалу в React.js было неудобно
работать с классами CSS
<div className=“class-a class-b class-c class-d class-e
class-f class-…>
</div>
• Но появился classSet и жизнь
наладилась
classSet
{
render: function() {
var cx = React.addons.classSet;
var classes = cx({
'message': true,
'message-important': this.props.isImportant,
'message-read': this.props.isRead
});
// same final string, but much cleaner
return (
<div className={classes}>Great, I'll be there.</div>
)
}
}
Рутинное телодвижение кажется
сложным
var NoLink = React.createClass({
getInitialState: function() {
return {value: 'Hello!'};
},
handleChange: function(event) {
this.setState({value: event.target.value});
},
render: function() {
var value = this.state.value;
return <input type="text" value={value}
onChange={this.handleChange} />;
}
});
Two way data binding
• Angular и Ember разбаловал некоторых
разработчиков в плане two-way data
binding.
!
• Но пацанчики из facebook оказались
ровными и сделали linkState …
Two way data binding
var WithLink = React.createClass({
mixins: [React.addons.LinkedStateMixin],
getInitialState: function() {
return {value: 'Hello!'};
},
render: function() {
return <input type="text"
valueLink={this.linkState('value')} />;
}
});
Чем хорошо для дела
• Практически нет гемора для поддержки
зоопарка браузеров
• Быстрая и “не распухающая” разработка
новых фич
• Легко внедряется в существующий и
работающий код
• Легко ре-использовать компоненты
• Сложно написать “говнокод” - помогает
односторонний data flow
Производительность
Based on: http://vuejs.org/perf/
Backbone
React
Plain JS
0 10 20 30 40
Анимация 100 кружков, Chrome 34, ~ms на цикл
Model & Controller
React.js занимается только
уровнем представления
А что насчет приложений?
Flux
Flux - это архитектура/design pattern
приложений для Rect.js, которая
использует однонаправленный поток
данных
Идея архитектуры Flux
Что внутри Flux?
• По сути Flux - design pattern, уникальная
тулза - Dispatcher
• В экземпляр диспетчера региструются
колебли, присваивается уникальный ID
• Диспетчеру можно послать некоторое
событие (dispatcher.dispatch)
• Внутри коллбека можно объявить
зависимость от выполнения другого
(dispatcher.waitFor)
• Коллбеки будут выполнены согласно
описанным зависимостям
Какую проблемы решает Flux?
• Мультинаправленное движение данных
внутри приложения
• Структурную организацию React.js-
based приложений
• Избыточный инструментарий, которые
приезжает с хранилищами из других
подходов
• Структурирование зависимостей
хэндлеров событий
Bidirectional data flow
Button 1
Button 2
Input 1
Input 2
Result area 1
Result area 2
Handler 3
API Endpoint 1
API Endpoint 2
API Endpoint 3
Handler 2
Handler 1
Handler 4
Среднесложное приложение на jQuery
Bidirectional data flow
Action
View 1
View 2
View 3
State Action
State
State
State
Flux Dispatcher
var base = new Dispatcher();
var v1 = {"country": null}, v2 = {"city": null},
v3 = {"price": null};
!
v1.dispatchToken = base.register(function (payload) {
console.log("v1 handler");
if (payload.actionType == "update-v1")
v1.country = payload.country;
console.log(v1.country, v2.city, v3.price);
});
!
Flux Dispatcher
v2.dispatchToken = base.register(function (payload) {
console.log("v2 handler");
if (payload.actionType === "update-v1") {
base.waitFor([v1.dispatchToken]);
v2.city = payload.country + " - related data to v2";
}
console.log(v1.country, v2.city, v3.price);
});
!
base.register(function (payload) {
console.log("v3 handler");
if (payload.actionType === "update-v2") {
base.waitFor([v1.dispatchToken, v2.dispatchToken]);
v2.city = payload.city; v3.price = 123;
}
console.log(v1.country, v2.city, v3.price);
});
Flux Dispatcher
!
document.getElementById("dispatch").addEventListener("click",
function () {
base.dispatch({
actionType: "update-v1",
country: 'ukraine'
});
base.dispatch({
actionType: "update-v2",
city: "kiev"});
});
Результат
v1 handler
ukraine kiev 123
v2 handler
ukraine ukraine - related data to v2 123
v3 handler
ukraine ukraine - related data to v2 123
!
v1 handler
ukraine ukraine - related data to v2 123
v2 handler
ukraine ukraine - related data to v2 123
v3 handler
ukraine kiev 123
А нахера это нужно?
Разделение ответственности (Separation
of concerns) - уменьшать связанность
между модулями, увеличивать
связность внутри модуля
Please, stop the bullshit
© John Legere, T-Mobile CEO
Coupling vs cohesion?
• Связанность плоха тем, что она мешает
менять компоненты независимо от
общего кода
• Разработчику необходимо понимать как
работает вся система для того, чтобы
безопасно внести изменения
• Изменения требований потенциально
влечет рефакторинг нескольких
компонент
• Стоимость изменений выше
Спасибо за горячую воду, Львов!
Спасибо!
!
facebook.github.io/react/
!
facebook.github.io/flux/

Más contenido relacionado

La actualidad más candente

некоторые проблемы внедрения Ajax технологии в Asp.Net проекты роман правук
некоторые проблемы внедрения Ajax технологии в Asp.Net проекты   роман правукнекоторые проблемы внедрения Ajax технологии в Asp.Net проекты   роман правук
некоторые проблемы внедрения Ajax технологии в Asp.Net проекты роман правук
Media Gorod
 

La actualidad más candente (8)

FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + ReduxFrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
 
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нёмFrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
 
Liquibase: Enterprise Edition
Liquibase: Enterprise EditionLiquibase: Enterprise Edition
Liquibase: Enterprise Edition
 
День 3: Автоматизированное тестирование: Openshift
 День 3: Автоматизированное тестирование: Openshift День 3: Автоматизированное тестирование: Openshift
День 3: Автоматизированное тестирование: Openshift
 
Миграция существующих приложений в Windows Azure
Миграция существующих приложений в Windows AzureМиграция существующих приложений в Windows Azure
Миграция существующих приложений в Windows Azure
 
Rambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и Swift
 
некоторые проблемы внедрения Ajax технологии в Asp.Net проекты роман правук
некоторые проблемы внедрения Ajax технологии в Asp.Net проекты   роман правукнекоторые проблемы внедрения Ajax технологии в Asp.Net проекты   роман правук
некоторые проблемы внедрения Ajax технологии в Asp.Net проекты роман правук
 
Impress Application Server for node.js (ru)
Impress Application Server for node.js (ru)Impress Application Server for node.js (ru)
Impress Application Server for node.js (ru)
 

Similar a LvivJS 2014 - Win-win c React.js

Повышение эффективности Java приложений (новые возможности Web Logic 12c, кон...
Повышение эффективности Java приложений (новые возможности Web Logic 12c, кон...Повышение эффективности Java приложений (новые возможности Web Logic 12c, кон...
Повышение эффективности Java приложений (новые возможности Web Logic 12c, кон...
Andrey Akulov
 
Observable как атом приложения
Observable как атом приложенияObservable как атом приложения
Observable как атом приложения
Artem Bey
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012
Dmytro Mindra
 
Паттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийПаттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложений
GoSharp
 
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации..."Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
Yandex
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
Andrew Mayorov
 

Similar a LvivJS 2014 - Win-win c React.js (20)

Артем Тритяк, Lead Front-End developer в Electric Cloud
 Артем Тритяк, Lead Front-End developer в Electric Cloud Артем Тритяк, Lead Front-End developer в Electric Cloud
Артем Тритяк, Lead Front-End developer в Electric Cloud
 
Повышение эффективности Java приложений (новые возможности Web Logic 12c, кон...
Повышение эффективности Java приложений (новые возможности Web Logic 12c, кон...Повышение эффективности Java приложений (новые возможности Web Logic 12c, кон...
Повышение эффективности Java приложений (новые возможности Web Logic 12c, кон...
 
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
 Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере" Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
 
Adn@it'summer - Изоморфные приложения с React и Redux
Adn@it'summer - Изоморфные приложения с React и ReduxAdn@it'summer - Изоморфные приложения с React и Redux
Adn@it'summer - Изоморфные приложения с React и Redux
 
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
 
Observable как атом приложения
Observable как атом приложенияObservable как атом приложения
Observable как атом приложения
 
RichFaces: обзор
RichFaces: обзорRichFaces: обзор
RichFaces: обзор
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012
 
Паттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийПаттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложений
 
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации..."Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
 
Как я перестал беспокоиться и полюбил Redux
Как я перестал беспокоиться и полюбил ReduxКак я перестал беспокоиться и полюбил Redux
Как я перестал беспокоиться и полюбил Redux
 
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.jsTrainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js
 
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
 
Микросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и KubernetesМикросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и Kubernetes
 
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковРендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей Солодовников
 
webpack: 7 бед - один ответ
webpack: 7 бед - один ответwebpack: 7 бед - один ответ
webpack: 7 бед - один ответ
 
jQuery как путь к RIA
jQuery как путь к RIAjQuery как путь к RIA
jQuery как путь к RIA
 
React native. Bridge From Web To Mobile. Intro
React native. Bridge From Web To Mobile. IntroReact native. Bridge From Web To Mobile. Intro
React native. Bridge From Web To Mobile. Intro
 

Más de Max Klymyshyn

Зачем читать чужой код?
Зачем читать чужой код?Зачем читать чужой код?
Зачем читать чужой код?
Max Klymyshyn
 

Más de Max Klymyshyn (20)

Papers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON Datatype
Papers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON DatatypePapers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON Datatype
Papers We Love Kyiv, July 2018: A Conflict-Free Replicated JSON Datatype
 
KharkivJS 2017: Коллаборативные системы и CRDT
KharkivJS 2017: Коллаборативные системы и CRDTKharkivJS 2017: Коллаборативные системы и CRDT
KharkivJS 2017: Коллаборативные системы и CRDT
 
OdessaJS 2017: Groupware Systems for fun and profit
OdessaJS 2017: Groupware Systems for fun and profitOdessaJS 2017: Groupware Systems for fun and profit
OdessaJS 2017: Groupware Systems for fun and profit
 
PyCon Ukraine 2017: Operational Transformation
PyCon Ukraine 2017: Operational Transformation PyCon Ukraine 2017: Operational Transformation
PyCon Ukraine 2017: Operational Transformation
 
Communicating Sequential Processes (CSP) in JavaScript
Communicating Sequential Processes (CSP) in JavaScriptCommunicating Sequential Processes (CSP) in JavaScript
Communicating Sequential Processes (CSP) in JavaScript
 
PiterPy 2016: Parallelization, Aggregation and Validation of API in Python
PiterPy 2016: Parallelization, Aggregation and Validation of API in PythonPiterPy 2016: Parallelization, Aggregation and Validation of API in Python
PiterPy 2016: Parallelization, Aggregation and Validation of API in Python
 
Fighting async JavaScript (CSP)
Fighting async JavaScript (CSP)Fighting async JavaScript (CSP)
Fighting async JavaScript (CSP)
 
React.js: Ускоряем UX/UI
React.js: Ускоряем UX/UIReact.js: Ускоряем UX/UI
React.js: Ускоряем UX/UI
 
KharkovPy #12: I/O in Python apps and smart logging (russian)
KharkovPy #12: I/O in Python apps and smart logging (russian)KharkovPy #12: I/O in Python apps and smart logging (russian)
KharkovPy #12: I/O in Python apps and smart logging (russian)
 
5 мифов о производительности баз данных и Python
5 мифов о производительности баз данных и Python5 мифов о производительности баз данных и Python
5 мифов о производительности баз данных и Python
 
Изоформные приложения на React.js
Изоформные приложения на React.jsИзоформные приложения на React.js
Изоформные приложения на React.js
 
Изоморфный JavaScript (iForum 2015)
Изоморфный JavaScript (iForum 2015)Изоморфный JavaScript (iForum 2015)
Изоморфный JavaScript (iForum 2015)
 
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScriptТрансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
Трансдюсеры, CSP каналы, неизменяемые структуры данных в JavaScript
 
PiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и PythonPiterPy 2015 - Трансдюсеры и Python
PiterPy 2015 - Трансдюсеры и Python
 
Robust web apps with React.js
Robust web apps with React.jsRobust web apps with React.js
Robust web apps with React.js
 
Инновации и JavaScript
Инновации и JavaScriptИнновации и JavaScript
Инновации и JavaScript
 
Odessapy2013 - Graph databases and Python
Odessapy2013 - Graph databases and PythonOdessapy2013 - Graph databases and Python
Odessapy2013 - Graph databases and Python
 
Angular.js - JS Camp UKraine 2013
Angular.js - JS Camp UKraine 2013Angular.js - JS Camp UKraine 2013
Angular.js - JS Camp UKraine 2013
 
Зачем читать чужой код?
Зачем читать чужой код?Зачем читать чужой код?
Зачем читать чужой код?
 
AgileBaseCamp 2013 - Start Up and Get Done
AgileBaseCamp 2013 - Start Up and Get DoneAgileBaseCamp 2013 - Start Up and Get Done
AgileBaseCamp 2013 - Start Up and Get Done
 

LvivJS 2014 - Win-win c React.js

  • 1. Win-win с react.js Максим Климишин ! CTO at Zakaz.ua ! ! @maxmaxmaxmax
  • 2. • Бегаю • Рублю дрова • Увлекаюсь политикой Обо мне
  • 4. React.js JavaScript библиотека для создания UI (Wikipedia) ! ! Надо описать, как приложение должно выглядеть в любой момент времени и React.js автоматически будет управлять всеми обновлениями UI, если основные данные поменяются
  • 5. Что такое UI? UI – это интерактивная проекция состояния приложения
  • 6. React.js tree • Компоненты React.js реализованы в виде дерева • Есть Root Node, от которой все пляшет • Каждый компонент может содержать дочерние компоненты • В дочерние компоненты можно передавать состояние в виде аттрибутов • Дочерний компонент не может изменить props, которые были ему переданы из родительского компонента
  • 7. Виртуальное DOM дерево • Virtual DOM - это объекты JS, которые описывают структуру UI • Реакт использует алгоритм, для нахождения минимального числа шагов модификаций DOM дерева в браузере
  • 8. JSX • XML-похожий трансформер синтаксиса в JavaScript (React.DOM) ! • Визуализирует структуру DOM внутри React.js компонент ! • Помогает избежать избыточного кода на чистом JavaScript и повысить читаемость компонент
  • 9. Hello, John! /** @jsx React.DOM */! var HelloMessage = React.createClass({! render: function() {! return <div>Hello {this.props.name}</div>;! }! });! ! React.renderComponent(! <HelloMessage name="John" />, mountNode);!
  • 10. JSX to JS /** @jsx React.DOM */! var HelloMessage = React.createClass({displayName: 'HelloMessage',! render: function() {! return React.DOM.div(null, "Hello ", this.props.name);! }! });! ! React.renderComponent(! HelloMessage( {name:"John"} ), document.getElementById("hello"));!
  • 11.
  • 12. Rendering • Во время вызова setState реакт помечает его как “грязный” (dirty) и перестраивает виртуальное DOM дерево • На следующей итерации event loop-a происходит обновление
  • 13. Diff алгоритмы и массивы • Особый случай для списков - по умолчанию элементы списка ассоциировались последовательно • Для однозначного маппинга между элементом списка и компонентой React.js необходимо указывать ключ
  • 14. Решаем сами, что рендерим • По желанию можно самостоятельно решать изменилось ли дерево boolean shouldComponentUpdate( object nextProps, object nextState)
  • 15. Синтетические события • React.js слушает события только с корневой ноды • Когда событие происходит, react.js ищет компонент, соответствующей ноде, которая сгенерировала событие • Дальше React.js оборачивает событие в SyntheticEvent • И это дело работает совершенно одинаково во всех поддерживаемых браузерах
  • 16. Работа с CSS • Поначалу в React.js было неудобно работать с классами CSS <div className=“class-a class-b class-c class-d class-e class-f class-…> </div> • Но появился classSet и жизнь наладилась
  • 17. classSet { render: function() { var cx = React.addons.classSet; var classes = cx({ 'message': true, 'message-important': this.props.isImportant, 'message-read': this.props.isRead }); // same final string, but much cleaner return ( <div className={classes}>Great, I'll be there.</div> ) } }
  • 18. Рутинное телодвижение кажется сложным var NoLink = React.createClass({ getInitialState: function() { return {value: 'Hello!'}; }, handleChange: function(event) { this.setState({value: event.target.value}); }, render: function() { var value = this.state.value; return <input type="text" value={value} onChange={this.handleChange} />; } });
  • 19. Two way data binding • Angular и Ember разбаловал некоторых разработчиков в плане two-way data binding. ! • Но пацанчики из facebook оказались ровными и сделали linkState …
  • 20. Two way data binding var WithLink = React.createClass({ mixins: [React.addons.LinkedStateMixin], getInitialState: function() { return {value: 'Hello!'}; }, render: function() { return <input type="text" valueLink={this.linkState('value')} />; } });
  • 21. Чем хорошо для дела • Практически нет гемора для поддержки зоопарка браузеров • Быстрая и “не распухающая” разработка новых фич • Легко внедряется в существующий и работающий код • Легко ре-использовать компоненты • Сложно написать “говнокод” - помогает односторонний data flow
  • 22. Производительность Based on: http://vuejs.org/perf/ Backbone React Plain JS 0 10 20 30 40 Анимация 100 кружков, Chrome 34, ~ms на цикл
  • 23. Model & Controller React.js занимается только уровнем представления
  • 24.
  • 25. А что насчет приложений?
  • 26. Flux
  • 27. Flux - это архитектура/design pattern приложений для Rect.js, которая использует однонаправленный поток данных
  • 29. Что внутри Flux? • По сути Flux - design pattern, уникальная тулза - Dispatcher • В экземпляр диспетчера региструются колебли, присваивается уникальный ID • Диспетчеру можно послать некоторое событие (dispatcher.dispatch) • Внутри коллбека можно объявить зависимость от выполнения другого (dispatcher.waitFor) • Коллбеки будут выполнены согласно описанным зависимостям
  • 30. Какую проблемы решает Flux? • Мультинаправленное движение данных внутри приложения • Структурную организацию React.js- based приложений • Избыточный инструментарий, которые приезжает с хранилищами из других подходов • Структурирование зависимостей хэндлеров событий
  • 31. Bidirectional data flow Button 1 Button 2 Input 1 Input 2 Result area 1 Result area 2 Handler 3 API Endpoint 1 API Endpoint 2 API Endpoint 3 Handler 2 Handler 1 Handler 4 Среднесложное приложение на jQuery
  • 32. Bidirectional data flow Action View 1 View 2 View 3 State Action State State State
  • 33. Flux Dispatcher var base = new Dispatcher(); var v1 = {"country": null}, v2 = {"city": null}, v3 = {"price": null}; ! v1.dispatchToken = base.register(function (payload) { console.log("v1 handler"); if (payload.actionType == "update-v1") v1.country = payload.country; console.log(v1.country, v2.city, v3.price); }); !
  • 34. Flux Dispatcher v2.dispatchToken = base.register(function (payload) { console.log("v2 handler"); if (payload.actionType === "update-v1") { base.waitFor([v1.dispatchToken]); v2.city = payload.country + " - related data to v2"; } console.log(v1.country, v2.city, v3.price); }); ! base.register(function (payload) { console.log("v3 handler"); if (payload.actionType === "update-v2") { base.waitFor([v1.dispatchToken, v2.dispatchToken]); v2.city = payload.city; v3.price = 123; } console.log(v1.country, v2.city, v3.price); });
  • 35. Flux Dispatcher ! document.getElementById("dispatch").addEventListener("click", function () { base.dispatch({ actionType: "update-v1", country: 'ukraine' }); base.dispatch({ actionType: "update-v2", city: "kiev"}); });
  • 36. Результат v1 handler ukraine kiev 123 v2 handler ukraine ukraine - related data to v2 123 v3 handler ukraine ukraine - related data to v2 123 ! v1 handler ukraine ukraine - related data to v2 123 v2 handler ukraine ukraine - related data to v2 123 v3 handler ukraine kiev 123
  • 37. А нахера это нужно? Разделение ответственности (Separation of concerns) - уменьшать связанность между модулями, увеличивать связность внутри модуля Please, stop the bullshit © John Legere, T-Mobile CEO
  • 38. Coupling vs cohesion? • Связанность плоха тем, что она мешает менять компоненты независимо от общего кода • Разработчику необходимо понимать как работает вся система для того, чтобы безопасно внести изменения • Изменения требований потенциально влечет рефакторинг нескольких компонент • Стоимость изменений выше
  • 39. Спасибо за горячую воду, Львов!