SlideShare une entreprise Scribd logo
1  sur  37
Télécharger pour lire hors ligne
Контекст в React
Николай Надоричев
Frontend-разработчик
Сбербанк Технологии
31
• Проблемы коммуникации компонентов
• Строим своё дерево компонентов
• Пишим свой flux
Коммуникация компонентов
• От родителя в ребенку
Parent
Child
Props
Коммуникация компонентов
• От ребенка к родителю
Parent
Child
Callbacks
Child
Child
Child
Коммуникация компонентов
• От родителя к детям в глубине DOM-
дерева
Parent
Child
???
RadioButtonGroup
RadioButtonGroup
<RadioGroup onChange={(value) => alert(value)}>

<RadioButton value="1">Опция 1</
RadioButton>

<RadioButton value="2">Опция 2</
RadioButton>

<RadioButton value="3">Опция 3</
RadioButton>

</RadioGroup>
RadioButtonGroup
class RadioButtonGroup extends React.Component {

. . .

childClick() { … }



render() {

return <div>

{this.props.children.map((Radio, index) => {

return React.cloneElement(Radio, {

onChange: () => this.childClick(value), 

selected: this.state.value === Radio.props.value,

key: index})

})}

</div>;

}

}
RadioButtonGroup
class RadioButtonGroup extends React.Component {

. . .

childClick() { … }



render() {

return <div>

{this.props.children.map((Radio, index) => {

return React.cloneElement(Radio, {

onChange: () => this.childClick(value), 

selected: this.state.value ===
Radio.props.value,

key: index})

})}

</div>;

}

RadioButtonGroup
class RadioButtonGroup extends React.Component {

. . .

childClick() { … }



render() {

return <div>

{this.props.children.map((Radio, index) => {

return React.cloneElement(Radio, {

onChange: () => this.childClick(value), 

selected: this.state.value === Radio.props.value,

key: index})

})}

</div>;

}

}
RadioButtonGroup
<RadioGroup onChange={(value) => alert(value)}>

<h1>Выберите опцию</h1>

<div><RadioButton value="1">Опция 1</
RadioButton></div>

<div><RadioButton value="2">Опция 2</
RadioButton></div>

<div><RadioButton value="3">Опция 3</
RadioButton></div>

</RadioGroup>
Child
Child
Child
Коммуникация компонентов
• От родителя к детям в глубине DOM-
дерева
Parent
Child
Contex
t
Context
• Передает через специальный аргумент
параметры всем дочерним элементам
• Пробрасывается, если дочерний
элемент запросил параметр явно
RadioButtonGroup
class RadioButtonGroup extends React.Component {

getChildContext() {

return {

onRadioChange: () => this.childClick(value),

radioValue: this.state.value

}

}

}
RadioButtonGroup.childContextTypes = {

onRadioChange: React.PropTypes.func,

radioValue: React.PropTypes.string

}
RadioButtonGroup
class RadioButtonGroup extends React.Component {

getChildContext() {

return {

onRadioChange: () => this.childClick(value),

radioValue: this.state.value

}

}

}
RadioButtonGroup.childContextTypes = {

onRadioChange: React.PropTypes.func,

radioValue: React.PropTypes.string

}
RadioButton
class RadioButton extends React.Component {

render() {

return <div

className={this.context.selected ? 'radio-active' : 'radio-
inactive'}

onClick={() => this.context.onRadioChange(this.props.value)}>

{this.props.children}

</div>;

}

}



RadioButton.contextTypes = {

onRadioChange: React.PropTypes.func,

radioValue: React.PropTypes.string

};
RadioButton
class RadioButton extends React.Component {

render() {

return <div

className={this.context.selected ? 'radio-active' : 'radio-
inactive'}

onClick={() => this.context.onRadioChange(this.props.value)}>

{this.props.children}

</div>;

}

}



RadioButton.contextTypes = {

onRadioChange: React.PropTypes.func,

radioValue: React.PropTypes.string

};
RadioButton
class RadioButton extends React.Component {

render() {

return <div

className={this.context.selected ? 'radio-active' : 'radio-
inactive'}

onClick={() => this.context.onRadioChange(this.props.value)}>

{this.props.children}

</div>;

}

}



RadioButton.contextTypes = {

onRadioChange: React.PropTypes.func,

radioValue: React.PropTypes.string

};
RadioButton
class RadioButton extends React.Component {

render() {

return <div

className={this.context.selected ? 'radio-active' : 'radio-
inactive'}

onClick={() => this.context.onRadioChange(this.props.value)}>

{this.props.children}

</div>;

}

}



RadioButton.contextTypes = {

onRadioChange: React.PropTypes.func,

radioValue: React.PropTypes.string

};
Component.contextTypes = {

property: React.PropTypes.any

};



Component.childContextTypes = {

property: React.PropTypes.any

};
Дерево оберток
class Leaf extends React.Component {

childLeaves = [];



getChildContext() {

return {

mountLeaf: (instance) => this.childLeaves.push(instance)

}

};



componentDidMount() {

this.context.mountLeaf(this);

}

}



Leaf.contextTypes = {

mountLeaf: React.PropTypes.func

};



Leaf.childContextTypes = {

mountLeaf: React.PropTypes.func

};
Дерево оберток
Wrapper
Wrapper
Wrapper Wrapper
Wrapper
Wrapper
Дерево оберток
Дерево оберток
Давайте напишем свой flux
WAT?!
Flux через context
FluxContainer
constructor() {

super(...arguments);



this.state = {

store: this.props.initialStore

}

}
FluxContainer
dispatchAction(action, params) {

let store = this.state.store;

this.props.actions[action](store, params);

this.setState({store});

}
FluxWrapper
return React.cloneElement(

React.Children.only(this.props.children),

{

dispatch: (action, params) =>
this.context.dispatchAction(action, params),

store

}

);
App
Flux через context
FluxContainte
r
FluxWrapper
Component
initialStore
actions
dispatch
store
dispatch
store
Flux через context
http://bit.ly/MJS31-flux
Context в СберТехе
• AppContainer
• SpringWebFlowRouter
• Focusable
Спасибо! Вопросы?
Надоричев Николай
Сбербанк Технологии
@luanre
@luanre
email: luanre@gmail.com
http://bit.ly/MJS31-flux
Demo flux:
RadioButtonGroup
class RadioButtonGroup extends React.Component {

. . .

childClick() { … }



render() {

return <div>

{this.props.children.map((Radio, index) => {

return React.cloneElement(Radio, {

onChange: () => this.childClick(value), 

selected: this.state.value === Radio.props.value,

key: index})

})}

</div>;

}

}
RadioButtonGroup
class RadioButtonGroup extends React.Component {

getChildContext() {

return {

onRadioChange: () => this.childClick(value),

radioValue: this.state.value

}

}

}
RadioButtonGroup.childContextTypes = {

onRadioChange: React.PropTypes.func,

radioValue: React.PropTypes.string

}
RadioButton
class RadioButton extends React.Component {

render() {

return <div

className={this.context.selected ? 'radio-active' : 'radio-
inactive'}

onClick={() => this.context.onRadioChange(this.props.value)}>

{this.props.children}

</div>;

}

}



RadioButton.contextTypes = {

onRadioChange: React.PropTypes.func,

radioValue: React.PropTypes.string

};

Contenu connexe

Plus de MoscowJS

Верстка Canvas, Алексей Охрименко, MoscowJS 31
Верстка Canvas, Алексей Охрименко, MoscowJS 31Верстка Canvas, Алексей Охрименко, MoscowJS 31
Верстка Canvas, Алексей Охрименко, MoscowJS 31MoscowJS
 
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31MoscowJS
 
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31MoscowJS
 
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33MoscowJS
 
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33MoscowJS
 
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33MoscowJS
 
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...MoscowJS
 
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter..."Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...MoscowJS
 
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29MoscowJS
 
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29MoscowJS
 
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29MoscowJS
 
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28MoscowJS
 
"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27MoscowJS
 
"Web Audio Api", Анатолий Найда, MoscowJS 27
"Web Audio Api", Анатолий Найда, MoscowJS 27"Web Audio Api", Анатолий Найда, MoscowJS 27
"Web Audio Api", Анатолий Найда, MoscowJS 27MoscowJS
 
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25MoscowJS
 
"Изоморфный D3 + MALEVICH", Алексей Охрименко, MoscowJS 25
"Изоморфный D3 + MALEVICH", Алексей Охрименко, MoscowJS 25"Изоморфный D3 + MALEVICH", Алексей Охрименко, MoscowJS 25
"Изоморфный D3 + MALEVICH", Алексей Охрименко, MoscowJS 25MoscowJS
 
"HTML5 Cache Manifest на практике", Дмитрий Головин, MoscowJS 25
"HTML5 Cache Manifest на практике", Дмитрий Головин, MoscowJS 25"HTML5 Cache Manifest на практике", Дмитрий Головин, MoscowJS 25
"HTML5 Cache Manifest на практике", Дмитрий Головин, MoscowJS 25MoscowJS
 
"Подход к написанию безопасного клиентского кода на примере React", Иван Елки...
"Подход к написанию безопасного клиентского кода на примере React", Иван Елки..."Подход к написанию безопасного клиентского кода на примере React", Иван Елки...
"Подход к написанию безопасного клиентского кода на примере React", Иван Елки...MoscowJS
 
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24MoscowJS
 
"Где еще живет скорость в web", Олег Елифантьев, MoscowJS 24
"Где еще живет скорость в web", Олег Елифантьев, MoscowJS 24"Где еще живет скорость в web", Олег Елифантьев, MoscowJS 24
"Где еще живет скорость в web", Олег Елифантьев, MoscowJS 24MoscowJS
 

Plus de MoscowJS (20)

Верстка Canvas, Алексей Охрименко, MoscowJS 31
Верстка Canvas, Алексей Охрименко, MoscowJS 31Верстка Canvas, Алексей Охрименко, MoscowJS 31
Верстка Canvas, Алексей Охрименко, MoscowJS 31
 
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
 
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
 
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
 
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
 
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
 
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
 
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter..."Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
 
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
 
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
 
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
 
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
 
"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27
 
"Web Audio Api", Анатолий Найда, MoscowJS 27
"Web Audio Api", Анатолий Найда, MoscowJS 27"Web Audio Api", Анатолий Найда, MoscowJS 27
"Web Audio Api", Анатолий Найда, MoscowJS 27
 
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
 
"Изоморфный D3 + MALEVICH", Алексей Охрименко, MoscowJS 25
"Изоморфный D3 + MALEVICH", Алексей Охрименко, MoscowJS 25"Изоморфный D3 + MALEVICH", Алексей Охрименко, MoscowJS 25
"Изоморфный D3 + MALEVICH", Алексей Охрименко, MoscowJS 25
 
"HTML5 Cache Manifest на практике", Дмитрий Головин, MoscowJS 25
"HTML5 Cache Manifest на практике", Дмитрий Головин, MoscowJS 25"HTML5 Cache Manifest на практике", Дмитрий Головин, MoscowJS 25
"HTML5 Cache Manifest на практике", Дмитрий Головин, MoscowJS 25
 
"Подход к написанию безопасного клиентского кода на примере React", Иван Елки...
"Подход к написанию безопасного клиентского кода на примере React", Иван Елки..."Подход к написанию безопасного клиентского кода на примере React", Иван Елки...
"Подход к написанию безопасного клиентского кода на примере React", Иван Елки...
 
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
 
"Где еще живет скорость в web", Олег Елифантьев, MoscowJS 24
"Где еще живет скорость в web", Олег Елифантьев, MoscowJS 24"Где еще живет скорость в web", Олег Елифантьев, MoscowJS 24
"Где еще живет скорость в web", Олег Елифантьев, MoscowJS 24
 

Контекст в React, Николай Надоричев, MoscowJS 31