SlideShare a Scribd company logo
Коротко о React.js
Автор: Александр Вишняков MadDevs
О чем поговорим
● React - почему он нужен?
● Flux Utils
● Redux
● Частые ошибки разработчиков
React - зачем он нужен?
● Гибкая архитектура
● Разделение ответственностей
● Легкое тестирование
● Переиспользование кода
Flux Utils
● Удобное создание Store с использованием
ReduceStore<T>
● Контейнеры Container.create()
○ Взаимодействует со всеми Store
○ Освобождает компонент от связности со Store,
оставляя только использование action’ов внутри
компонента
Redux
Redux Store
● Все состояния хранятся в едином сторе. Всего один стор на все
приложение.
● store.getState() - так получаем содержимое состояния Store
● Состояние нельзя изменять на прямую, минуя экшены.
● У Store как правило, нет публичных методов для изменения
состояния.
● Это чистая функция, которая обрабатывает экшены
Redux action
● Это обычно просто хеш объект, который отправляется через
dispatch({
type: ‘ACTION_TYPE_NAME’,
payload: {
…. // Данные экшена
},
meta: {
…. // Служебные данные экшна
}
})
Чистая функция
● Они зависят только от своих параметров. И возвращают только
свой результат.
● Не используют никакие глобальные переменные и не изменяют
состояние вне тела функции.
○ Math.sin(x)
○ parseInt(x, y)
○ $.ajax() - уже не чистая функция
Redux Reducer
function reducer(state, action) {
switch(action.type){
case ‘SOME_ACTION_TYPE’:
return {
alias: {
...state.alias,
...action.payload
}
}
default:
return state
}
}
Redux сайд-эффекты
● Сайд-эффект - это когда приходится изменять состояние
глобально, к примеру после обращения к API
● В классической схеме Flux паттерна, нет места таким
манипуляциям.
● Для обработки сайд-эффектов в Redux присутствует понятие
прослойки или Middleware
● Middleware - может быть много, по аналогии с веб
фреймворками (схема не нова)
Redux сайд-эффекты
Redux middleware
const logMiddleware =
store => next => action => {
console.log(action);
next(action);
}
const store = createStore(store)(reducer,
applyMiddleware(logMiddleware))
Redux-thunk
● Предоставляет возможность диспатчить функции вместо
традиционных объектов, как это принято в Redux.
● В переданной функции мы можем сделать вызов api, проделать
какие нибудь вычисления и вызвать dispatch в нужный для нас
момент.
store.dispatch((dispatch) => {
fetch(‘/api/some/data’).then(
data => dispatch(successAction(data)),
err => dispatch(failAction(err))
)
})
Redux-thunk
Import thunk from ‘redux-thunk’;
const store = createStore(reducer, applyMiddleware(thunk))
Redux thunk (пример)
const login = (user, password) => dispatch => {
const formData = new FormData();
formData.append(“user”, user)
formData.append(“password”, password)
fetch(‘/login’, { method: ‘POST’, data: formData }).then(
data => dispatch(loginSuccess(data)),
err => dispatch(loginFail(err)))
}
store.dispatch(login(‘user1’, ‘password1’))
Redux thunk (несколько экшенов за раз)
const someAction = () => (dispatch, state) => {
dispatch(someAction1(state.alias.field))
dispatch(someAction2())
}
store.dispatch(someAction())
Redux-saga
Сага - собирает всю логику обработки внутрь себя в отличии от thunk,
где приходится разбивать на мелкие функции и постоянно их
диспатчить.
В Saga - все асинхронное выполняется линейно благодаря function* в
купе с yeild
Redux-saga example
function* login(user, password) {
const formData = new FormData();
formData.append(“user”, user)
formData.append(“password”, password)
try {
const data = yield call(fetch, ‘/login’, { method: ‘POST’, data: formData })
yield put(dispatch(loginSuccess(data)))
} catch(e) {
yield put(dispatch(loginFail(e)))
}
}
Redux-saga (типы подписки при помощи
takeEvery)
function* processAction(api, { payload, meta }) { … }
function* subscribeForAction(api) {
yield* takeEvery(‘SOME_ACTION_1’, processAction, api)
}
Redux saga (подписка при помощи take и
while)
function* processAction(api, { data }, { resource, thunk }) {
try {
const detail = yield call([api, api.post], `/${resource}`, data)
yield put(actions.someSuccessAction(resource, detail, data, thunk))
} catch (e) {
yield put(actions.someFailAction(resource, e, data, thunk))
}
}
function* action1(api) {
while(true) {
const { payload, meta } = yield take(‘SOME_ACTION_1’, )
yield call(processAction(api, payload, meta))
}
}
Ошибки разработчиков
● Обертка в ( ) => { … } обработчиков события
<Component onClick={ (e) => someHandler(e) } />
Ошибки разработчиков
● Использование неправильных значений для свойства key={}
компонента
{ list.each((item, index) => {
<Component key={Math.random()} data={item}/>
// или
<Component key={index} data={item}/>
})
Ошибки разработчиков
● Рендер коллекции компонентов и хардкод передаваемых
данных в событии компонента.
○ Это неверное распределение обязанностей, возложенное
на родительский компонент
{
list.each((item, index) => {
<Component key={item.id} data={item}
onClick={(e) => onItemSelect(item)}/>
})
}

More Related Content

What's hot

«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​
FDConf
 
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + ReduxFrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012
dmalykhanov
 
Жизнь после promises
Жизнь после promisesЖизнь после promises
Жизнь после promises
Vitebsk DSC
 
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
MoscowJS
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузера
Platonov Sergey
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentationIvan Filimonov
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
MoscowJS
 
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
Ontico
 
CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»
CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»
CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»
Mail.ru Group
 
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нёмFrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
Noveo
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
Alex Tumanoff
 
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
Синхронный MODX: как сделать настоящую синхронизацию и не застрелитьсяСинхронный MODX: как сделать настоящую синхронизацию и не застрелиться
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
MODX Беларусь
 
Performance optimisation in javascript
Performance optimisation in javascriptPerformance optimisation in javascript
Performance optimisation in javascript
Артем Захарченко
 
Изоморфные приложения и Python - Виталий Глибин, Huntflow
Изоморфные приложения и Python - Виталий Глибин, HuntflowИзоморфные приложения и Python - Виталий Глибин, Huntflow
Изоморфные приложения и Python - Виталий Глибин, Huntflow
it-people
 
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriver
Илья Кожухов
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Ontico
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
Vasya Petrov
 

What's hot (20)

«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​
 
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + ReduxFrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012
 
Жизнь после promises
Жизнь после promisesЖизнь после promises
Жизнь после promises
 
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузера
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentation
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
 
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
 
CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»
CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»
CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»
 
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нёмFrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
FrontDays #1. Алексей Ульянов, React.js и методологии разработки на нём
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
Синхронный MODX: как сделать настоящую синхронизацию и не застрелитьсяСинхронный MODX: как сделать настоящую синхронизацию и не застрелиться
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
 
Performance optimisation in javascript
Performance optimisation in javascriptPerformance optimisation in javascript
Performance optimisation in javascript
 
Изоморфные приложения и Python - Виталий Глибин, Huntflow
Изоморфные приложения и Python - Виталий Глибин, HuntflowИзоморфные приложения и Python - Виталий Глибин, Huntflow
Изоморфные приложения и Python - Виталий Глибин, Huntflow
 
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriver
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 

Similar to Коротко о React.js

ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf Conference
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Sigma Software
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
Oleksii Okhrymenko
 
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
WebCamp
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
LogeekNightUkraine
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
Sergey Teplyakov
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9Technopark
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
yaevents
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
Roman Dvornov
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
Platonov Sergey
 
Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капля
meet_magento
 
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
IT Event
 
LvivJS 2014 - Win-win c React.js
LvivJS 2014 - Win-win c React.jsLvivJS 2014 - Win-win c React.js
LvivJS 2014 - Win-win c React.js
Max Klymyshyn
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
solit
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS development
Ivan Trifonov
 
"VUE.JS как реакт с человеческим лицом" Дулецкий Вольдэмар, Evrone
"VUE.JS как реакт с человеческим лицом" Дулецкий Вольдэмар, Evrone"VUE.JS как реакт с человеческим лицом" Дулецкий Вольдэмар, Evrone
"VUE.JS как реакт с человеческим лицом" Дулецкий Вольдэмар, Evrone
it-people
 
10 задач администрирования Active directory, решаемых с помощью power shell
10 задач администрирования Active directory, решаемых с помощью power shell10 задач администрирования Active directory, решаемых с помощью power shell
10 задач администрирования Active directory, решаемых с помощью power shellAndrey Markin
 
Тестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и SeleniumТестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и Selenium
SQALab
 
Apache spark
Apache sparkApache spark
Apache spark
Anton Anokhin
 

Similar to Коротко о React.js (20)

ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
 
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
Async
AsyncAsync
Async
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капля
 
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
 
LvivJS 2014 - Win-win c React.js
LvivJS 2014 - Win-win c React.jsLvivJS 2014 - Win-win c React.js
LvivJS 2014 - Win-win c React.js
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS development
 
"VUE.JS как реакт с человеческим лицом" Дулецкий Вольдэмар, Evrone
"VUE.JS как реакт с человеческим лицом" Дулецкий Вольдэмар, Evrone"VUE.JS как реакт с человеческим лицом" Дулецкий Вольдэмар, Evrone
"VUE.JS как реакт с человеческим лицом" Дулецкий Вольдэмар, Evrone
 
10 задач администрирования Active directory, решаемых с помощью power shell
10 задач администрирования Active directory, решаемых с помощью power shell10 задач администрирования Active directory, решаемых с помощью power shell
10 задач администрирования Active directory, решаемых с помощью power shell
 
Тестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и SeleniumТестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и Selenium
 
Apache spark
Apache sparkApache spark
Apache spark
 

More from Mad Devs

Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
Mad Devs
 
Дружелюбнй онбординг: как с увеличением количества не потерять качество
Дружелюбнй онбординг: как с увеличением количества не потерять качество Дружелюбнй онбординг: как с увеличением количества не потерять качество
Дружелюбнй онбординг: как с увеличением количества не потерять качество
Mad Devs
 
Mad Stream: Software Architecture 101.
Mad Stream: Software Architecture 101. Mad Stream: Software Architecture 101.
Mad Stream: Software Architecture 101.
Mad Devs
 
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
Mad Devs
 
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy FedorenkoMad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
Mad Devs
 
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
Mad Devs
 
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий КононенкоMaв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
Mad Devs
 
Лайфхаки менеджмента на удаленке от Дмитрия Кононенко
Лайфхаки менеджмента на удаленке от Дмитрия КононенкоЛайфхаки менеджмента на удаленке от Дмитрия Кононенко
Лайфхаки менеджмента на удаленке от Дмитрия Кононенко
Mad Devs
 
Mad Talks. Astashov_splitbrain
Mad Talks. Astashov_splitbrainMad Talks. Astashov_splitbrain
Mad Talks. Astashov_splitbrain
Mad Devs
 
Flutter vs Native App Development
Flutter vs Native App DevelopmentFlutter vs Native App Development
Flutter vs Native App Development
Mad Devs
 
Mad Talks. Marketing tips for tech companies
Mad Talks. Marketing tips for tech companiesMad Talks. Marketing tips for tech companies
Mad Talks. Marketing tips for tech companies
Mad Devs
 
The paradox of choice in design
The paradox of choice in designThe paradox of choice in design
The paradox of choice in design
Mad Devs
 
Git and Github for Beginners
Git and Github for Beginners Git and Github for Beginners
Git and Github for Beginners
Mad Devs
 
How to hire freelancers
How to hire freelancersHow to hire freelancers
How to hire freelancers
Mad Devs
 
Ethereum blockchain
Ethereum blockchainEthereum blockchain
Ethereum blockchain
Mad Devs
 
"Outside In". Web application testing.
"Outside In". Web application testing."Outside In". Web application testing.
"Outside In". Web application testing.
Mad Devs
 
Asynchrony in python exists and why should you use it
Asynchrony in python exists and why should you use itAsynchrony in python exists and why should you use it
Asynchrony in python exists and why should you use it
Mad Devs
 
Ethereum: аспекты разработки смарт-контрактов
Ethereum: аспекты разработки смарт-контрактовEthereum: аспекты разработки смарт-контрактов
Ethereum: аспекты разработки смарт-контрактов
Mad Devs
 
Why we sleep. Michael Ivashenko
Why we sleep. Michael IvashenkoWhy we sleep. Michael Ivashenko
Why we sleep. Michael Ivashenko
Mad Devs
 
Удаленное управление приложением и его аналитика
Удаленное управление приложением и его аналитикаУдаленное управление приложением и его аналитика
Удаленное управление приложением и его аналитика
Mad Devs
 

More from Mad Devs (20)

Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
 
Дружелюбнй онбординг: как с увеличением количества не потерять качество
Дружелюбнй онбординг: как с увеличением количества не потерять качество Дружелюбнй онбординг: как с увеличением количества не потерять качество
Дружелюбнй онбординг: как с увеличением количества не потерять качество
 
Mad Stream: Software Architecture 101.
Mad Stream: Software Architecture 101. Mad Stream: Software Architecture 101.
Mad Stream: Software Architecture 101.
 
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
 
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy FedorenkoMad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
 
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
 
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий КононенкоMaв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
 
Лайфхаки менеджмента на удаленке от Дмитрия Кононенко
Лайфхаки менеджмента на удаленке от Дмитрия КононенкоЛайфхаки менеджмента на удаленке от Дмитрия Кононенко
Лайфхаки менеджмента на удаленке от Дмитрия Кононенко
 
Mad Talks. Astashov_splitbrain
Mad Talks. Astashov_splitbrainMad Talks. Astashov_splitbrain
Mad Talks. Astashov_splitbrain
 
Flutter vs Native App Development
Flutter vs Native App DevelopmentFlutter vs Native App Development
Flutter vs Native App Development
 
Mad Talks. Marketing tips for tech companies
Mad Talks. Marketing tips for tech companiesMad Talks. Marketing tips for tech companies
Mad Talks. Marketing tips for tech companies
 
The paradox of choice in design
The paradox of choice in designThe paradox of choice in design
The paradox of choice in design
 
Git and Github for Beginners
Git and Github for Beginners Git and Github for Beginners
Git and Github for Beginners
 
How to hire freelancers
How to hire freelancersHow to hire freelancers
How to hire freelancers
 
Ethereum blockchain
Ethereum blockchainEthereum blockchain
Ethereum blockchain
 
"Outside In". Web application testing.
"Outside In". Web application testing."Outside In". Web application testing.
"Outside In". Web application testing.
 
Asynchrony in python exists and why should you use it
Asynchrony in python exists and why should you use itAsynchrony in python exists and why should you use it
Asynchrony in python exists and why should you use it
 
Ethereum: аспекты разработки смарт-контрактов
Ethereum: аспекты разработки смарт-контрактовEthereum: аспекты разработки смарт-контрактов
Ethereum: аспекты разработки смарт-контрактов
 
Why we sleep. Michael Ivashenko
Why we sleep. Michael IvashenkoWhy we sleep. Michael Ivashenko
Why we sleep. Michael Ivashenko
 
Удаленное управление приложением и его аналитика
Удаленное управление приложением и его аналитикаУдаленное управление приложением и его аналитика
Удаленное управление приложением и его аналитика
 

Коротко о React.js

  • 1. Коротко о React.js Автор: Александр Вишняков MadDevs
  • 2. О чем поговорим ● React - почему он нужен? ● Flux Utils ● Redux ● Частые ошибки разработчиков
  • 3. React - зачем он нужен? ● Гибкая архитектура ● Разделение ответственностей ● Легкое тестирование ● Переиспользование кода
  • 4. Flux Utils ● Удобное создание Store с использованием ReduceStore<T> ● Контейнеры Container.create() ○ Взаимодействует со всеми Store ○ Освобождает компонент от связности со Store, оставляя только использование action’ов внутри компонента
  • 6. Redux Store ● Все состояния хранятся в едином сторе. Всего один стор на все приложение. ● store.getState() - так получаем содержимое состояния Store ● Состояние нельзя изменять на прямую, минуя экшены. ● У Store как правило, нет публичных методов для изменения состояния. ● Это чистая функция, которая обрабатывает экшены
  • 7. Redux action ● Это обычно просто хеш объект, который отправляется через dispatch({ type: ‘ACTION_TYPE_NAME’, payload: { …. // Данные экшена }, meta: { …. // Служебные данные экшна } })
  • 8. Чистая функция ● Они зависят только от своих параметров. И возвращают только свой результат. ● Не используют никакие глобальные переменные и не изменяют состояние вне тела функции. ○ Math.sin(x) ○ parseInt(x, y) ○ $.ajax() - уже не чистая функция
  • 9. Redux Reducer function reducer(state, action) { switch(action.type){ case ‘SOME_ACTION_TYPE’: return { alias: { ...state.alias, ...action.payload } } default: return state } }
  • 10. Redux сайд-эффекты ● Сайд-эффект - это когда приходится изменять состояние глобально, к примеру после обращения к API ● В классической схеме Flux паттерна, нет места таким манипуляциям. ● Для обработки сайд-эффектов в Redux присутствует понятие прослойки или Middleware ● Middleware - может быть много, по аналогии с веб фреймворками (схема не нова)
  • 12. Redux middleware const logMiddleware = store => next => action => { console.log(action); next(action); } const store = createStore(store)(reducer, applyMiddleware(logMiddleware))
  • 13. Redux-thunk ● Предоставляет возможность диспатчить функции вместо традиционных объектов, как это принято в Redux. ● В переданной функции мы можем сделать вызов api, проделать какие нибудь вычисления и вызвать dispatch в нужный для нас момент. store.dispatch((dispatch) => { fetch(‘/api/some/data’).then( data => dispatch(successAction(data)), err => dispatch(failAction(err)) ) })
  • 14. Redux-thunk Import thunk from ‘redux-thunk’; const store = createStore(reducer, applyMiddleware(thunk))
  • 15. Redux thunk (пример) const login = (user, password) => dispatch => { const formData = new FormData(); formData.append(“user”, user) formData.append(“password”, password) fetch(‘/login’, { method: ‘POST’, data: formData }).then( data => dispatch(loginSuccess(data)), err => dispatch(loginFail(err))) } store.dispatch(login(‘user1’, ‘password1’))
  • 16. Redux thunk (несколько экшенов за раз) const someAction = () => (dispatch, state) => { dispatch(someAction1(state.alias.field)) dispatch(someAction2()) } store.dispatch(someAction())
  • 17. Redux-saga Сага - собирает всю логику обработки внутрь себя в отличии от thunk, где приходится разбивать на мелкие функции и постоянно их диспатчить. В Saga - все асинхронное выполняется линейно благодаря function* в купе с yeild
  • 18. Redux-saga example function* login(user, password) { const formData = new FormData(); formData.append(“user”, user) formData.append(“password”, password) try { const data = yield call(fetch, ‘/login’, { method: ‘POST’, data: formData }) yield put(dispatch(loginSuccess(data))) } catch(e) { yield put(dispatch(loginFail(e))) } }
  • 19. Redux-saga (типы подписки при помощи takeEvery) function* processAction(api, { payload, meta }) { … } function* subscribeForAction(api) { yield* takeEvery(‘SOME_ACTION_1’, processAction, api) }
  • 20. Redux saga (подписка при помощи take и while) function* processAction(api, { data }, { resource, thunk }) { try { const detail = yield call([api, api.post], `/${resource}`, data) yield put(actions.someSuccessAction(resource, detail, data, thunk)) } catch (e) { yield put(actions.someFailAction(resource, e, data, thunk)) } } function* action1(api) { while(true) { const { payload, meta } = yield take(‘SOME_ACTION_1’, ) yield call(processAction(api, payload, meta)) } }
  • 21. Ошибки разработчиков ● Обертка в ( ) => { … } обработчиков события <Component onClick={ (e) => someHandler(e) } />
  • 22. Ошибки разработчиков ● Использование неправильных значений для свойства key={} компонента { list.each((item, index) => { <Component key={Math.random()} data={item}/> // или <Component key={index} data={item}/> })
  • 23. Ошибки разработчиков ● Рендер коллекции компонентов и хардкод передаваемых данных в событии компонента. ○ Это неверное распределение обязанностей, возложенное на родительский компонент { list.each((item, index) => { <Component key={item.id} data={item} onClick={(e) => onItemSelect(item)}/> }) }