Web Components in Easy Mode https://webcomponent.io
Find a file
2023-09-17 00:48:01 +02:00
assets chore: update examples 2023-09-16 23:08:52 +02:00
demo feat: expose onChanges hook 2023-09-17 00:48:01 +02:00
.gitignore chore: add .gitignore; update readme 2023-09-17 00:36:03 +02:00
index.mjs chore: initialize package; update examples 2023-09-16 23:33:46 +02:00
package.json 1.0.8 2023-09-17 00:36:08 +02:00
README.md feat: expose onChanges hook 2023-09-17 00:48:01 +02:00
WebComponent.mjs feat: expose onChanges hook 2023-09-17 00:48:01 +02:00

Web Component Base

This is a very minimal base class for creating reactive custom elements easily.

When you extend the WebComponent class for your component, you only have to define the template() and observedAttributes(), and changes in any attribute value will automatically cause the UI to render.

The result is a reactive UI on attribute changes.

Installation

npm i web-component-base

Usage

In your component class:

// HelloWorld.mjs
import WebComponent from "web-component-base";

export class HelloWorld extends WebComponent {
  name = "World";
  emotion = "excited";

  static get observedAttributes() {
    return ["name", "emotion"];
  }

  get template() {
    return `
        <h1>Hello ${this.name}${this.emotion === "sad" ? ". 😭" : "! 🙌"}</h1>`;
  }
}

customElements.define('hello-world', HelloWorld);

In your HTML page:

<head>
  <script type="module" src="HelloWorld.mjs"></script>
</head>
<body>
  <hello-world name="Ayo" emotion="sad">
  <script>
      const helloWorld = document.querySelector('hello-world');

      setTimeout(() => {
        helloWorld.setAttribute('emotion', 'excited');
      }, 2500)
  </script>
</body>

The result is a reactive UI that updates on attribute changes:

UI showing feeling toward Web Components changing from SAD to EXCITED

Hooks

Currently, you can define behavior when an attribute value changes by defining a method onChanges in your component:

import WebComponent from "../index.mjs";

export class HelloWorld extends WebComponent {
  name = "World";
  emotion = "excited";

  static get observedAttributes() {
    return ["name", "emotion"];
  }

  onChanges({ previousValue, currentValue }) {
    console.log(">>> changed", { previousValue, currentValue });
  }

  get template() {
    return `
        <h1>Hello ${this.name}${this.emotion === "sad" ? ". 😭" : "! 🙌"}</h1>`;
  }
}