2.0.6 • Published 4 months ago

web-component-base v2.0.6

Weekly downloads
-
License
MIT
Repository
github
Last release
4 months ago

>>> TLDR; See the Quick Start Example you can just copy, refactor, and modify

Web Component Base

Package information: NPM version Package information: NPM license Package information: NPM downloads

This provides 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 properties. Any change in any property value will automatically cause just the component UI to render.

The result is a reactive UI on property changes.

Table of Contents

  1. Import via unpkg
  2. Installation via npm
  3. Usage
  4. Quick Start Example
  5. Life-Cycle Hooks
    1. onInit - the component is connected to the DOM, before view is initialized
    2. afterViewInit - after the view is first initialized
    3. onChanges - every time an attribute value changes

Import via unpkg

Import using unpkg in your component. We will use this in the rest of our usage examples.

import WebComponent from "https://unpkg.com/web-component-base";

// or a specific version
import WebComponent from "https://unpkg.com/web-component-base@1.6.0/index.mjs";

Installation via npm

If you have a bundler to help resolving imports:

npm i web-component-base

Usage

In your component class:

// HelloWorld.mjs
import WebComponent from "https://unpkg.com/web-component-base";

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

  static properties = ["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:

Quick Start Example

Here is an example of using a custom element in a single .html file:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>WC Base Test</title>
    <script type="module">

      // import from unpkg
      import WebComponent from "https://unpkg.com/web-component-base";

      class HelloWorld extends WebComponent {
        static properties = ["name"];

        get template() {
          return `<h1>Hello ${this.name || 'World'}!</h1>`;
        }
      }

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

    </script>
  </head>
  <body>
    <hello-world name="Ayo"></hello-world>
    <script>
        const helloWorld = document.querySelector('hello-world');
        setTimeout(() => {
            helloWorld.setAttribute('name', 'Ayo zzzZzzz');
        }, 2500);
    </script>
  </body>
</html>

Life-Cycle Hooks

Define behavior when certain events in the component's life cycle is triggered by providing hook methods

onInit()

  • triggered when the component is connected to the DOM
  • best for setting up the component
import WebComponent from "https://unpkg.com/web-component-base";

class ClickableText extends WebComponent {
  // gets called when the component is used in an HTML document
  onInit() {
    this.onclick = () => console.log(">>> click!");
  }

  get template() {
    return `<span style="cursor:pointer">Click me!</span>`;
  }
}

afterViewInit()

  • triggered after the view is first initialized
class ClickableText extends WebComponent {
  // gets called when the component's innerHTML is first filled
  afterViewInit() {
    const footer = this.querySelector('footer');
    // do stuff to footer after view is initialized
  }

  get template() {
    return `<footer>Awesome site &copy; 2023</footer>`;
  }
}

onChanges()

  • triggered when an attribute value changed
import WebComponent from "https://unpkg.com/web-component-base";

class ClickableText extends WebComponent {
  // gets called when an attribute value changes
  onChanges(changes) {
      const {property, previousValue, currentValue} = changes;
      console.log('>>> ', {property, previousValue, currentValue})
  }

  get template() {
    return `<span style="cursor:pointer">Click me!</span>`;
  }
}
2.1.0-beta.3

4 months ago

2.1.0-beta.2

4 months ago

2.1.0-beta

5 months ago

2.1.0-beta.1

5 months ago

2.0.5

5 months ago

2.0.6

5 months ago

2.0.3

5 months ago

2.0.4

5 months ago

2.0.2

5 months ago

2.0.1

5 months ago

2.0.0

5 months ago

2.0.0-beta.21

5 months ago

2.0.0-beta.20

5 months ago

2.0.0-beta.19

5 months ago

0.0.0-experimental

5 months ago

2.0.0-beta.9

5 months ago

2.0.0-beta.8

5 months ago

2.0.0-beta.7

5 months ago

2.0.0-beta.2

5 months ago

2.0.0-beta.1

5 months ago

2.0.0-beta.6

5 months ago

2.0.0-beta.5

5 months ago

2.0.0-beta.4

5 months ago

2.0.0-beta.3

5 months ago

2.0.0-beta.11

5 months ago

2.0.0-beta.10

5 months ago

2.0.0-beta.15

5 months ago

2.0.0-beta.14

5 months ago

2.0.0-beta.13

5 months ago

2.0.0-beta.12

5 months ago

2.0.0-beta.18

5 months ago

2.0.0-beta.17

5 months ago

2.0.0-beta.16

5 months ago

1.14.1

5 months ago

1.12.3

6 months ago

1.14.0

5 months ago

1.12.2

6 months ago

1.12.1

6 months ago

1.12.0

6 months ago

1.14.5

5 months ago

1.12.7

6 months ago

1.14.4

5 months ago

1.12.6

6 months ago

1.14.3

5 months ago

1.12.5

6 months ago

1.14.2

5 months ago

1.12.4

6 months ago

1.14.7

5 months ago

1.12.21

6 months ago

1.12.9

6 months ago

1.14.6

5 months ago

1.12.20

6 months ago

1.12.8

6 months ago

2.0.0-beta

5 months ago

1.12.10

6 months ago

1.12.16

6 months ago

1.12.15

6 months ago

1.12.18

6 months ago

1.12.17

6 months ago

1.12.12

6 months ago

1.9.5

7 months ago

1.12.11

6 months ago

1.9.4

7 months ago

1.12.14

6 months ago

1.9.3

7 months ago

1.12.13

6 months ago

1.9.2

7 months ago

1.11.0

6 months ago

1.12.19

6 months ago

1.13.2

6 months ago

1.11.4

6 months ago

1.13.1

6 months ago

1.11.3

6 months ago

1.13.0

6 months ago

1.11.2

6 months ago

1.11.1

6 months ago

1.13.3

6 months ago

1.9.1

7 months ago

1.9.0

7 months ago

1.7.1

7 months ago

1.7.0

7 months ago

1.6.15

8 months ago

1.6.14

8 months ago

1.6.13

8 months ago

1.6.12

8 months ago

1.6.11

8 months ago

1.6.10

8 months ago

1.6.9

8 months ago

1.6.8

8 months ago

1.6.7

8 months ago

1.6.6

8 months ago

1.6.5

8 months ago

1.6.4

8 months ago

1.6.3

8 months ago

1.6.2

8 months ago

1.6.1

8 months ago

1.6.0

8 months ago

1.5.0

8 months ago

1.4.1

8 months ago

1.4.0

8 months ago

1.3.0

8 months ago

1.2.5

8 months ago

1.2.4

8 months ago

1.2.3

8 months ago

1.2.2

8 months ago

1.2.1

8 months ago

1.2.0

8 months ago

1.1.1

8 months ago

1.1.0

8 months ago

1.0.8

8 months ago

1.0.7

8 months ago

1.0.6

8 months ago

1.0.5

8 months ago

1.0.4

8 months ago

1.0.3

8 months ago

1.0.2

8 months ago

1.0.1

8 months ago

1.0.0

8 months ago