Web Components
con Stencil
![](https://s3.amazonaws.com/media-p.slid.es/uploads/67937/images/3650175/sticker-beerjs-vaso.png)
BeerJS N° 27
Córdoba, 21 de Febrero de 2019
< />
@joelalejandro
¿Web Components?
¿Shadow DOM?
¿Custom Elements?
¿Polymer?
¿React?
Librería de UI
Encapsulamiento
Set de APIs
API de registro
Librería de CE
class MyComponent
extends HTMLElement {
}
Estructura mínima viable de un Web Component.
window.customElements.register(
"my-component",
MyComponent
);
<my-component />
Esto es todo lo que necesitás
para renderizar un Web Component.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/67937/images/5809697/pasted-from-clipboard.png)
Vamos a crear nuestro componente de botón,
basado en Material Design. (*)
.
.
.
(acá el speaker tiene que mostrar su IDE)
.
.
.
¿Algo más rápido?
¿Observers?
¿Pre-rendering?
¿Reactiveness?
¿State?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/67937/images/5809881/pasted-from-clipboard.png)
Un compilador
de Web Components
(utilizando TypeScript)
npm init stencil
Todo comienza así (*)
(*) = npm@^6
.
.
.
(acá el speaker tiene que mostrar su IDE)
.
.
.
Custom Elements API
Polyfills para todo
One-way Data Binding
Async rendering
TypeScript + JSX
Pre-rendering
Unit + E2E Tests
PWA
import { Component, Event, EventEmitter, Prop } from "@stencil/core";
@Component({
tag: "form-button",
styleUrl: "form-button.scss",
shadow: true
})
export class FormButton {
@Event() buttonPressed: EventEmitter;
@Prop() disabled: boolean;
handleClick(e) {
e.preventDefault();
this.buttonPressed.emit(e);
}
render() {
return (
<button
disabled={this.disabled}
onClick={this.handleClick.bind(this)}
class="button"
>
<slot />
</button>
);
}
}
Component Decorator
Event Delegation
JSX
Template
Props
¡Stencil se lleva
bien con todos!
![](https://s3.amazonaws.com/media-p.slid.es/uploads/67937/images/5810372/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/67937/images/5810373/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/67937/images/5810376/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/67937/images/5810385/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/67937/images/5810413/pasted-from-clipboard.png)
Los distribuibles de Stencil están basados 100% en APIs nativas, sin ataduras a ningún framework o librería.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/67937/images/5810385/pasted-from-clipboard.png)
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>My App</title>
</head>
<body>
<material-button
color="black"
onClick="alert('Hola, BeerJS!')">
Dame un click
</material-button>
<script src="components/material-button.js"></script>
</body>
</html>
Stencil Design Systems
¿preguntas?
Web Components
con Stencil
![](https://s3.amazonaws.com/media-p.slid.es/uploads/67937/images/3650175/sticker-beerjs-vaso.png)
BeerJS N° 27
Córdoba, 21 de Febrero de 2019
< />
@joelalejandro
¡Gracias!
<Web Components con Stencil />
By Joel Alejandro Villarreal Bertoldi
<Web Components con Stencil />
Estado actual de Web Components. Live demos con Vanilla JS y Stencil.
- 592