Yesterday, we learned how to connect a child and parent Web Component to each other.
Today, we're going to look at how to use custom events to provide a more decoupled experience. Let's dig in!
🤫 Shhh! I'm working on a new workshop-style course on Web Components. I don't even have a landing page for it yet, but if you buy my All-Access Pass, you'll get instant access to it as soon as its ready.
Custom events
The new CustomEvent() method creates a custom event object that you can emit on a specific element.
Pass in the event type as an argument. You can optionally provide an object as a second argument, with details about whether or not the event bubbles, is cancelable, and any detail you want to share.
Then, you run the dispatchEvent() method on the element, passing in the event as an argument.
// Create a new event let event = new CustomEvent(`my-event`, { bubbles: true, cancelable: true, detail: 'Hi there!' }); // Dispatch the event let elem = document.querySelector('#app'); elem.dispatchEvent(event);
You can then listen for the event with the Element.addEventListner() method, just like any other event.
elem.addEventListener('my-event', function (event) { console.log(event.detail); });
There are a lot of different naming conventions you can use, but for library events, I like to use a {library-name}:{event-type} pattern.
For example, I might name the event that's emitted when the Next button is clicked in the <wc-highlight-controls> Web Component highlight-controls:next.
Emitting our Web Component event
In the <wc-highlight-controls> Web Component, let's swap out this.highlight.next() in the handleEvent() method with a custom event.
/** * Handle events * @param {Event} event The event object */ handleEvent (event) { // Create a new event let next = new CustomEvent('highlight-controls:next', { bubbles: true }); // Dispatch the event this.dispatchEvent(next); }
We can also remove this.highlight from our constructor(), since we no longer need it.
Back in the <wc-highlight> Web Component, we can list for our highlight-controls:next event inside the constructor(). Because events bubble, we can listen directly on our custom element and capture any events that happen inside it.
/** * Instantiate the custom element */ constructor () { // ... // Append controls let controls = document.createElement('wc-highlight-controls'); this.append(controls); // Listen for highlight-constrols:next events this.addEventListener('highlight-controls:next', this); }
Then, we'll handle the event by running this.next().
/** * Handle events * @param {Event} event The event object */ handleEvent (event) { this.next(); }
Here's a demo.
Use events generously
If I were building this out as a real Web Component, I'd probably emit a highlight:next event inside the .next() method for the <wc-highlight> Web Component.
I'd include the current and this.active properties, and the number of total boxes, as part of the detail. This event could then be used by other custom Web Components a developer might create.
/** * Skip to the next item */ next () { // ... // Update [aria-selected] this.boxes[current].setAttribute('aria-selected', false); this.boxes[this.active].setAttribute('aria-selected', true); // Create a new event let next = new CustomEvent('highlight:next', { bubbles: true, detail: { current, next: this.active, boxes: this.boxes } }); // Dispatch the event this.dispatchEvent(next); }
For example, you could use this to create some additional UI that displays the current box number that's highlighted, like 1 of 3.
Like this? You can support my work by purchasing an annual membership.
Cheers,
Chris
Want to share this with others or read it later? View it in a browser.
0 Komentar untuk "[Go Make Things] How to get different Web Components to talk to each other (part 2)"