If you want to miss nothing click follow and you are welcome to comments and discuss with me.
Without further ado here is a summary of my notes for today.
What is Web Component
It's a set for web platform API's that allow us to create a custom, reusable and encapsulated html tags use in web pages and web apps.
Web component do not required any special javascript libraries or framework.
Web component have 3 main building blocks:
- Custom Element
- Shadow DOM
- HTML Templates
Custom Element:
Create custom HTML tags, custom class and lifecycle methods
// class inherits from HTMLElement class customButton extends HTMLElement { ... } // To bind the new custom element window.customElements.define('x-button', customButton)
Lifecycle methods:
- constructor(): Called when an instance of the element is created
- connectedCallback(): Call every time when the element is inserted into DOM
- disconnectedCallback(): Call every time the element is remove from the DOM
- attributeChangedCallback(attributeName, oldValue, newValue): Call when an attribute is added, removed, updated or replaced
Shadow DOM:
- Used for self-contained components
- Encapsulate styles and markup
- Create with element.attachShadow({mode:open})
- Creates a "shadowRoot" that we can reference and interact with
HTMl Template:
- Define the encapsulated markup of our web component
- Template tag stores markup on page
- Include both HTML and CSS in template
- Use slots to add custom text
My first component
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Web Component</title> </head> <body> <panic-button></panic-button> <script src="panicButton.js"></script> </body> </html>
panicButton.js
class panicButton extends HTMLElement { constructor() { // Call HTMLElement constructor super() // Add some content to our component this.innerHTML = `Hello World` } } // Bind our component window.customElements.define('panic-button', panicButton)
My First Component... I guess I can do better :)
Add attribute
index.html
<panic-button message="Women and Children first"></panic-button>
panicButton.js
class panicButton extends HTMLElement { constructor() { // Call HTMLElement constructor super() // use getAttribute to retrieved attribute this.innerHTML = `P A N I C - ${this.getAttribute('message')}` } } // Bind our component window.customElements.define('panic-button', panicButton)
Use ShadowRoot:
// Create the element with custom CSS and HTML const template = document.createElement('template') template.innerHTML = ` <style> button { color: white; background-color: red; font-size: 16px; padding: 12px; } </style> <div> <button></button> </div> ` // Create web component class panicButton extends HTMLElement { constructor() { super() // Create the ShadowRoot this.attachShadow({mode: 'open'}) // Add our component inside our ShadowRoot this.shadowRoot.appendChild(template.content.cloneNode(true)) // Set attributes this.shadowRoot.querySelector('button').innerText = `P A N I C : ${this.getAttribute('message')}` } } window.customElements.define('panic-button', panicButton)
Use slot
<panic-button>Women and Children First</panic-button>
// Add the <slot /> tag const template = document.createElement('template') template.innerHTML = ` <style> button { color: white; background-color: red; font-size: 16px; padding: 12px; } </style> <div> <button><slot /></button> </div> `
Multiple-slot
<panic-button> <div slot="message">General Alert</div> <div slot="image"><img src="alter.jpg"></div> </panic-button>
// Add the multiple slot tag by name const template = document.createElement('template') template.innerHTML = ` <style> button { color: white; background-color: red; font-size: 16px; padding: 12px; } </style> <div> <button> <slot name="message"/> <slot name="image"/> </button> </div> `
Events
class panicButton extends HTMLElement { constructor() { ... } // Add the event listener inside this lifecycle hook connectedCallback() { this.shadowRoot.querySelector('button').addEventListener('click', e => { alert('This is not a exercice!') }) } }
Conclusion
That's it for today. If you want more info about web components you can read here: https://developer.mozilla.org/en-US/docs/Web/Web_Components
If you like what I write click follow to be alert when I publish a new post on Dev.to
Top comments (0)