Atraskite žiniatinklio komponentų ir pasirinktinių elementų galią kuriant daugkartinio naudojimo ir inkapsuliuotus UI komponentus įvairioms žiniatinklio programoms.
Žiniatinklio komponentai: Išsami pažintis su pasirinktiniais elementais
Žiniatinklio komponentai (Web Components) yra svarbus žingsnis į priekį žiniatinklio kūrime, siūlantis standartizuotą būdą kurti daugkartinio naudojimo ir inkapsuliuotus vartotojo sąsajos (UI) komponentus. Tarp pagrindinių technologijų, kurios sudaro žiniatinklio komponentus, pasirinktiniai elementai (Custom Elements) išsiskiria kaip kertinis akmuo, leidžiantis apibrėžti naujas HTML žymes su individualiu elgesiu ir atvaizdavimu. Šis išsamus vadovas gilinsis į pasirinktinių elementų subtilybes, nagrinės jų privalumus, diegimą ir geriausias praktikas kuriant šiuolaikines žiniatinklio programas.
Kas yra žiniatinklio komponentai?
Žiniatinklio komponentai yra žiniatinklio standartų rinkinys, leidžiantis kūrėjams kurti daugkartinio naudojimo, inkapsuliuotus ir sąveikius HTML elementus. Jie siūlo modulinį požiūrį į žiniatinklio kūrimą, leidžiantį kurti pasirinktinius UI komponentus, kuriais galima lengvai dalytis ir naudoti įvairiuose projektuose ir karkasuose. Pagrindinės žiniatinklio komponentų technologijos yra šios:
- Pasirinktiniai elementai (Custom Elements): Apibrėžia naujas HTML žymes ir su jomis susijusį elgesį.
- Shadow DOM: Suteikia inkapsuliaciją, sukuriant atskirą DOM medį komponentui, apsaugant jo stilius ir scenarijus nuo globalios apimties.
- HTML šablonai (Templates): Apibrėžia daugkartinio naudojimo HTML struktūras, kurias galima inicijuoti ir valdyti naudojant JavaScript.
Pasirinktinių elementų supratimas
Pasirinktiniai elementai yra žiniatinklio komponentų pagrindas, leidžiantis kūrėjams išplėsti HTML žodyną savo elementais. Šie pasirinktiniai elementai elgiasi kaip standartiniai HTML elementai, tačiau juos galima pritaikyti specifiniams programos poreikiams, suteikiant daugiau lankstumo ir geresnę kodo organizaciją.
Pasirinktinių elementų apibrėžimas
Norėdami apibrėžti pasirinktinį elementą, turite naudoti customElements.define()
metodą. Šis metodas priima du argumentus:
- Elemento pavadinimas: Eilutė, nurodanti pasirinktinio elemento pavadinimą. Pavadinime privalo būti brūkšnelis (
-
), kad būtų išvengta konfliktų su standartiniais HTML elementais. Pavyzdžiui,my-element
yra galiojantis pavadinimas, omyelement
– ne. - Elemento klasė: JavaScript klasė, kuri paveldi
HTMLElement
ir apibrėžia pasirinktinio elemento elgesį.
Štai paprastas pavyzdys:
class MyElement extends HTMLElement {
constructor() {
super();
this.innerHTML = 'Sveikas, Pasauli!';
}
}
customElements.define('my-element', MyElement);
Šiame pavyzdyje apibrėžiame pasirinktinį elementą pavadinimu my-element
. MyElement
klasė paveldi HTMLElement
ir konstruktoriuje nustato elemento vidinį HTML į „Sveikas, Pasauli!“.
Pasirinktinio elemento gyvavimo ciklo atgaliniai iškvietimai (Lifecycle Callbacks)
Pasirinktiniai elementai turi kelis gyvavimo ciklo atgalinius iškvietimus, kurie leidžia vykdyti kodą skirtinguose elemento gyvavimo etapuose. Šie atgaliniai iškvietimai suteikia galimybę inicializuoti elementą, reaguoti į atributų pasikeitimus ir išvalyti resursus, kai elementas pašalinamas iš DOM.
connectedCallback()
: Iškviečiamas, kai elementas įterpiamas į DOM. Tai gera vieta atlikti inicializavimo užduotis, pavyzdžiui, gauti duomenis ar pridėti įvykių klausytojus.disconnectedCallback()
: Iškviečiamas, kai elementas pašalinamas iš DOM. Tai gera vieta išvalyti resursus, pavyzdžiui, pašalinti įvykių klausytojus ar atlaisvinti atmintį.attributeChangedCallback(name, oldValue, newValue)
: Iškviečiamas, kai pakeičiamas elemento atributas. Šis atgalinis iškvietimas leidžia reaguoti į atributų pasikeitimus ir atitinkamai atnaujinti elemento atvaizdavimą. Turite nurodyti, kuriuos atributus stebėti, naudodamiobservedAttributes
geterį.adoptedCallback()
: Iškviečiamas, kai elementas perkeliamas į naują dokumentą.
Štai pavyzdys, demonstruojantis gyvavimo ciklo atgalinių iškvietimų naudojimą:
class MyElement extends HTMLElement {
constructor() {
super();
this.shadow = this.attachShadow({mode: 'open'});
}
connectedCallback() {
this.shadow.innerHTML = `Prijungta prie DOM!
`;
console.log('Elementas prijungtas');
}
disconnectedCallback() {
console.log('Elementas atjungtas');
}
static get observedAttributes() { return ['data-message']; }
attributeChangedCallback(name, oldValue, newValue) {
if (name === 'data-message') {
this.shadow.innerHTML = `${newValue}
`;
}
}
}
customElements.define('my-element', MyElement);
Šiame pavyzdyje connectedCallback()
išveda pranešimą į konsolę ir nustato elemento vidinį HTML, kai jis prijungiamas prie DOM. disconnectedCallback()
išveda pranešimą, kai elementas atjungiamas. attributeChangedCallback()
iškviečiamas, kai pasikeičia data-message
atributas, atitinkamai atnaujinant elemento turinį. Geteris observedAttributes
nurodo, kad norime stebėti data-message
atributo pakeitimus.
Shadow DOM naudojimas inkapsuliacijai
Shadow DOM suteikia inkapsuliaciją žiniatinklio komponentams, leidžiant jums sukurti atskirą DOM medį komponentui, kuris yra izoliuotas nuo likusio puslapio. Tai reiškia, kad Shadow DOM viduje apibrėžti stiliai ir scenarijai nepaveiks likusio puslapio, ir atvirkščiai. Ši inkapsuliacija padeda išvengti konfliktų ir užtikrina, kad jūsų komponentai veiktų nuspėjamai.
Norėdami naudoti Shadow DOM, galite iškviesti attachShadow()
metodą elementui. Šis metodas priima parinkčių objektą, kuris nurodo Shadow DOM režimą. mode
gali būti 'open'
arba 'closed'
. Jei režimas yra 'open'
, Shadow DOM galima pasiekti iš JavaScript naudojant elemento shadowRoot
savybę. Jei režimas yra 'closed'
, Shadow DOM negalima pasiekti iš JavaScript.
Štai pavyzdys, demonstruojantis Shadow DOM naudojimą:
class MyElement extends HTMLElement {
constructor() {
super();
this.shadow = this.attachShadow({ mode: 'open' });
this.shadow.innerHTML = `
Tai yra Shadow DOM viduje.
`;
}
}
customElements.define('my-element', MyElement);
Šiame pavyzdyje prie elemento prijungiame Shadow DOM su mode: 'open'
. Tada nustatome Shadow DOM vidinį HTML, įtraukdami stilių, kuris pastraipų spalvą nustato mėlyną, ir pastraipos elementą su tekstu. Shadow DOM viduje apibrėžtas stilius bus taikomas tik elementams, esantiems Shadow DOM viduje, ir nepaveiks pastraipų už Shadow DOM ribų.
Pasirinktinių elementų naudojimo privalumai
Pasirinktiniai elementai siūlo keletą privalumų žiniatinklio kūrimui:
- Daugkartinis naudojimas: Pasirinktinius elementus galima naudoti įvairiuose projektuose ir karkasuose, taip sumažinant kodo dubliavimą ir pagerinant palaikomumą.
- Inkapsuliacija: Shadow DOM suteikia inkapsuliaciją, užkertant kelią stilių ir scenarijų konfliktams ir užtikrinant, kad komponentai veiktų nuspėjamai.
- Sąveikumas: Pasirinktiniai elementai yra pagrįsti žiniatinklio standartais, todėl jie yra sąveikūs su kitomis žiniatinklio technologijomis ir karkasais.
- Palaikomumas: Modulinė žiniatinklio komponentų prigimtis palengvina kodo palaikymą ir atnaujinimą. Komponento pakeitimai yra izoliuoti, todėl sumažėja rizika sugadinti kitas programos dalis.
- Našumas: Pasirinktiniai elementai gali pagerinti našumą, sumažindami kodo, kurį reikia apdoroti ir įvykdyti, kiekį. Jie taip pat leidžia efektyviau atvaizduoti ir atnaujinti.
Praktiniai pasirinktinių elementų pavyzdžiai
Panagrinėkime keletą praktinių pavyzdžių, kaip pasirinktinius elementus galima naudoti kuriant įprastus UI komponentus.
Paprastas skaitiklio komponentas
Šis pavyzdys parodo, kaip sukurti paprastą skaitiklio komponentą naudojant pasirinktinius elementus.
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);
Šis kodas apibrėžia Counter
klasę, kuri paveldi HTMLElement
. Konstruktorius inicializuoja komponentą, prijungia Shadow DOM ir nustato pradinę skaitiklio vertę į 0. Metodas connectedCallback()
prideda įvykių klausytojus prie didinimo ir mažinimo mygtukų. Metodai increment()
ir decrement()
atnaujina skaitiklio vertę ir iškviečia render()
metodą, kad atnaujintų komponento atvaizdavimą. Metodas render()
nustato Shadow DOM vidinį HTML, įtraukiant skaitiklio ekraną ir mygtukus.
Paveikslėlių karuselės komponentas
Šis pavyzdys parodo, kaip sukurti paveikslėlių karuselės komponentą naudojant pasirinktinius elementus. Trumpumo dėlei, paveikslėlių šaltiniai yra vietos rezervavimo ženklai ir galėtų būti dinamiškai įkeliami iš API, TVS ar vietinės saugyklos. Stiliai taip pat buvo sumažinti iki minimumo.
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);
Šis kodas apibrėžia ImageCarousel
klasę, kuri paveldi HTMLElement
. Konstruktorius inicializuoja komponentą, prijungia Shadow DOM ir nustato pradinį paveikslėlių masyvą bei dabartinį indeksą. Metodas connectedCallback()
prideda įvykių klausytojus prie ankstesnio ir kito mygtukų. Metodai nextImage()
ir prevImage()
atnaujina dabartinį indeksą ir iškviečia render()
metodą, kad atnaujintų komponento atvaizdavimą. Metodas render()
nustato Shadow DOM vidinį HTML, įtraukiant dabartinį paveikslėlį ir mygtukus.
Geriausios praktikos dirbant su pasirinktiniais elementais
Štai keletas geriausių praktikų, kurių reikėtų laikytis dirbant su pasirinktiniais elementais:
- Naudokite aprašomuosius elementų pavadinimus: Pasirinkite elementų pavadinimus, kurie aiškiai nurodo komponento paskirtį.
- Naudokite Shadow DOM inkapsuliacijai: Shadow DOM padeda išvengti stilių ir scenarijų konfliktų ir užtikrina, kad komponentai veiktų nuspėjamai.
- Tinkamai naudokite gyvavimo ciklo atgalinius iškvietimus: Naudokite gyvavimo ciklo atgalinius iškvietimus, kad inicializuotumėte elementą, reaguotumėte į atributų pasikeitimus ir išvalytumėte resursus, kai elementas pašalinamas iš DOM.
- Naudokite atributus konfigūravimui: Naudokite atributus, kad sukonfigūruotumėte komponento elgesį ir išvaizdą.
- Naudokite įvykius komunikacijai: Naudokite pasirinktinius įvykius komunikacijai tarp komponentų.
- Suteikite atsarginę patirtį: Apsvarstykite galimybę suteikti atsarginę patirtį naršyklėms, kurios nepalaiko žiniatinklio komponentų. Tai galima padaryti naudojant laipsnišką tobulinimą (progressive enhancement).
- Pagalvokite apie internacionalizavimą (i18n) ir lokalizavimą (l10n): Kurdami žiniatinklio komponentus, apsvarstykite, kaip jie bus naudojami skirtingose kalbose ir regionuose. Kurkite savo komponentus taip, kad juos būtų galima lengvai išversti ir lokalizuoti. Pavyzdžiui, iškelkite visas teksto eilutes į išorę ir numatykite mechanizmus, kaip dinamiškai įkelti vertimus. Užtikrinkite, kad jūsų datos ir laiko formatai, valiutų simboliai ir kiti regioniniai nustatymai būtų tvarkomi teisingai.
- Atsižvelkite į prieinamumą (a11y): Žiniatinklio komponentai turėtų būti kuriami atsižvelgiant į prieinamumą nuo pat pradžių. Naudokite ARIA atributus, kur reikia, kad suteiktumėte semantinę informaciją pagalbinėms technologijoms. Užtikrinkite, kad būtų pilnai palaikoma navigacija klaviatūra ir kad spalvų kontrastas būtų pakankamas vartotojams su regos sutrikimais. Išbandykite savo komponentus su ekrano skaitytuvais, kad patikrintumėte jų prieinamumą.
Pasirinktiniai elementai ir karkasai
Pasirinktiniai elementai yra sukurti taip, kad būtų sąveikūs su kitomis žiniatinklio technologijomis ir karkasais. Jie gali būti naudojami kartu su populiariais karkasais, tokiais kaip React, Angular ir Vue.js.
Pasirinktinių elementų naudojimas React
Norėdami naudoti pasirinktinius elementus React aplinkoje, galite juos tiesiog atvaizduoti kaip bet kurį kitą HTML elementą. Tačiau jums gali prireikti naudoti ref, kad pasiektumėte pagrindinį DOM elementą ir tiesiogiai su juo sąveikautumėte.
import React, { useRef, useEffect } from 'react';
function MyComponent() {
const myElementRef = useRef(null);
useEffect(() => {
if (myElementRef.current) {
// Pasiekiame pasirinktinio elemento API
myElementRef.current.addEventListener('custom-event', (event) => {
console.log('Gautas pasirinktinis įvykis:', event.detail);
});
}
}, []);
return ;
}
export default MyComponent;
Šiame pavyzdyje naudojame ref, kad pasiektume my-element
pasirinktinį elementą ir pridėtume jam įvykio klausytoją. Tai leidžia mums klausytis pasirinktinių įvykių, kuriuos siunčia pasirinktinis elementas, ir atitinkamai reaguoti.
Pasirinktinių elementų naudojimas Angular
Norėdami naudoti pasirinktinius elementus Angular aplinkoje, turite sukonfigūruoti Angular, kad jis atpažintų pasirinktinį elementą. Tai galima padaryti pridedant pasirinktinį elementą prie schemas
masyvo modulio konfigūracijoje.
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 { }
Kai pasirinktinis elementas yra užregistruotas, galite jį naudoti savo Angular šablonuose kaip bet kurį kitą HTML elementą.
Pasirinktinių elementų naudojimas Vue.js
Vue.js taip pat natūraliai palaiko pasirinktinius elementus. Galite juos naudoti tiesiogiai savo šablonuose be jokios specialios konfigūracijos.
Vue automatiškai atpažins pasirinktinį elementą ir teisingai jį atvaizduos.
Prieinamumo aspektai
Kuriant pasirinktinius elementus, labai svarbu atsižvelgti į prieinamumą, kad jūsų komponentai būtų naudojami visiems, įskaitant žmones su negalia. Štai keletas pagrindinių prieinamumo aspektų:
- Semantinis HTML: Kai tik įmanoma, naudokite semantinius HTML elementus, kad suteiktumėte prasmingą struktūrą savo komponentams.
- ARIA atributai: Naudokite ARIA atributus, kad suteiktumėte papildomos semantinės informacijos pagalbinėms technologijoms, tokioms kaip ekrano skaitytuvai.
- Navigacija klaviatūra: Užtikrinkite, kad jūsų komponentais galima naršyti naudojant klaviatūrą. Tai ypač svarbu interaktyviems elementams, tokiems kaip mygtukai ir nuorodos.
- Spalvų kontrastas: Užtikrinkite, kad tarp teksto ir fono spalvų būtų pakankamas kontrastas, kad tekstas būtų įskaitomas žmonėms su regos sutrikimais.
- Fokuso valdymas: Teisingai valdykite fokusą, kad vartotojai galėtų lengvai naršyti po jūsų komponentus.
- Testavimas su pagalbinėmis technologijomis: Išbandykite savo komponentus su pagalbinėmis technologijomis, tokiomis kaip ekrano skaitytuvai, kad įsitikintumėte jų prieinamumu.
Internacionalizavimas ir lokalizavimas
Kuriant pasirinktinius elementus pasaulinei auditorijai, svarbu atsižvelgti į internacionalizavimą (i18n) ir lokalizavimą (l10n). Štai keletas pagrindinių aspektų:
- Teksto kryptis: Palaikykite tiek iš kairės į dešinę (LTR), tiek iš dešinės į kairę (RTL) teksto kryptis.
- Datos ir laiko formatai: Naudokite tinkamus datos ir laiko formatus skirtingoms lokalėms.
- Valiutų simboliai: Naudokite tinkamus valiutų simbolius skirtingoms lokalėms.
- Vertimas: Pateikite visų teksto eilučių vertimus savo komponentuose.
- Skaičių formatavimas: Naudokite tinkamą skaičių formatavimą skirtingoms lokalėms.
Išvada
Pasirinktiniai elementai yra galingas įrankis kuriant daugkartinio naudojimo ir inkapsuliuotus UI komponentus. Jie siūlo keletą privalumų žiniatinklio kūrimui, įskaitant daugkartinį naudojimą, inkapsuliaciją, sąveikumą, palaikomumą ir našumą. Laikydamiesi šiame vadove pateiktų geriausių praktikų, galite pasinaudoti pasirinktiniais elementais kurdami šiuolaikines žiniatinklio programas, kurios yra tvirtos, palaikomos ir prieinamos pasaulinei auditorijai. Toliau tobulėjant žiniatinklio standartams, žiniatinklio komponentai, įskaitant pasirinktinius elementus, taps vis svarbesni kuriant modulines ir mastelio keitimui pritaikytas žiniatinklio programas.
Pasinaudokite pasirinktinių elementų galia kurdami žiniatinklio ateitį, po vieną komponentą. Nepamirškite atsižvelgti į prieinamumą, internacionalizavimą ir lokalizavimą, kad užtikrintumėte, jog jūsų komponentai būtų naudojami visiems ir visur.