Suomi

Tutustu Web Components -teknologian tehokkuuteen, keskittyen mukautettuihin elementteihin, joilla rakennat uudelleenkäytettäviä ja kapseloituja käyttöliittymäkomponentteja.

Web Components: Syväsukellus mukautettuihin elementteihin

Web Components edustavat merkittävää edistysaskelta web-kehityksessä, tarjoten standardoidun tavan luoda uudelleenkäytettäviä ja kapseloituja käyttöliittymäkomponentteja. Web Components -teknologian ytimessä olevista tekniikoista mukautetut elementit (Custom Elements) erottuvat perustana uusien HTML-tagien määrittelylle, joilla on oma toimintalogiikkansa ja renderöintinsä. Tämä kattava opas sukeltaa mukautettujen elementtien yksityiskohtiin, tutkien niiden etuja, toteutusta ja parhaita käytäntöjä modernien verkkosovellusten rakentamisessa.

Mitä ovat Web Components -komponentit?

Web Components on joukko web-standardeja, jotka mahdollistavat kehittäjille uudelleenkäytettävien, kapseloitujen ja yhteensopivien HTML-elementtien luomisen. Ne tarjoavat modulaarisen lähestymistavan web-kehitykseen, mahdollistaen omien käyttöliittymäkomponenttien luomisen, joita voidaan helposti jakaa ja käyttää uudelleen eri projekteissa ja viitekehyksissä. Web Components -teknologian ydinteknologioita ovat:

Mukautettujen elementtien ymmärtäminen

Mukautetut elementit ovat Web Components -teknologian ytimessä, mahdollistaen kehittäjille HTML-sanaston laajentamisen omilla elementeillään. Nämä mukautetut elementit käyttäytyvät kuten standardit HTML-elementit, mutta ne voidaan räätälöidä sovelluskohtaisiin tarpeisiin, mikä tarjoaa suurempaa joustavuutta ja koodin organisointia.

Mukautettujen elementtien määrittely

Mukautetun elementin määrittämiseksi sinun on käytettävä customElements.define()-metodia. Tämä metodi ottaa kaksi argumenttia:

  1. Elementin nimi: Merkkijono, joka edustaa mukautetun elementin nimeä. Nimen on sisällettävä yhdysmerkki (-) konfliktien välttämiseksi standardien HTML-elementtien kanssa. Esimerkiksi my-element on kelvollinen nimi, kun taas myelement ei ole.
  2. Elementtiluokka: JavaScript-luokka, joka laajentaa HTMLElement-luokkaa ja määrittelee mukautetun elementin toiminnan.

Tässä on perusesimerkki:

class MyElement extends HTMLElement {
  constructor() {
    super();
    this.innerHTML = 'Hello, World!';
  }
}

customElements.define('my-element', MyElement);

Tässä esimerkissä määrittelemme mukautetun elementin nimeltä my-element. MyElement-luokka laajentaa HTMLElement-luokkaa ja asettaa elementin sisäisen HTML-koodin arvoksi "Hello, World!" konstruktorissa.

Mukautetun elementin elinkaaren takaisinkutsut (Lifecycle Callbacks)

Mukautetuilla elementeillä on useita elinkaaren takaisinkutsuja (lifecycle callbacks), joiden avulla voit suorittaa koodia elementin elinkaaren eri vaiheissa. Nämä takaisinkutsut tarjoavat mahdollisuuksia alustaa elementti, reagoida attribuuttien muutoksiin ja siivota resursseja, kun elementti poistetaan DOM:sta.

Tässä on esimerkki, joka demonstroi elinkaaren takaisinkutsujen käyttöä:

class MyElement extends HTMLElement {
  constructor() {
    super();
    this.shadow = this.attachShadow({mode: 'open'});
  }

  connectedCallback() {
    this.shadow.innerHTML = `

Connected to the DOM!

`; console.log('Element connected'); } disconnectedCallback() { console.log('Element disconnected'); } static get observedAttributes() { return ['data-message']; } attributeChangedCallback(name, oldValue, newValue) { if (name === 'data-message') { this.shadow.innerHTML = `

${newValue}

`; } } } customElements.define('my-element', MyElement);

Tässä esimerkissä connectedCallback() kirjaa viestin konsoliin ja asettaa elementin sisäisen HTML-koodin, kun se liitetään DOM:iin. disconnectedCallback() kirjaa viestin, kun elementti poistetaan. attributeChangedCallback() kutsutaan, kun data-message-attribuutti muuttuu, päivittäen elementin sisällön vastaavasti. observedAttributes-getteri määrittelee, että haluamme tarkkailla data-message-attribuutin muutoksia.

Shadow DOM:n käyttö kapselointiin

Shadow DOM tarjoaa kapseloinnin web-komponenteille, mahdollistaen erillisen DOM-puun luomisen komponentille, joka on eristetty muusta sivusta. Tämä tarkoittaa, että Shadow DOM:n sisällä määritellyt tyylit ja skriptit eivät vaikuta muuhun sivuun, ja päinvastoin. Tämä kapselointi auttaa estämään konflikteja ja varmistaa, että komponentit käyttäytyvät ennustettavasti.

Käyttääksesi Shadow DOM:ia, voit kutsua elementin attachShadow()-metodia. Tämä metodi ottaa optio-objektin, joka määrittelee Shadow DOM:n tilan (mode). Tila voi olla joko 'open' tai 'closed'. Jos tila on 'open', Shadow DOM:iin pääsee käsiksi JavaScriptistä elementin shadowRoot-ominaisuuden kautta. Jos tila on 'closed', Shadow DOM:iin ei pääse käsiksi JavaScriptistä.

Tässä on esimerkki, joka demonstroi Shadow DOM:n käyttöä:

class MyElement extends HTMLElement {
  constructor() {
    super();
    this.shadow = this.attachShadow({ mode: 'open' });
    this.shadow.innerHTML = `
      
      

This is inside the Shadow DOM.

`; } } customElements.define('my-element', MyElement);

Tässä esimerkissä liitämme elementtiin Shadow DOM:n tilassa mode: 'open'. Sitten asetamme Shadow DOM:n sisäisen HTML-koodin sisältämään tyylin, joka asettaa kappaleiden värin siniseksi, sekä kappale-elementin, jossa on tekstiä. Shadow DOM:n sisällä määritelty tyyli koskee vain Shadow DOM:n sisällä olevia elementtejä, eikä se vaikuta Shadow DOM:n ulkopuolisiin kappaleisiin.

Mukautettujen elementtien käytön edut

Mukautetut elementit tarjoavat useita etuja web-kehitykselle:

Käytännön esimerkkejä mukautetuista elementeistä

Tutustutaanpa joihinkin käytännön esimerkkeihin siitä, miten mukautettuja elementtejä voidaan käyttää yleisten käyttöliittymäkomponenttien rakentamiseen.

Yksinkertainen laskurikomponentti

Tämä esimerkki näyttää, kuinka luodaan yksinkertainen laskurikomponentti käyttämällä mukautettuja elementtejä.

class Counter extends HTMLElement {
  constructor() {
    super();
    this.shadow = this.attachShadow({ mode: 'open' });
    this._count = 0;
    this.render();
  }

  connectedCallback() {
    this.shadow.querySelector('.increment').addEventListener('click', () => {
      this.increment();
    });
    this.shadow.querySelector('.decrement').addEventListener('click', () => {
      this.decrement();
    });
  }

  increment() {
    this._count++;
    this.render();
  }

  decrement() {
    this._count--;
    this.render();
  }

  render() {
    this.shadow.innerHTML = `
      
      
${this._count}
`; } } customElements.define('my-counter', Counter);

Tämä koodi määrittelee Counter-luokan, joka laajentaa HTMLElement-luokkaa. Konstruktori alustaa komponentin, liittää Shadow DOM:n ja asettaa alkuarvoksi 0. connectedCallback()-metodi lisää tapahtumankuuntelijat lisäys- ja vähennyspainikkeisiin. increment()- ja decrement()-metodit päivittävät laskurin arvoa ja kutsuvat render()-metodia päivittääkseen komponentin renderöinnin. render()-metodi asettaa Shadow DOM:n sisäisen HTML-koodin sisältämään laskurin näytön ja painikkeet.

Kuvakarusellikomponentti

Tämä esimerkki näyttää, kuinka luodaan kuvakarusellikomponentti käyttämällä mukautettuja elementtejä. Lyhyyden vuoksi kuvien lähteet ovat paikkamerkkejä ja ne voitaisiin ladata dynaamisesti API:sta, CMS:stä tai paikallisesta tallennustilasta. Myös tyylittely on minimoitu.

class ImageCarousel extends HTMLElement {
 constructor() {
  super();
  this.shadow = this.attachShadow({ mode: 'open' });
  this._images = [
  'https://via.placeholder.com/350x150',
  'https://via.placeholder.com/350x150/0077bb',
  'https://via.placeholder.com/350x150/00bb77',
  ];
  this._currentIndex = 0;
  this.render();
 }

 connectedCallback() {
  this.shadow.querySelector('.prev').addEventListener('click', () => {
  this.prevImage();
  });
  this.shadow.querySelector('.next').addEventListener('click', () => {
  this.nextImage();
  });
 }

 nextImage() {
  this._currentIndex = (this._currentIndex + 1) % this._images.length;
  this.render();
 }

 prevImage() {
  this._currentIndex = (this._currentIndex - 1 + this._images.length) % this._images.length;
  this.render();
 }

 render() {
  this.shadow.innerHTML = `
  
  
  `;
 }
}

customElements.define('image-carousel', ImageCarousel);

Tämä koodi määrittelee ImageCarousel-luokan, joka laajentaa HTMLElement-luokkaa. Konstruktori alustaa komponentin, liittää Shadow DOM:n ja asettaa alkuperäisen kuvataulukon ja nykyisen indeksin. connectedCallback()-metodi lisää tapahtumankuuntelijat edellinen- ja seuraava-painikkeisiin. nextImage()- ja prevImage()-metodit päivittävät nykyistä indeksiä ja kutsuvat render()-metodia päivittääkseen komponentin renderöinnin. render()-metodi asettaa Shadow DOM:n sisäisen HTML-koodin sisältämään nykyisen kuvan ja painikkeet.

Parhaat käytännöt mukautettujen elementtien kanssa työskentelyyn

Tässä on joitakin parhaita käytäntöjä, joita kannattaa noudattaa työskennellessäsi mukautettujen elementtien kanssa:

Mukautetut elementit ja viitekehykset

Mukautetut elementit on suunniteltu yhteensopiviksi muiden web-teknologioiden ja viitekehysten kanssa. Niitä voidaan käyttää yhdessä suosittujen viitekehysten, kuten React, Angular ja Vue.js, kanssa.

Mukautettujen elementtien käyttäminen Reactissa

Käyttääksesi mukautettuja elementtejä Reactissa, voit yksinkertaisesti renderöidä ne kuten minkä tahansa muun HTML-elementin. Saatat kuitenkin joutua käyttämään ref-attribuuttia päästäksesi käsiksi taustalla olevaan DOM-elementtiin ja vuorovaikuttaaksesi sen kanssa suoraan.

import React, { useRef, useEffect } from 'react';

function MyComponent() {
  const myElementRef = useRef(null);

  useEffect(() => {
    if (myElementRef.current) {
      // Access the custom element's API
      myElementRef.current.addEventListener('custom-event', (event) => {
        console.log('Custom event received:', event.detail);
      });
    }
  }, []);

  return ;
}

export default MyComponent;

Tässä esimerkissä käytämme ref-attribuuttia päästäksemme käsiksi my-element-mukautettuun elementtiin ja lisäämme sille tapahtumankuuntelijan. Tämä antaa meille mahdollisuuden kuunnella mukautetun elementin lähettämiä tapahtumia ja reagoida niihin.

Mukautettujen elementtien käyttäminen Angularissa

Käyttääksesi mukautettuja elementtejä Angularissa, sinun on määritettävä Angular tunnistamaan mukautettu elementti. Tämä voidaan tehdä lisäämällä CUSTOM_ELEMENTS_SCHEMA moduulin konfiguraation schemas-taulukkoon.

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent],
  schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class AppModule { }

Kun mukautettu elementti on rekisteröity, voit käyttää sitä Angular-mallineissasi kuten mitä tahansa muuta HTML-elementtiä.

Mukautettujen elementtien käyttäminen Vue.js:ssä

Myös Vue.js tukee mukautettuja elementtejä natiivisti. Voit käyttää niitä suoraan mallineissasi ilman erityisiä määrityksiä.



Vue tunnistaa mukautetun elementin automaattisesti ja renderöi sen oikein.

Saavutettavuusnäkökohdat

Kun rakennat mukautettuja elementtejä, on ratkaisevan tärkeää ottaa huomioon saavutettavuus varmistaaksesi, että komponenttisi ovat kaikkien käytettävissä, mukaan lukien vammaiset henkilöt. Tässä on joitakin keskeisiä saavutettavuusnäkökohtia:

Kansainvälistäminen ja lokalisointi

Kun kehität mukautettuja elementtejä maailmanlaajuiselle yleisölle, on tärkeää ottaa huomioon kansainvälistäminen (i18n) ja lokalisointi (l10n). Tässä on joitakin keskeisiä näkökohtia:

Yhteenveto

Mukautetut elementit ovat tehokas työkalu uudelleenkäytettävien ja kapseloitujen käyttöliittymäkomponenttien rakentamiseen. Ne tarjoavat useita etuja web-kehitykselle, kuten uudelleenkäytettävyyden, kapseloinnin, yhteentoimivuuden, ylläpidettävyyden ja suorituskyvyn. Noudattamalla tässä oppaassa esitettyjä parhaita käytäntöjä voit hyödyntää mukautettuja elementtejä rakentaaksesi moderneja verkkosovelluksia, jotka ovat vakaita, ylläpidettäviä ja saavutettavia maailmanlaajuiselle yleisölle. Web-standardien jatkaessa kehittymistään Web Components -komponentit, mukaan lukien mukautetut elementit, tulevat yhä tärkeämmiksi modulaaristen ja skaalautuvien verkkosovellusten luomisessa.

Hyödynnä mukautettujen elementtien voima rakentaaksesi verkon tulevaisuutta, yksi komponentti kerrallaan. Muista ottaa huomioon saavutettavuus, kansainvälistäminen ja lokalisointi varmistaaksesi, että komponenttisi ovat kaikkien käytettävissä, kaikkialla.