Slide 1

Slide 1 text

JÖRG NEUMANN | ACLUE SCHÖN UND UNGEBUNDEN Leichtgewichtige UI-Komponenten fürs Web entwickeln @JOERGNEUMANN

Slide 2

Slide 2 text

JÖRG NEUMANN THEMEN  Mobile Development  UI-Technologien  Consulting, Coaching, Training KONTAKT  Mail: [email protected]  Twitter: @JoergNeumann  GitHub: https://github.com/JoergNeumann  Blog: www.HeadWriteLine.BlogSpot.com

Slide 3

Slide 3 text

Demos https://bit.ly/35LFf4E

Slide 4

Slide 4 text

Slide 5

Slide 5 text

 Keine Semantik  Intransparenz  Anpassungen schwierig  Framework-Abhängigkeit

Slide 6

Slide 6 text

+ - …
 Global Scoping  Namenskonflikte  Styling-Konflikte

Slide 7

Slide 7 text

 Semantik  Local Scoping  Konfiguration  Bundle Import

Slide 8

Slide 8 text

CUSTOM ELEMENTS Eine API zur Registrierung von eigenen HTML Elementen HTML TEMPLATES UI-Vorlage für eine Komponente SHADOW DOM Kapselung der inneren DOM- Bestandteile eines Elements ES MODULES Einbinden von Komponenten WEB COMPONENTS

Slide 9

Slide 9 text

ECMA Script Module Custom Elements HTML Templates Shadow DOM

Slide 10

Slide 10 text

DEMO

Slide 11

Slide 11 text

CUSTOM ELEMENTS DEFINITION  Eigene HTML-Elemente erstellen  Das Verhalten ist vom Dokument entkoppelt  Eigenständiges Lifecycle-Modell (Erstellung, Attributänderungen, …)

Slide 12

Slide 12 text

class NumberPad extends HTMLElement { constructor() { super(); } get value() { return +this.getAttribute('value'); } set value(value) { this.setAttribute('value', value); } get minimum() { return +this.getAttribute('minimum'); } set minimum(value) { this.setAttribute('minimum', value); } get maximum() { return +this.getAttribute('maximum'); } set maximum(value) { this.setAttribute('maximum', value); } … } customElements.define('number-pad', NumberPad); CUSTOM ELEMENTS ENTWICKLUNG  Definition erfolgt in Form von ES6-Klassen  Ableitung von HTMLElement oder vorhandenem Element möglich  Custom Element muss im Browser registriert werden

Slide 13

Slide 13 text

DEMO

Slide 14

Slide 14 text

class MyElement extends HTMLElement { constructor() { super(); } connectedCallback() { // render … } disconnectedCallback() { // release … } attributeChangedCallback(attr, oldValue, newValue) { // refresh … } static get observedAttributes() { return ['myProperty']; } adoptedCallback(oldDocument, newDocument) { // change … } } customElements.define('my-element', MyElement); }); Element wird erstellt Element wurde in ein neues Dokument verschoben Element wurde aus Dokument entfernt Attribut wurde geändert Attribute für Verfolgung registrieren Element registrieren Element wurde ins Dokument eingefügt CUSTOM ELEMENTS – LIFECYCLE METHODS

Slide 15

Slide 15 text

class HelloElement extends HTMLElement { // 'name'-Attribute für Verfolgung registrieren static get observedAttributes() { return ['name']; } // Auf Änderung reagieren attributeChangedCallback(attr, oldValue, newValue) { if (attr == 'name') { this.textContent = 'Hallo ${newValue}!'; } } } OBSERVED ATTRIBUTES DEFINITION  Attribute für automatische Änderungsverfolgung registrieren  Static Getter: observedAttributes  Benachrichtigung erfolgt über attributeChangedCallback

Slide 16

Slide 16 text

Nr. Name HTML TEMPLATES DEFINITION  HTML Element  Enthält Content der nach dem Laden nicht direkt gerendert wird  Wird erst bei Verwendung gerendert  Das Fragment kann im Dokument wiederverwendet werden

Slide 17

Slide 17 text

Hello World

const template = document.createElement('template'); template.innerHTML = '

Hello World

'; HTML TEMPLATES DEFINITION HTML JavaScript

Slide 18

Slide 18 text

DEMO

Slide 19

Slide 19 text

SHADOW DOM DEFINITION  Bietet ein gekapseltes DOM / CSS für eine Komponente FEATURES  Isolated DOM: Lokale Elemente der Komponente sind von außen nicht sichtbar.  Scoped CSS: Lokale CSS-Definitionen wirken sich nur auf die Komponente aus.  Composition: Komponente kann von außen per Markup erweitert werden.  Einfaches CSS: Keine Konflikte mit id/class-Namen von außen.  Produktivität: App besteht aus gekapselten, wiederverwendbaren Komponenten.

Slide 20

Slide 20 text

class NumberPad extends HTMLElement { constructor() { super(); this.attachShadow({mode: 'open'}); } render() { ... var clone = document.importNode(template.content, true); this.shadowRoot.appendChild(clone); } ... } SHADOW DOM DEFINITION

Slide 21

Slide 21 text

DEMO

Slide 22

Slide 22 text

SHADOW DOM - STYLING CSS SELECTORS  Pseudo-classes: :host, :host(), :host-context()  Pseudo-elements: ::slotted()  Combinator: >>> * Document Element (Shadow Host) Shadow Root Content :host { display: block; width: fit-content; font-size: 30px; background: #78909c; margin: 1px; padding: 14px; } span { background: white; font-size: 30px; }

Slide 23

Slide 23 text

DEFINITION  Ermöglicht das Einbetten von benutzerdefinierten Elementen  -Element im Template dient als Platzhalter  slot-Eigenschaft im Host stellt die Verbindung her kg
+ -
Verwendung: Template: SHADOW DOM - COMPOSITION

Slide 24

Slide 24 text

DEMO

Slide 25

Slide 25 text

BROWSER-KOMPATIBILITÄT CUSTOM ELEMENTS V1 HTML TEMPLATES SHADOW DOM V1 ES MODULES

Slide 26

Slide 26 text

POLYMER PROJECT LitElement  Basisklasse zur Entwicklung von leichtgewichtigen Web Components  bietet ein reaktives Programmiermodell lit-html  sehr effiziente HTML Templating Library  basiert auf ES Template String

Slide 27

Slide 27 text

DEMO

Slide 28

Slide 28 text

FAZIT KOMPONENTEN HELFEN!  Bessere Struktur der App  Kapselung von Markup & Code  Bessere Wiederverwendung  Klare Semantik  Fördert die Wartbarkeit  LitElement und lit-html erleichtern die Entwicklung

Slide 29

Slide 29 text

Q & A