SlideShare ist ein Scribd-Unternehmen logo
1 von 62
Downloaden Sie, um offline zu lesen
Einführung in React.js und Redux
Warum React.js?
React.js
Eine JavaScript Library zum Erstellen von User Interfaces
Nur die UI
Virtual DOM
Data Flow
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 3
Data Flow
Unidirektional ohne Event-Chaos
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 4
http://www.wikihow.com/Image:Make-Spaghetti-Step-1.jpg
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 5
http://www.wikihow.com/Image:Make-Spaghetti-Step-1.jpg
https://www.flickr.com/photos/spilt-milk/5829575950
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 6
Entwicklungsgeschichte einer Pub-Sub-Software
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 7
Entwicklungsgeschichte einer Pub-Sub-Software
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 8
Entwicklungsgeschichte einer Pub-Sub-Software
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 9
React Data Flow
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 10
Virtual DOM
Effizientes UI-Rendering inklusive
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 11
Änderungen auf der UI - was tun?
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 12
Änderungen auf der UI - was tun?
Alles neuzeichnen? Flackert!
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 13
Änderungen auf der UI - was tun?
Alles neuzeichnen? Flackert!
DOM manipulieren? Mühsam!
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 14
Virtual DOM
Entwickler beschreibt das vollständige Resultat
React aktualisiert den DOM mit minimalen Änderungen
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 15
Nur die UI
Model ist kein Bestandteil von React
Kann beliebig implementiert werden
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 16
Einführung in React.js
Eine einfache Komponente
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in React.js – Folie 18
Der Code als Class Component
import React, { Component } from "react";
export default class HelloWorld extends Component {
render() {
return <p>Hello World!</p>;
}
}
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in React.js – Folie 19
Der Code als Class Component ohne JSX
import React, { Component } from "react";
export default class HelloWorld extends Component {
render() {
return React.createElement(’p’, null, ’Hello World!’);
}
}
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in React.js – Folie 20
Der Code als Stateless Functional Component
import React from "react";
const HelloWorld = () => <p>Hello World!</p>;
export default HelloWorld;
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in React.js – Folie 21
Und wo binden wir diese Komponente ein?
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>React & Redux</title>
</head>
<body>
<div id="start" />
</body>
</html>
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in React.js – Folie 22
Und wo binden wir diese Komponente ein?
index.js:
import React, {Component} from "react";
import ReactDOM from "react-dom";
import HelloWorld from "./HelloWorld";
ReactDOM.render(
<HelloWorld />
, document.getElementById("start")
);
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in React.js – Folie 23
Wie finden die beiden zueinander?
webpack.config.js:
module.exports = {
entry: [
"./src/index" // <---- index.js
],
plugins: [
new HtmlWebpackPlugin({
template: "./index.html" // <---- index.html
}),
]
};
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in React.js – Folie 24
React.js Testen mit Shallow Rendering
Shallow Rendering - Was ist das?
Seit React 0.13 (März 2015)
Erlaubt das Testen von Komponenten ohne DOM
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. React.js Testen mit Shallow Rendering – Folie 26
Shallow Rendering - Was ist das?
Seit React 0.13 (März 2015)
Erlaubt das Testen von Komponenten ohne DOM
Shallow rendering ist hilfreich, um
Tests auf eine Komponente zu beschränken
sicherzustellen, dass die Tests nicht vom Verhalten von
Kind-Komponenten abhängen
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. React.js Testen mit Shallow Rendering – Folie 27
Essentielle Testing Library
Enzyme
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. React.js Testen mit Shallow Rendering – Folie 28
Essentielle Testing Library
Enzyme
Shallow Rendering
Full DOM Rendering
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. React.js Testen mit Shallow Rendering – Folie 29
Ein Shallow Rendering Test
import React from "react";
import expect from "must";
import { shallow } from "enzyme";
import HelloWorldFunctional from "../src-solution-react/
HelloWorldFunctionalComponent";
describe(’HelloWorldComponent’, () => {
it(’checks the result’s type and contents’, () => {
const functional = shallow(<HelloWorldFunctional />);
expect(functional.text()).to.be("Hello World!");
expect(functional.type()).to.be("p");
expect(functional.name()).to.be("p");
expect(functional.html()).to.be("<p>Hello World!</p>");
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. React.js Testen mit Shallow Rendering – Folie 30
React Developer Tools
Demo
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. React Developer Tools – Folie 32
Erstellen einer Benutzerverwaltung
Anzeige eines Benutzers
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 34
Datenübergabe
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 35
Datenübergabe
<MyComponent aProperty={myData} anotherProperty={moreData} />
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 36
Datenübergabe
<MyComponent aProperty={myData} anotherProperty={moreData} />
class MyComponent extends Component {
/* ... */ this.props.aProperty /* ... */
/* ... */ this.props.anotherProperty /* ... */
}
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 37
Datenübergabe
<MyComponent aProperty={myData} anotherProperty={moreData} />
class MyComponent extends Component {
/* ... */ this.props.aProperty /* ... */
/* ... */ this.props.anotherProperty /* ... */
}
export default props =>
/* ... */ props.aProperty /* ... */
/* ... */ props.anotherProperty /* ... */
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 38
Datenübergabe
<MyComponent aProperty={myData} anotherProperty={moreData} />
class MyComponent extends Component {
/* ... */ this.props.aProperty /* ... */
/* ... */ this.props.anotherProperty /* ... */
}
export default props =>
/* ... */ props.aProperty /* ... */
/* ... */ props.anotherProperty /* ... */
export default ({aProperty, anotherProperty}) =>
/* ... */ aProperty /* ... */
/* ... */ anotherProperty /* ... */
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 39
Die Implementierung der User-Komponente
import React from "react";
const User = ({firstName, lastName}) => (
<div>
<label>First name: </label><span>{firstName}</span><br
/>
<label>Last name: </label><span>{lastName}</span><br/>
</div>
);
export default User;
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 40
Die Implementierung der User-Komponente
import React from "react";
const User = ({firstName, lastName}) => (
<div>
<label>First name: </label><span>{firstName}</span><br
/>
<label>Last name: </label><span>{lastName}</span><br/>
</div>
);
export default User;
<User firstName="Petra" lastName="Meier" />
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 41
Anzeige einer Liste von Benutzern
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 42
Die Implementierung der UserList-Komponente
import React from "react";
import User from "./User";
const UserList = ({users}) => (
<ul>
{ users.map( user =>
<li key={"userlist_" + user.firstName + user.lastName}>
<User {...user} />
</li> ) }
</ul>
);
export default UserList;
Wichtig: Der Key sollte eine semantische Beziehung zur Komponente
haben.
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 43
Anlegen eines Benutzers
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 44
Verwenden der eingegebenen Daten
<div>
<label>First name:</label>
<input type="text"
onBlur={e =>
this.setState({firstName: e.target.value})} />
</div>
<div>
<button
onClick={() => { this.props.submitUser(this.state); }}
>Submit</button>
</div>
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 45
Einführung in Redux
React Data Flow
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 47
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 48
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 49
Redux Data Flow
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 50
Und was genau ist Redux jetzt?
Verwaltung eines globalen State
State-Aktualisierung mit Hilfe von Aktionen
Bereitstellung des State für die Komponenten
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 51
Action
const USER_ADDED = "USER_ADDED";
function addUser(user) {
return {
type: USER_ADDED,
payload: user
}
}
Sehr ähnlich zu CQRS / Event Sourcing
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 52
State Tree
INITIAL_STATE = {
users: []
};
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 53
Reducers
function reducers(state = INITIAL_STATE, action = {}) {
return {
users: users(state.users, action)
};
}
function users(state, action) {
switch (action.type) {
case USER_ADDED:
return state.concat(action.payload);
}
return state;
}
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 54
Integration in die Komponente
<div>
<div>User Creation</div>
<div><label>First name:</label> <input type="text"/></div>
<div><label>Last name:</label> <input type="text"/></div>
<div>
<button onClick={
/* ... */
}>Submit</button>
</div>
</div>
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 55
Integration in die Komponente
<div>
<div>User Creation</div>
<div><label>First name:</label> <input type="text"/></div>
<div><label>Last name:</label> <input type="text"/></div>
<div>
<button onClick={
() => {this.props.submitUser(
{firstName: ..., lastName: ...}
)}
}>Submit</button>
</div>
</div>
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 56
Der Callback
<UserCreation submitUser={
user => this.props.dispatch(Actions.addUser(user))
}/>
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 57
Redux Tools
Redux Logger Demo
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Redux Tools – Folie 59
Redux Developer Tools Demo
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Redux Tools – Folie 60
Credits
Motivation: Hamza Butt – Workout, Gym, Squats
http://costculator.com/best-rowing-machine-reviews/
React.js:
http://www.goodworklabs.com/wp-content/uploads/2016/10/reactjs.png
React Shallow Rendering: anokarina – Does dipping my toes into the
Sound count as touching the Pacific Ocean?
https://www.flickr.com/photos/anokarina/20044358984
User Management: James Cridland – Crowd
https://www.flickr.com/photos/jamescridland/613445810/
React / Redux Tools: C_osett – Google Developer Tools
https://www.flickr.com/photos/mstable/17517988852/
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Credits – Folie 61
Vielen Dank!
E-Mail info@nicole-rauch.de
Twitter @NicoleRauch
Web http://www.nicole-rauch.de
https://github.com/NicoleRauch/RR3Code
React.js & Redux Workshops · Entwicklung
EventStorming · Domain-Driven Design
Training · Coaching · Facilitation
Software Craftsmanship
Functional Programming
© 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Vielen Dank! – Folie 62

Weitere ähnliche Inhalte

Ähnlich wie React & Redux

Vaadin - Thinking of U and I (MAJUG 2013)
Vaadin - Thinking of U and I (MAJUG 2013)Vaadin - Thinking of U and I (MAJUG 2013)
Vaadin - Thinking of U and I (MAJUG 2013)
Christian Janz
 
2012-10-12 Testen mit Arquillian
2012-10-12 Testen mit Arquillian2012-10-12 Testen mit Arquillian
2012-10-12 Testen mit Arquillian
Matthias Reining
 

Ähnlich wie React & Redux (20)

MVVM mit WPF
MVVM mit WPFMVVM mit WPF
MVVM mit WPF
 
Was ist neu in .NET 4.5?
Was ist neu in .NET 4.5?Was ist neu in .NET 4.5?
Was ist neu in .NET 4.5?
 
Automatisierung von Windows-Anwendungen
Automatisierung von Windows-AnwendungenAutomatisierung von Windows-Anwendungen
Automatisierung von Windows-Anwendungen
 
Angular 2 Workshop November 2015 von der w-jax 2015
Angular 2 Workshop November 2015 von der w-jax 2015Angular 2 Workshop November 2015 von der w-jax 2015
Angular 2 Workshop November 2015 von der w-jax 2015
 
Angular 2 Workshop Oktober 2015
Angular 2 Workshop Oktober 2015Angular 2 Workshop Oktober 2015
Angular 2 Workshop Oktober 2015
 
Trendforum
TrendforumTrendforum
Trendforum
 
Vaadin - Thinking of U and I (MAJUG 2013)
Vaadin - Thinking of U and I (MAJUG 2013)Vaadin - Thinking of U and I (MAJUG 2013)
Vaadin - Thinking of U and I (MAJUG 2013)
 
2012-10-12 Testen mit Arquillian
2012-10-12 Testen mit Arquillian2012-10-12 Testen mit Arquillian
2012-10-12 Testen mit Arquillian
 
Von UIKit zu SwiftUI - was beim Umstieg zu beachten ist
Von UIKit zu SwiftUI - was beim Umstieg zu beachten istVon UIKit zu SwiftUI - was beim Umstieg zu beachten ist
Von UIKit zu SwiftUI - was beim Umstieg zu beachten ist
 
Java FX8 JumpStart - JUG ch - zürich
Java FX8   JumpStart - JUG ch - zürichJava FX8   JumpStart - JUG ch - zürich
Java FX8 JumpStart - JUG ch - zürich
 
Specification by example
Specification by exampleSpecification by example
Specification by example
 
Einführung in ASP.NET Core Middlewares
Einführung in ASP.NET Core MiddlewaresEinführung in ASP.NET Core Middlewares
Einführung in ASP.NET Core Middlewares
 
PHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-AnsätzePHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-Ansätze
 
W-Jax 2015: QS-Maßnahmen bei Continuous Delivery
W-Jax 2015: QS-Maßnahmen bei Continuous DeliveryW-Jax 2015: QS-Maßnahmen bei Continuous Delivery
W-Jax 2015: QS-Maßnahmen bei Continuous Delivery
 
TYPO3 CMS 7.0 - Die Neuerungen - pluswerk
TYPO3 CMS 7.0 - Die Neuerungen - pluswerkTYPO3 CMS 7.0 - Die Neuerungen - pluswerk
TYPO3 CMS 7.0 - Die Neuerungen - pluswerk
 
Widgets ohne Grenzen! Cebit 2008
Widgets ohne Grenzen! Cebit 2008Widgets ohne Grenzen! Cebit 2008
Widgets ohne Grenzen! Cebit 2008
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJS
 
.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1
 
Einführung in Windows Presentation Foundation
Einführung in Windows Presentation FoundationEinführung in Windows Presentation Foundation
Einführung in Windows Presentation Foundation
 
Silverlight - Tipps & Tricks für Fortgeschrittene
Silverlight - Tipps & Tricks für FortgeschritteneSilverlight - Tipps & Tricks für Fortgeschrittene
Silverlight - Tipps & Tricks für Fortgeschrittene
 

React & Redux

  • 3. React.js Eine JavaScript Library zum Erstellen von User Interfaces Nur die UI Virtual DOM Data Flow © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 3
  • 4. Data Flow Unidirektional ohne Event-Chaos © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 4
  • 5. http://www.wikihow.com/Image:Make-Spaghetti-Step-1.jpg © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 5
  • 7. Entwicklungsgeschichte einer Pub-Sub-Software © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 7
  • 8. Entwicklungsgeschichte einer Pub-Sub-Software © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 8
  • 9. Entwicklungsgeschichte einer Pub-Sub-Software © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 9
  • 10. React Data Flow © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 10
  • 11. Virtual DOM Effizientes UI-Rendering inklusive © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 11
  • 12. Änderungen auf der UI - was tun? © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 12
  • 13. Änderungen auf der UI - was tun? Alles neuzeichnen? Flackert! © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 13
  • 14. Änderungen auf der UI - was tun? Alles neuzeichnen? Flackert! DOM manipulieren? Mühsam! © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 14
  • 15. Virtual DOM Entwickler beschreibt das vollständige Resultat React aktualisiert den DOM mit minimalen Änderungen © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 15
  • 16. Nur die UI Model ist kein Bestandteil von React Kann beliebig implementiert werden © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Warum React.js? – Folie 16
  • 18. Eine einfache Komponente © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in React.js – Folie 18
  • 19. Der Code als Class Component import React, { Component } from "react"; export default class HelloWorld extends Component { render() { return <p>Hello World!</p>; } } © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in React.js – Folie 19
  • 20. Der Code als Class Component ohne JSX import React, { Component } from "react"; export default class HelloWorld extends Component { render() { return React.createElement(’p’, null, ’Hello World!’); } } © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in React.js – Folie 20
  • 21. Der Code als Stateless Functional Component import React from "react"; const HelloWorld = () => <p>Hello World!</p>; export default HelloWorld; © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in React.js – Folie 21
  • 22. Und wo binden wir diese Komponente ein? index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>React & Redux</title> </head> <body> <div id="start" /> </body> </html> © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in React.js – Folie 22
  • 23. Und wo binden wir diese Komponente ein? index.js: import React, {Component} from "react"; import ReactDOM from "react-dom"; import HelloWorld from "./HelloWorld"; ReactDOM.render( <HelloWorld /> , document.getElementById("start") ); © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in React.js – Folie 23
  • 24. Wie finden die beiden zueinander? webpack.config.js: module.exports = { entry: [ "./src/index" // <---- index.js ], plugins: [ new HtmlWebpackPlugin({ template: "./index.html" // <---- index.html }), ] }; © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in React.js – Folie 24
  • 25. React.js Testen mit Shallow Rendering
  • 26. Shallow Rendering - Was ist das? Seit React 0.13 (März 2015) Erlaubt das Testen von Komponenten ohne DOM © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. React.js Testen mit Shallow Rendering – Folie 26
  • 27. Shallow Rendering - Was ist das? Seit React 0.13 (März 2015) Erlaubt das Testen von Komponenten ohne DOM Shallow rendering ist hilfreich, um Tests auf eine Komponente zu beschränken sicherzustellen, dass die Tests nicht vom Verhalten von Kind-Komponenten abhängen © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. React.js Testen mit Shallow Rendering – Folie 27
  • 28. Essentielle Testing Library Enzyme © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. React.js Testen mit Shallow Rendering – Folie 28
  • 29. Essentielle Testing Library Enzyme Shallow Rendering Full DOM Rendering © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. React.js Testen mit Shallow Rendering – Folie 29
  • 30. Ein Shallow Rendering Test import React from "react"; import expect from "must"; import { shallow } from "enzyme"; import HelloWorldFunctional from "../src-solution-react/ HelloWorldFunctionalComponent"; describe(’HelloWorldComponent’, () => { it(’checks the result’s type and contents’, () => { const functional = shallow(<HelloWorldFunctional />); expect(functional.text()).to.be("Hello World!"); expect(functional.type()).to.be("p"); expect(functional.name()).to.be("p"); expect(functional.html()).to.be("<p>Hello World!</p>"); © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. React.js Testen mit Shallow Rendering – Folie 30
  • 32. Demo © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. React Developer Tools – Folie 32
  • 34. Anzeige eines Benutzers © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 34
  • 35. Datenübergabe © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 35
  • 36. Datenübergabe <MyComponent aProperty={myData} anotherProperty={moreData} /> © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 36
  • 37. Datenübergabe <MyComponent aProperty={myData} anotherProperty={moreData} /> class MyComponent extends Component { /* ... */ this.props.aProperty /* ... */ /* ... */ this.props.anotherProperty /* ... */ } © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 37
  • 38. Datenübergabe <MyComponent aProperty={myData} anotherProperty={moreData} /> class MyComponent extends Component { /* ... */ this.props.aProperty /* ... */ /* ... */ this.props.anotherProperty /* ... */ } export default props => /* ... */ props.aProperty /* ... */ /* ... */ props.anotherProperty /* ... */ © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 38
  • 39. Datenübergabe <MyComponent aProperty={myData} anotherProperty={moreData} /> class MyComponent extends Component { /* ... */ this.props.aProperty /* ... */ /* ... */ this.props.anotherProperty /* ... */ } export default props => /* ... */ props.aProperty /* ... */ /* ... */ props.anotherProperty /* ... */ export default ({aProperty, anotherProperty}) => /* ... */ aProperty /* ... */ /* ... */ anotherProperty /* ... */ © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 39
  • 40. Die Implementierung der User-Komponente import React from "react"; const User = ({firstName, lastName}) => ( <div> <label>First name: </label><span>{firstName}</span><br /> <label>Last name: </label><span>{lastName}</span><br/> </div> ); export default User; © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 40
  • 41. Die Implementierung der User-Komponente import React from "react"; const User = ({firstName, lastName}) => ( <div> <label>First name: </label><span>{firstName}</span><br /> <label>Last name: </label><span>{lastName}</span><br/> </div> ); export default User; <User firstName="Petra" lastName="Meier" /> © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 41
  • 42. Anzeige einer Liste von Benutzern © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 42
  • 43. Die Implementierung der UserList-Komponente import React from "react"; import User from "./User"; const UserList = ({users}) => ( <ul> { users.map( user => <li key={"userlist_" + user.firstName + user.lastName}> <User {...user} /> </li> ) } </ul> ); export default UserList; Wichtig: Der Key sollte eine semantische Beziehung zur Komponente haben. © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 43
  • 44. Anlegen eines Benutzers © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 44
  • 45. Verwenden der eingegebenen Daten <div> <label>First name:</label> <input type="text" onBlur={e => this.setState({firstName: e.target.value})} /> </div> <div> <button onClick={() => { this.props.submitUser(this.state); }} >Submit</button> </div> © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Erstellen einer Benutzerverwaltung – Folie 45
  • 47. React Data Flow © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 47
  • 48. © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 48
  • 49. © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 49
  • 50. Redux Data Flow © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 50
  • 51. Und was genau ist Redux jetzt? Verwaltung eines globalen State State-Aktualisierung mit Hilfe von Aktionen Bereitstellung des State für die Komponenten © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 51
  • 52. Action const USER_ADDED = "USER_ADDED"; function addUser(user) { return { type: USER_ADDED, payload: user } } Sehr ähnlich zu CQRS / Event Sourcing © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 52
  • 53. State Tree INITIAL_STATE = { users: [] }; © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 53
  • 54. Reducers function reducers(state = INITIAL_STATE, action = {}) { return { users: users(state.users, action) }; } function users(state, action) { switch (action.type) { case USER_ADDED: return state.concat(action.payload); } return state; } © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 54
  • 55. Integration in die Komponente <div> <div>User Creation</div> <div><label>First name:</label> <input type="text"/></div> <div><label>Last name:</label> <input type="text"/></div> <div> <button onClick={ /* ... */ }>Submit</button> </div> </div> © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 55
  • 56. Integration in die Komponente <div> <div>User Creation</div> <div><label>First name:</label> <input type="text"/></div> <div><label>Last name:</label> <input type="text"/></div> <div> <button onClick={ () => {this.props.submitUser( {firstName: ..., lastName: ...} )} }>Submit</button> </div> </div> © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 56
  • 57. Der Callback <UserCreation submitUser={ user => this.props.dispatch(Actions.addUser(user)) }/> © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Einführung in Redux – Folie 57
  • 59. Redux Logger Demo © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Redux Tools – Folie 59
  • 60. Redux Developer Tools Demo © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Redux Tools – Folie 60
  • 61. Credits Motivation: Hamza Butt – Workout, Gym, Squats http://costculator.com/best-rowing-machine-reviews/ React.js: http://www.goodworklabs.com/wp-content/uploads/2016/10/reactjs.png React Shallow Rendering: anokarina – Does dipping my toes into the Sound count as touching the Pacific Ocean? https://www.flickr.com/photos/anokarina/20044358984 User Management: James Cridland – Crowd https://www.flickr.com/photos/jamescridland/613445810/ React / Redux Tools: C_osett – Google Developer Tools https://www.flickr.com/photos/mstable/17517988852/ © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Credits – Folie 61
  • 62. Vielen Dank! E-Mail info@nicole-rauch.de Twitter @NicoleRauch Web http://www.nicole-rauch.de https://github.com/NicoleRauch/RR3Code React.js & Redux Workshops · Entwicklung EventStorming · Domain-Driven Design Training · Coaching · Facilitation Software Craftsmanship Functional Programming © 2016 - 2018 Nicole Rauch. Alle Rechte vorbehalten. Vielen Dank! – Folie 62