#DevoxxFR
Sara Harkousse @Sara_harkousse
@Sara_harkousse
Tech Lead, front-end Web developer at Dassault Systèmes
Duchess France Leader
#DevoxxFR #webcomponents
http://vignette2.wikia.nocookie.net/weirdcommunity/images/a/a2/Rainbow-flow-abstract-backgrounds-for-powerpoint.jpg/revision/latest?cb=20130603085532
#DevoxxFR #webcomponents @Sara_harkousse
Filterable Product Table
Search Bar
Product Table
Product Row
Product Category Row
https://facebook.github.io/react/docs/thinking-in-react.html
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: `<h1>Hello {{name}}</h1>`
})
export class AppComponent { name = 'Angular'; }
<my-app><h1>Hello Angular</h1></my-app>
https://angular.io/tutorial/toh-pt1
#DevoxxFR #webcomponents @Sara_harkousse
<article class="blog-post">
<h1>{{title}}</h1>
<p>{{yield}}</p>
<p>Edit title: {{input type="text" value=title}}</p>
</article>
{{#each model as |post|}}
{{#blog-post title=post.title}}
{{post.body}}
{{/blog-post}}
{{/each}}
https://guides.emberjs.com/v3.0.0/components/defining-a-component/
// Define the class for a new element called custom-element
class CustomElement extends Polymer.Element {
static get is() { return "custom-element"; }
constructor() {
super();
this.textContent = "I'm a custom-element.";
}
}
// Register the new element with the browser
customElements.define('custom-element', CustomElement);
<custom-element></custom-element>
http://plnkr.co/edit/PaCt2M?p=preview
#DevoxxFR #webcomponents @Sara_harkousse
#DevoxxFR #webcomponents @Sara_harkousse
https://www.webcomponents.org/
#DevoxxFR #webcomponents @Sara_harkousse
https://www.webcomponents.org/
#DevoxxFR #webcomponents @Sara_harkousse
#DevoxxFR #webcomponents @Sara_harkousse
#DevoxxFR #webcomponents @Sara_harkousse
<template id="template">
<div id="container">
<img class="webcomponents" src="logo.svg">
</div>
</template>
https://github.com/SaraHarkousse/Web_Components/tree/master/VanillaJS/Template
#DevoxxFR #webcomponents @Sara_harkousse
var template = document.querySelector('#template');
var clone = template.content.cloneNode(true);
var host = document.querySelector('#host');
host.appendChild(clone);
https://github.com/SaraHarkousse/Web_Components/tree/master/VanillaJS/Template
#DevoxxFR #webcomponents @Sara_harkousse
#DevoxxFR #webcomponents @Sara_harkousse
#DevoxxFR #webcomponents @Sara_harkousse
#DevoxxFR #webcomponents @Sara_harkousse
#DevoxxFR #webcomponents @Sara_harkousse
callback() {
// Use it
this.root = this.attachShadow({mode: 'open'});
var template = document.querySelector('#template');
var clone = document.importNode(template.content, true);
this.root.appendChild(clone);
}
callback() {
// Don't Use it
this.root = this;
var template = document.querySelector('#template');
var clone = document.importNode(template.content, true);
this.root.appendChild(clone);
}
#DevoxxFR #webcomponents @Sara_harkousse
/* Use it */
:host {
color: red;
}
/* Don't use it */
custom-component {
color: red;
}
#DevoxxFR #webcomponents @Sara_harkousse
if (shadowflag){
this.root = this.attachShadow({mode: 'open'});
} else {
this.root = this;
}
custom-component, :host {
color: red;
}
#DevoxxFR #webcomponents @Sara_harkousse
class CustomButton extends HTMLElement {...}
window.customElements.define('custom-button', CustomButton);
<custom-button></custom-button>
#DevoxxFR #webcomponents @Sara_harkousse
class CustomButton extends HTMLButtonElement {...}
window.customElements.define('custom-button', CustomButton, {extends: 'button'});
<button is="custom-button" disabled>My button!</button>
#DevoxxFR #webcomponents @Sara_harkousse
class Custom-component extends HTMLElement {
constructor() {
super(); // always call super() first in the ctor.
...
}
connectedCallback() {
...
}
disconnectedCallback() {
...
}
attributeChangedCallback(attrName, oldVal, newVal) {
...
}
}
#DevoxxFR #webcomponents @Sara_harkousse
<link rel="import" href="component.html">
<link rel="stylesheet" href="style.css">
<div id="container">
<img class="rotate" src="logo.svg">
</div>
<script src="script.js"></script>
#DevoxxFR #webcomponents @Sara_harkousse
var link = document.querySelector('link[rel="import"]');
var content = link.import;
// Grab DOM from component.html's document.
var el = content.querySelector('#container');
var clone = el.cloneNode(true);
var host = document.querySelector('#host');
host.appendChild(clone);
#DevoxxFR #webcomponents @Sara_harkousse
https://www.webcomponents.org/
#DevoxxFR #webcomponents @Sara_harkousse
// export feature
export const Component = // …
// import feature
import {Component} from '../components/cutom-component.js';
#DevoxxFR #webcomponents @Sara_harkousse
<!doctype html>
<html lang="en">
<head>
<link rel="import" href="/components/CustomNavbar.html">
..
</head>
<body>
<custom-navbar style="compact"></custom-navbar>
<custom-toolbar style="full"></custom-toolbar>
<custom-pagecontent>
<custom-input attr="val"></custom-input>
<progress-bar></progress-bar>
</custom-pagecontent>
<script>
...
</script>
</body>
</html>
#DevoxxFR #webcomponents @Sara_harkousse
<script>
document.querySelector('custom-input').dispatchEvent(new CustomEvent('customevent', {
detail: { prop: true }
}));
customElements.whenDefined('progress-bar').then(() => {
document.querySelector('progress-bar').addEventListener(
'customevent', function () {
// do something
}
});
});
</script>
#DevoxxFR #webcomponents @Sara_harkousse
#DevoxxFR #webcomponents
@Sara_harkousse
https://github.com/SaraHarkousse
https://www.programmez.com/magazine/article/web-components-que-du-bonheur-nest-ce-pas