mitreact - nils hartmann...graphql& relay! ausblick mittagspause (wohlverdient!) react router...

56
NILS HARTMANN | W-JAX 2015 UI-KOMPONENTEN ENTWICKELN REACT MIT

Upload: others

Post on 23-May-2020

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

NILS HARTMANN | W-JAX 2015

UI-KOMPONENTEN ENTWICKELN  

REACT MIT  

Page 2: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

[email protected] GitHub

Twitter

E-Mail

Page 3: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES

React

Page 4: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

SINGLE PAGE APPLICATIONS

React

Page 5: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

OPEN SOURCE VON FACEBOOK HTTPS://FACEBOOK.GITHUB.IO/REACT/

React

Page 6: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

0.3

0.14.1rcbetaalpha

05 | 2013 Open Source

10 | 2015 Aktuelles Release

„Major“-Releases

Page 7: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

BUILT WITH REACT!

Page 8: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

V in MVC

Page 9: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

W-JAX DEMO ANWENDUNG!

Code: https://github.com/nilshartmann/react-example-app

Demo: https://nilshartmann.github.io/react-example-app/

Page 10: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

Wiederverwendbar Hierarchisch Logik und UI

KOMPONENTEN

<PasswordView>! <PasswordForm>! <input>! <CheckLabelList>! <CheckLabel />! <CheckLabel />! </CheckLabelList>! <Label />! <Button />! </PasswordForm>!</PasswordView>!

Page 11: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

Aus Komponenten aggregiert

ANWENDUNGEN

<Application>! <Navigation />! <ViewContainer>! <PasswordView>! . . .! </PasswordView>! </ViewContainer>!</Application>!

Page 12: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

REACT

Hintergrund

Page 13: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

DOM OPERATIONEN

Manuelle DOM-Manipulationen

Umständliche API Fehleranfällig

Performance-kritisch

DOM

DIFF DIFF DIFF

MODEL

Page 14: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

DATA BINDING

Verbinden von Model und View Wann wird was gebunden?

Wie funktioniert das Binding? Reihenfolge von Events?

Page 15: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

EinfachheitREACT

respond to events & render UI

Page 16: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

Einfachheitrespond to events & and render UI

Event Zustand RendernMausklickTexteingabeTimerServerantwort. . .

Page 17: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

Einfachheitrespond to events & and render UI

Event Zustand RendernMausklickTexteingabeTimerServerantwort. . .

Immer ganze Komponente rendern

Kein 2-Way-Databinding Kein dirty checking

Page 18: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

RENDER UI

Event

Re-render

Page 19: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

Einfachheitrespond to events & and render UI

Event Zustand RendernMausklickTexteingabeTimerServerantwort. . .

Immer ganze Komponente rendern ?

Performance?

Page 20: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

VIRTUELLER DOM

VIRTUAL DOM

MODEL

DOM

UPDATE UPDATE UPDATE

React

Page 21: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

UI AS A FUNCTION

∫ (model) à UI Model mit allen Zuständen (Textfelder, Auswahllisten etc)

Immer ein Zeitpunkt Keine Dynamik

render()! render(R3)! render(R3!tdemo)! render(R3)!

Page 22: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

React

PRAXIS

Page 23: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

React

SCHRITT FÜR SCHRITT

Page 24: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

EINE REACT KOMPONENTE 1!

HTML

<div ! class="CheckLabel-unchecked">! At least 8 characters long.!</div>!

Page 25: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

EINE REACT-KOMPONENTE 2!

Komponente CheckLabel Komponentenfunktion

(seit 0.14)

function CheckLabel() {! return <div ! className="CheckLabel-unchecked">! At least 8 characters long.! </div>;!}!

CheckLabel.js

JSX: Statt Template-Sprache

Page 26: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

EINE REACT-KOMPONENTE 3!

Übersetzter JavaScript Code

React.createElement(! "div",! { className: "CheckLabel-unchecked" },! "At least 8 characters long."!);!

Erzeugt „virtuelles“ DOM-Element

Page 27: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

KOMPONENTE RENDERN!

import React from 'react';!import ReactDOM from 'react-dom';!!import CheckLabel from './CheckLabel';!!!ReactDOM.render(<CheckLabel />, ! document.getElementById('mount'));!

<html>! <body>! <div id=“mount“></div>! </body>! <script src=“dist/dist.js“></script>!</html>!

app.js

index.html Webpack

Page 28: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

PROPERTIES!

function CheckLabel({checked, label}) {! return <div ! className=! {checked?'CheckLabel-checked':'CheckLabel-unchecked'}>! {label}! </div>;!}!

Properties (destrukturiert)

{ ! checked: false, ! label: ‘At least 8 characters long.’ !}!

Page 29: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

PROPERTIES BESCHREIBEN!

function CheckLabel({checked, label}) {! // . . .!}!!CheckLabel.propTypes = {! label: React.PropTypes.string.isRequired,! checked: React.PropTypes.bool!};!!

Beschreibung der Properties

Überprüfung zur Laufzeit

Page 30: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

KOMPONENTEN VERWENDEN!

function CheckLabelList() {! return <div> ! <CheckLabel checked={false} ! label='At least 8 characters long' />! <CheckLabel checked={true} ! label='Contains uppercase letters.' />! </div>;!}!!function CheckLabel({checked, label}) {! // . . .!}!!

CheckLabelList CheckLabel

Page 31: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

LISTEN!

function CheckLabelList({checks}) {! return <div>! {checks.map((c) => <CheckLabel label={c.label}! checked={c.checked}! key={c.label} />! )}! </div>;!}!

ES5 Array.prototype.map()

[! { checked: false, label: ‘At least 8 characters long.’ },! { checked: true, label: ‘Contains uppercase letters’ }!];!

Eindeutiger Schlüssel

Page 32: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

ZUSTANDSBEHAFTETE KOMPONENTEN!

PasswordForm

CheckLabelList

Interner Zustand!

CheckLabel

input

Page 33: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

ZUSTAND!

Event Zustand RendernTextfeldAuswahl in ListeCheckboxServerantwort. . .

KEY VALUE

password REACT!

state

Event Handler Rendernmodifiziert löst aus

Page 34: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

KOMPONENTEN KLASSEN!

class PasswordForm extends React.Component {! constructor(props) {! super(props);! }!! componentDidMount() { . . . }! componentWillReceiveProps() { . . . }! shouldComponentUpdate() { . . . }! . . .! ! render() {! return <div>{this.props.label}</div>;! }!}!!PasswordForm.propTypes = {! . . .!};!!

ECMAScript 2015 Klasse

Properties über Konstruktor

React Lifecycle Methoden

Render Methode

Properties über props-Objekt

Property-Beschreibungen

Page 35: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

ZUSTAND UND RENDERING!

class PasswordForm extends React.Component {! checkPassword(password) { return [ . . . ]; } !! onPasswordChange(input) {! this.setState({password: input});! }! ! render() {! const checks = this.checkPassword(this.state.password);! ! return . . .! <input value={this.state.password}! onChange={e=>this.onPasswordChange(e.target.value)} ! />! <CheckLabelList checks={checks} />! <Button enabled={passwordValid} />! }!}!

1. Event tritt ein

2. Zustand neu setzen

input Zustand!

3. löst rendern der gesamten Komponente aus

Page 36: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

DOM UPDATES - BIG PICTURE

Anwendung

React

Event

Event Handler

Event Handler setState

render

UpdateDOM

z.B. Zeichen eingegeben Minimale Änderung

Fachlicher Handler

Globaler React

Handler

Page 37: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

KOMMUNIKATION: PROPERTIES!

PasswordForm

CheckLabelList

CheckLabel

input

div

PasswordApp

Button

h1

check!

enabled!

value!

text!

checks!

render!

Von oben nach unten: props!

Page 38: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

KOMMUNIKATION: EVENTS 1!

PasswordForm

CheckLabelList

CheckLabel

input

div

PasswordApp

Button

h1

event!R   Zeicheneingabe

Von unten nach oben: events!

Page 39: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

KOMMUNIKATION: EVENTS 2!

PasswordForm

CheckLabelList

CheckLabel

input

div

PasswordApp

Button

h1

Von unten nach oben: events und callbacks!

event!

callback!

Page 40: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

KOMMUNIKATION: CALLBACK!class PasswordApp extends React.Component {! onSetPassword(password) { . . . }! ! render() {! return . . .! <PasswordForm . . .! onSetPasswordHandler={p=>this.onSetPassword(p)}! />;! }!}!! !class PasswordForm extends React.Component {! render() {! return . . .! <input value=“. . .” onChange=“. . .” />! <Button label=“Set new Password”! onClickHandler=! {()=>this.props.onSetPasswordHandler(this.state.password)}! />! }!}!!PasswordForm.propTypes = {! onSetPasswordHandler: React.PropTypes.func.isRequired!}!

1. Callback übergeben

2. Callback aufrufen

event!

3. Event verarbeiten (ggf. Zustand setzen)

Page 41: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

UNIT-TESTS (OHNE DOM)!

import TestUtils from 'react-addons-test-utils';!!describe('CheckLabel', () => {! it('should render a "checked" label', () => {!! const renderer = TestUtils.createRenderer();! renderer.render(! <CheckLabel label='My Label' checked={true}/>! );!! const tree = renderer.getRenderOutput();! expect(tree.type).to.equal('div');! expect(tree.props.className).to.equal('CheckLabel-checked');! expect(tree.props.children).to.equal('My Label');! });!});!

„Shallow rendering“

Page 42: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

EINE „ANWENDUNG“ (BEISPIEL)!!class App extends React.Component {! handleItemSelected(item) { ! this.setState({component: item.component}); ! }!! render() {! return <div className='App'>! <NavigationBar! onItemSelected={item=>this.handleItemSelected(item)}! items={[! { label: 'Change password', component: <PasswordApp />},! { label: 'Show weather', component: <WeatherApp /> }! ]}! />! ! <MainView>! {this.state.component}! </MainView>! </div>;! }!}!

Ausgewählte Komponente einfügen

Navigation (Komponentenauswahl)

Page 43: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

Ökosystem

bootstrap  

router  

material-­‐design  

fer4ge  Komponenten  

dev  tools  

flux  

na4ve  

graphql  &  relay  

AUSBLICK

Page 44: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

Mittagspause (wohlverdient!)

React Router Serverzugriffe

Integration von Dritt-Bibliotheken Build-Prozess

Zugabe

Page 45: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

ZUGRIFF AUF NATIVEN DOM 1!

Beispiel: focus() auf input-Feld aufrufen

focus()

Page 46: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

ZUGRIFF AUF NATIVEN DOM 2!

class PasswordForm extends React.Component {! ! componentDidMount() {! this.refs.passwordField.focus();! }!! render() {! const password = this.state.password;! ! return <div>! <input ref=‘passwordField’ value={password} />! . . .! </div>;! }!}!

Referenz anlegen

React-Callback: Komponente wurde in den nativen DOM gehängt

Natives DOM-Element

Virtuelles DOM-Element

this.refs enthält native DOM-Elemente, die mit ref ausgezeichnet wurden

Page 47: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

SERVERZUGRIFF!

Interner Zustand!

Löst Serverzugriff aus

WeatherPanel

WeatherView

Page 48: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

SERVERZUGRIFF 1!

import WeatherPanel from ‘./WeatherPanel’;!!class WeatherView extends React.Component {! constructor() {! super();!}! ! fetchWeather() {! const { city } = this.state;! const fetchUrl = `http://api.w.org/${city}`;! fetch(fetchUrl)! .then( response => response.json())! .then( weather => this.setState({weather}))! ;! }!! render() {! const { city, weather } = this.state;! <input type=‘text’ value={city} onChange={. . .} />! <Button label=‘Load’ onClick={() => this.fetchWeather()}! <WeatherPanel weather={weather} />! }!}!

Geladene Daten anzeigen

Daten vom Server laden

Zustand neu setzen (triggert Rendering)

fetch-Bibliothek: https://fetch.spec.whatwg.org/

Page 49: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

SERVERZUGRIFF 2!

class WeatherView extends React.Component {! constructor() {! super();! this.state = { city: ‘Hamburg’ };! }!! componentDidMount() {! this.fetchWeather();! }!! fetchWeather() { . . . }! ! render() { . . . }!}!

Wetterdaten laden, sobald Komponente in DOM gehängt wurde

State initialisieren

Page 50: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

INTEGRATION THIRD-PARTY-LIBS!Beispiel: D3.js

ChartView

ButtonBar

Interner Zustand!

D3.js SVG

Page 51: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

D3.JS!import d3 from ‘d3’;!!class ChartView extends React.Component {! constructor() { this.state = { . . .}; }!! increaseDrink(drink) { this.setState({ . . .}); }!! componentDidMount() { this.renderChart(); }! componentDidUpdate() { this.renderChart(); }! ! renderChart() { ! d3.select(this.refs.chart)! .data(this.state.drinks)! .enter().append(. . .);! }! render() {! return . . .! <div ref=‘chart’></div>! <ButtonBar>! { drinks.map(d => <Button ! label={ . . .}! onClickHandler={()=>this.increaseDrink(d)} />) ! }! </ButtonBar> ! }!}!!

Diagramm (neu) zeichnen, sobald Komponente in DOM gehängt bzw dort aktualisiert wurde

D3 Diagramm wird nicht in render() gezeichnet, weil hier kein natives DOM-Element

Natives DOM-Element

Page 52: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

Viele ECMAScript 2015 Features Compiler notwendig

ES2015

Alias: ES6

Page 53: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

BUILDPROZESS

Babel is a JavaScript compiler Babel

http://babeljs.io

ES2015„ES7“. . .

ES5Babel

Page 54: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

BUILDPROZESS

Webpack https://webpack.github.io

Module bundler - Erzeugt zentrales JavaScriptFile

dist.js

JS

JS

JSJS

JSCSS

PNG

app.jsPassword.jsLabel.js

Layout.js

Webpack

Babel

Source-Files

React.js

Page 55: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

BUILDPROZESS

webpack-dev-server

JSJS

JS

IDE/Editor

Webpack

Browser

process

serve

reload

edit

watch

webpack-dev-server

Page 56: MITREACT - Nils Hartmann...graphql& relay! AUSBLICK Mittagspause (wohlverdient!) React Router Serverzugriffe Integration von Dritt-Bibliotheken Build-Prozess Zugabe ZUGRIFF AUF NATIVEN

[email protected]

Fragen? Vielen Dank!