Es6 Web Components

The world of Web Components has undergone significant changes with the advent of ECMAScript 2015 (ES6). This modern standard has introduced a plethora of features that enable developers to build complex and reusable UI elements in a more efficient manner. In this article, we will delve into the specifics of using ES6 to develop cutting-edge Web Components.

The rise of Custom Elements

With ES6, custom HTML elements can be created through the customElements.define method. This allows us to define new types of HTML elements that are backed by JavaScript logic. Let’s explore this concept in more depth:

// Defining a custom element for "my-button"
class MyButton extends HTMLElement {
  constructor() { super(); }

  connectedCallback() {
    // Add event listener to the button.
    this.addEventListener('click', () => console.log('My button clicked!'));

    // Create and append the default content.
    const contianer = document.createElement("div");
    container.textContent = "Click me!";



customElements.define('my-button', MyButton);

// Using our new element
document.body.innerHTML += `<my-button></my-button>`

In this example, we’ve created a custom MyButton element. This is an isolated DOM tree within the browser, allowing us to write reusable code for UI components. The connectedCallback() method is called when the element becomes part of the document (i.e., it’s “connected”). We then append our button and display its default text.

Using Shadow DOM

When building complex Web Components, isolating their internal structure from the rest of your application can be beneficial. Enter shadowRoot. The concept here is to isolate all the content within an HTML element inside a shadow root node.

Let’s take it step by step with an example:

class MyPanel extends HTMLElement {
  constructor() { super(); }

  connectedCallback() {
    const container = document.createElement("div");

    // Attach a shadow DOM.
    this.attachShadow({ mode: 'open' });

    // Add content to the shadow DOM, it won't be exposed directly on our <my-panel> element
    const panelContent = document.createElement('p');
  panelContent.textContent =
      "Panel has been updated!"; container.appendChild(panelContent);


customElements.define('my-panel', MyPanel);

// Using your new component.
document.body.innerHTML += `<my-panel></my-panel>`

The code above creates a MyPanel element, with an internal shadow DOM tree. It then populates that shadow root with its default content and we see the same effect.


Another ES6 feature for Web Components is template literals. These allow developers to build reusable UI elements in a more expressive manner:

class MyCard extends HTMLElement {
  constructor() { super(); }

  connectedCallback() {
    const container = document.createElement("div");

    // Create and append the default content using Template Literals.
    this.attachShadow({ mode: 'open' });

      const cardContent =
      <h2>John Doe</h2>
      <p>I'm a test card.</p>`;

  (this.shadowRoot.querySelector('template').innerHTML = cardContent;


customElements.define("my-card", MyCard);

// Using your new component.
document.body.innerHTML += `<my-card></my-card>`

These examples demonstrate some of the core features that ES6 has brought to the table for Web Components. These advances allow developers to craft more efficient, reusable UI elements with increased simplicity and maintainability.

Web components are a powerful tool in the modern web landscape. By leveraging ES6’s advancements in custom elements, shadow DOMs, and template literals, you can create complex interfaces that simplify your application’s architecture and improve performance.
Now go forth: experiment with these new tools to take control over how HTML elements render on your browser screens!