Igor Suvorov
Программист-предприниматель
Занятие 4
4 Mar 2017
Профессия
Node.js & React.js developer
продвинутый курс
Умные vs Глупые
Smart vs Dump
Stateful vs Stateless
Контейнеры vs Компоненты
Логические vs Презентационные
JS vs CSS
Component communication
1. Props
class TheChild extends React.Component {
}
class TheParent extends React.Component {
render() {
return (
<TheChild someProp="a" />
);
}
}
2. Ref Functions
class TheChild extends React.Component {
myFunc() {
return 'hello';
}
}
class TheParent extends React.Component {
render() {
return (
<TheChild ref='foo' />
);
}
componentDidMount() {
var x = this.refs.foo.myFunc();
// x is now 'hello'
}
}
3. Callback Functions
class TheChild extends React.Component {
onClick() {
this.props.handle(this.state);
}
...
}
class TheParent extends React.Component {
render() {
return (
<TheChild handle={this.handle} />
);
}
}
4. Event Bubbling
class ParentComponent extends React.Component {
render() {
return (
<div onKeyUp={this.handleKeyUp.bind(this)}>
// Any number of child components can be added here.
</div>
);
}
handleKeyUp(event) {
// This function will be called for the 'onkeyup' event in any <input/>
// fields rendered by any of my child components.
}
}
5. Parent compoent - Sibling
class ParentComponent extends React.Component {
render() {
return (
<div>
<SiblingA
myProp={this.state.propA}
myFunc={this.siblingAFunc.bind(this)}
/>
<SiblingB
myProp={this.state.propB}
myFunc={this.siblingBFunc.bind(this)}
/>
</div>
);
}
// Define 'siblingAFunc' and 'siblingBFunc' here
}
6. Observer
PubSubJS
EventEmitter
MicroEvent.js
const event = new Event();
event.on('click', (state) => {
this.setState(state)
})
event.emit('click', {visible: true})
7. Global Variables
window
global
8. Context
class Button extends React.Component {
render() {
return (
<button style={{background: this.context.color}}>
{this.props.children}
</button>
);
}
}
Button.contextTypes = {
color: React.PropTypes.string
};
8. Context
class Message extends React.Component {
render() {
return (
<div>
{this.props.text} <Button>Delete</Button>
</div>
);
}
}
8. Context
class MessageList extends React.Component {
getChildContext() {
return {color: "purple"};
}
render() {
const children = this.props.messages.map((message) =>
<Message text={message.text} />
);
return <div>{children}</div>;
}
}
MessageList.childContextTypes = {
color: React.PropTypes.string
};
Providers
<Provider store={store}>
<MyRootComponent />
</Provider>
<Provider store={store}>
<Router history={history}>
<Route path="/" component={App}>
<Route path="foo" component={Foo}/>
<Route path="bar" component={Bar}/>
</Route>
</Router>
</Provider>,
Providers
@connect((store) => { e: store.a.b.c.d.name})
class Button extends Component {
render() {
return <div> Go to {this.props.name} </div>
}
}
@inject('name')
class Button extends Component {
render() {
return <div> Go to {this.props.name} </div>
}
}
lsk-general/General/Component
import React, { PropTypes } from 'react';
export default class Component extends React.Component {
static contextTypes = {
history: PropTypes.object,
};
redirect(...args) {
this.context.history && this.context.history.push(...args);
}
...
}
react-bootstrap & React Context
& React Developer Tools
any questions?
программист-предприниматель
By Igor Suvorov
* template