react - podsumowanie z placu boju

76
React Podsumowanie z placu boju

Upload: radoslaw-mejer

Post on 24-Jan-2017

129 views

Category:

Internet


1 download

TRANSCRIPT

Page 1: React - podsumowanie z placu boju

ReactPodsumowanie z placu boju

Page 2: React - podsumowanie z placu boju

TOC1.React - TL;DR2.Część właściwa3.Krótko o

narzędziach

Page 3: React - podsumowanie z placu boju

ReactTL;DR

Page 4: React - podsumowanie z placu boju

<MeetJS when="03.10.2016"/>

Page 5: React - podsumowanie z placu boju

<div> <h1>Meet.js</h1> <time>03.10.2016</time></div>

Page 6: React - podsumowanie z placu boju

const MeetJS = props => ( <div> <h1>Meet.js</h1> <time>{props.when}</time> </div>);

Page 7: React - podsumowanie z placu boju

class MeetJS extends React.Component { render() { return ( <div> <h1>Meet.js</h1> <time>{this.props.when}</time> </div> ); }}

Page 8: React - podsumowanie z placu boju

const MeetJS = props => ( <div> <h1>Meet.js</h1> <time>{props.when}</time> <button onClick={() => this.setState({ started: true, })}> Lets start! </button> {this.state.started && <BeerBooth/>} </div>);

Page 9: React - podsumowanie z placu boju

const MeetJS = props => ( <div> <h1>Meet.js</h1> <AtendeesList attendees={props.attendees}/> </div>);

Page 10: React - podsumowanie z placu boju

Pytania?

Page 11: React - podsumowanie z placu boju

Krótko o mnieW trzech memach

Page 12: React - podsumowanie z placu boju
Page 13: React - podsumowanie z placu boju
Page 14: React - podsumowanie z placu boju
Page 15: React - podsumowanie z placu boju

ReactPodsumowanie z placu boju

Page 16: React - podsumowanie z placu boju

Komponenty są jak klasy

Page 17: React - podsumowanie z placu boju

Properties === methods

Page 18: React - podsumowanie z placu boju

<MeetJS when="03.10.2016"/>

Page 19: React - podsumowanie z placu boju

new MeetJS() .setWhen('03.10.2016') .render();

Page 20: React - podsumowanie z placu boju

Properties === API

Page 21: React - podsumowanie z placu boju

<MeetJS ticketPrice={daysLeft => 0}/>

Page 22: React - podsumowanie z placu boju

<div> <h1>Meet.js</h1> <BeerBooth onEmpty={() => this.panic() }/></div>

Page 23: React - podsumowanie z placu boju

SRP głupcze!

Page 24: React - podsumowanie z placu boju

Blob componentPo czym poznać?

Page 25: React - podsumowanie z placu boju

Ilość kodu!

Page 26: React - podsumowanie z placu boju

Za dużo właściwości

Page 27: React - podsumowanie z placu boju

static propTypes = { id: PropTypes.string, label: PropTypes.string, changeHandler: PropTypes.func, checked: PropTypes.bool, wrapper: PropTypes.string, labelClass: PropTypes.string, type: PropTypes.string, setValue: PropTypes.func, getValue: PropTypes.func, resetValue: PropTypes.func, touched: PropTypes.bool, error: PropTypes.string, name: PropTypes.string, showError: PropTypes.func, onChange: PropTypes.func, preventHover: PropTypes.bool, onMouseOut: PropTypes.func,};

Page 28: React - podsumowanie z placu boju

Za dużo stanów

Page 29: React - podsumowanie z placu boju

this.state = { show: false, enableEdit: false, enableRemoveDropdown: false, enableDueDateDropdown: false, itemTitle: props.item.title, canCreate: true, canBeHidden: true, temporaryDueDate: undefined, temporaryAssigneeId: undefined, discardModalOpened: false, locked: false, wasUnchecked: false,};

Page 30: React - podsumowanie z placu boju

… za dużo className

Page 31: React - podsumowanie z placu boju

const todoListClass: string = cx({ 'todo-list-item__inline': true, 'todo-list-item__inline--hover': this.state.show, 'todo-list-item__inline--active': this.state.enableEdit, 'todo-list-item__inline--loading': this.state.locked || item.notSaved, 'todo-list-item__inline--hidden': this.props.item.hidden, 'todo-list-item__inline--edit': this.isDrawerOpened(), 'todo-list-item__inline--updated': item.state.updated, 'todo-list-item__inline--updated-comment': item.state.firstUnreadCommentId,});

const dragClass: string = cx({ 'todo-list-item__drag': true, 'todo-list-item__drag--hover': this.state.show && !this.state.enableEdit,});

const editControlsClass: string = cx({ 'todo-list-item__edit__controls': true, 'todo-list-item__edit__controls--active': this.state.show,});

const editClass: string = cx({ 'todo-list-item__edit': true, 'todo-list-item__edit--hover': this.state.show, 'todo-list-item__edit--active': this.state.enableEdit,});

const editTodoButtonClass: string = cx({ 'todo-list-item__edit__toggle': true, 'todo-list-item__edit__toggle--hide': this.state.enableEdit,});

const saveTodoButtonClass: string = cx({ 'todo-list-item__add': true, 'todo-list-item__add--active': this.state.enableEdit, 'todo-list-item__add--disabled': !this.state.canCreate,});

const discardButtonClass: string = cx({ 'todo-list-item__discard': true, 'todo-list-item__discard--show': this.state.enableEdit,});

const todoItemInfoClass: string = cx({ 'todo-list-item__info': true, 'todo-list-item__info--hide': this.state.enableEdit,});

const editTodoInputClass: string = cx({ 'todo-list-item__edit__input': true, 'todo-list-item__edit__input--active': this.state.enableEdit,});

const todoItemEditDescriptionClass: string = cx({ 'todo-list-item__edit__description': true, 'todo-list-item__edit__description--show': this.state.enableEdit,});

const removeTodoClass: string = cx({ 'todo-list-item__remove': true, 'todo-list-item__remove--edit': this.state.enableEdit,});

const toggleDropdownClass: string = cx({ 'todo-list-item__remove__dropdown': true, 'todo-list-item__remove__dropdown--show': this.state.enableRemoveDropdown,});

Page 32: React - podsumowanie z placu boju

Jedyne rozwiązanie

Page 33: React - podsumowanie z placu boju
Page 34: React - podsumowanie z placu boju

Komunikacja między komponentami

Page 35: React - podsumowanie z placu boju

Top to bottomParent > child

Page 36: React - podsumowanie z placu boju

const MeetJS = props => ( <div> <BeerBooth opened={props.when > new Date()} /> <Attendees list={props.attendess} /> </div>);

Page 37: React - podsumowanie z placu boju

FTW!

Page 38: React - podsumowanie z placu boju

Context

Page 39: React - podsumowanie z placu boju

class BeerBooth extends React.Component { static contextTypes = { opened: React.PropTypes.bool, };

render() { return ( <div> <h1>Beer!</h1> <h2>{this.context.opened ? 'Opened!' : 'Closed'}</h2> </div> ); }}

Page 40: React - podsumowanie z placu boju

class MeetJS extends React.Component { static childContextTypes = { opened: React.PropTypes.bool, };

getChildContext() { return { opened: this.props.when > new Date(), }; }

render() { return ( <div>{/* ... */}</div> ); }}

Page 41: React - podsumowanie z placu boju

Referencje

Page 42: React - podsumowanie z placu boju

class MeetJS extends React.Component { componentDidMount() { if (this.props.when > new Date()) { this.beer.open(); // this.beer.setState({opened: true}); } }

render() { return ( <div> <BeerBooth ref={el => { this.beer = el; }}/> </div> ); }}

Page 43: React - podsumowanie z placu boju

Bottom to topChild > parent

Page 44: React - podsumowanie z placu boju

Właściwości jako eventy

Page 45: React - podsumowanie z placu boju

const MeetJS = props => ( <div> <h1>Meet.js</h1> <BeerBooth onEmpty={() => this.setState({ closed: true, })}/> </div>);

Page 46: React - podsumowanie z placu boju

Referencje

Page 47: React - podsumowanie z placu boju

const MeetJS = props => ( <div> <h1>Meet.js</h1> <BeerBooth partyHost={this}/> </div>);

Page 48: React - podsumowanie z placu boju

STAHP

Page 49: React - podsumowanie z placu boju

Context

Page 50: React - podsumowanie z placu boju

class MeetJS extends React.Component { static childContextTypes = { endParty: React.PropTypes.func, };

getChildContext() { return { endParty: () => this.setState({ closed: true, }), }; }

render() { return ( <div>{/* ... */}</div> ); }}

Page 51: React - podsumowanie z placu boju

Komunikacja dwustronnaTaki pomysł

Page 52: React - podsumowanie z placu boju

Context + event emitter

Page 53: React - podsumowanie z placu boju

FLUX głupcze!

Page 54: React - podsumowanie z placu boju

Unidirectional data flow

Page 55: React - podsumowanie z placu boju

High Order Components

Page 56: React - podsumowanie z placu boju

… komplikują korzystanie z referencji

Page 57: React - podsumowanie z placu boju

… uniemożliwiają korzystanie z shallow

render

Page 58: React - podsumowanie z placu boju

Trochę o testowaniu

Page 59: React - podsumowanie z placu boju

Shallow renderof <MeetJS/>

Page 60: React - podsumowanie z placu boju

<div> <h1>Meet.js</h1> <BeerBooth/></div>

Page 61: React - podsumowanie z placu boju

Full renderof <MeetJS/>

Page 62: React - podsumowanie z placu boju

<div> <h1>Meet.js</h1> <div class="beer-booth"> <div id="theGuy">•|龴 龴◡ |•</div> <ul class="beer-booth--kegs-list"> <li>Beer keg #1</li> <li>Beer keg #2</li> <li>Beer keg #3</li> </ul> </div></div>

Page 63: React - podsumowanie z placu boju

Testy jednostkowe to nie testy integracyjne

Shallow render != full render

Page 64: React - podsumowanie z placu boju

Unit test powinien korzystać z shallow

render

Page 65: React - podsumowanie z placu boju

Full render zostawmy dla testów e2e

Page 66: React - podsumowanie z placu boju

Unit testy powinny być szybkie

Szanuj swój czas :)

Page 67: React - podsumowanie z placu boju

Rozdziel testyUnit test / e2e

Page 68: React - podsumowanie z placu boju

Natywne narzędzia mogą nie wystarczać

Page 69: React - podsumowanie z placu boju

Szybko o narzędziach

Page 70: React - podsumowanie z placu boju

Hot Module ReloadFTW

Page 71: React - podsumowanie z placu boju

Eslint… skąd u niego taka spina?

Page 72: React - podsumowanie z placu boju

Mocha > Karma

Page 73: React - podsumowanie z placu boju

Pytania?

Page 74: React - podsumowanie z placu boju

fb:twt:gh:

radoslaw.mejer_radmenradmen

Page 76: React - podsumowanie z placu boju

Dzięki!