Rumah >hujung hadapan web >Soal Jawab bahagian hadapan >Bagaimanakah saya menggunakan Shadow Dom untuk enkapsulasi dalam komponen web?
Menggunakan Shadow Dom untuk Encapsulation dalam Komponen Web
Shadow Dom adalah bahagian penting dalam mewujudkan komponen web yang benar -benar terkandung. Ia membolehkan anda merangkumi struktur dalaman komponen (HTML, CSS, dan JavaScript) dari seluruh halaman. Ini menghalang konflik gaya dan kesan sampingan yang tidak diingini. Anda membuat bayangan dom dengan menggunakan kaedah attachShadow()
pada elemen. Kaedah ini mengambil objek ShadowRootInit
pilihan sebagai hujah, yang membolehkan anda menentukan mod Shadow Dom. Kedua -dua mod adalah:
'open'
(lalai): Gaya dari dokumen utama boleh menjejaskan bayang-bayang dom, dan sebaliknya. Ini menawarkan lebih banyak fleksibiliti tetapi mengurangkan enkapsulasi.'closed'
: Gaya dari dokumen utama tidak boleh menjejaskan bayangan dom, dan sebaliknya. Ini memberikan enkapsulasi yang lebih kuat, mencegah gaya berdarah dan menimpa secara tidak sengaja.Berikut adalah contoh membuat komponen web dengan Shadow Dom:
<code class="javascript">class MyComponent extends HTMLElement { constructor() { super(); this.attachShadow({ mode: 'closed' }); // Use 'open' if needed // Create internal HTML const div = document.createElement('div'); div.innerHTML = ` <style> :host { display: block; border: 1px solid black; } p { color: blue; } </style> <p>This is my component!</p> `; this.shadowRoot.appendChild(div); } } customElements.define('my-component', MyComponent);</code>
Kod ini mentakrifkan elemen tersuai my-component
. Kaedah attachShadow()
mencipta bayangan dom, dan HTML dalaman, termasuk gaya, ditambah kepadanya. The :host
pseudo-selector membolehkan anda gaya elemen tersuai itu sendiri. Kerana kami menggunakan mode: 'closed'
, gaya dari halaman utama tidak akan menjejaskan penampilan komponen ini.
Manfaat Shadow Dom ke atas Teknik Encapsulation Lain
Berbanding dengan teknik enkapsulasi lain seperti menggunakan nama kelas CSS yang unik atau ruang nama JavaScript, Shadow Dom menawarkan beberapa kelebihan utama:
Komponen Styling dengan Shadow Dom dengan berkesan
Komponen gaya dalam Shadow Dom adalah mudah, tetapi memerlukan pemahaman bagaimana :host
.
<style></style>
. Ini menyimpan gaya setempat dan menghalang konflik.:host
Pseudo-Selector: Pseudo-selektor ini mensasarkan elemen tersuai itu sendiri, yang membolehkan anda gaya elemen tuan rumah dari dalam bayang-bayang dom. Contoh menggunakan lembaran gaya dalaman dan :host
:
<code class="html"><my-component style="--my-color: red;"></my-component> <style> my-component { /* styles applied to the outside of the shadow root */ } my-component::part(my-part) { /* styles applied to a specific part inside the shadow root */ } </style></code>
<code class="javascript">class MyComponent extends HTMLElement { constructor() { super(); this.attachShadow({ mode: 'open' }); // or 'closed' this.shadowRoot.innerHTML = ` <style> :host { display: block; border: 1px solid var(--my-color, black); /* Default to black if not specified */ } p { color: blue; } </style> <p>This is my component!</p> `; } }</code>
Contoh ini menunjukkan cara menggunakan pembolehubah CSS ( --my-color
) untuk menyesuaikan warna sempadan dari luar. Warna lalai adalah hitam.
Mengakses dan memanipulasi elemen dom bayangan dari luar
Secara langsung mengakses dan memanipulasi unsur -unsur dalam bayang -bayang dom dari luar biasanya tidak digalakkan kerana ia memecahkan enkapsulasi dan boleh menyebabkan kod rapuh. Walau bagaimanapun, terdapat situasi di mana ia mungkin diperlukan. Berikut adalah beberapa kaedah:
querySelector
dan querySelectorAll
: Jika anda tahu pemilih untuk elemen dalam Shadow DOM, anda boleh menggunakan kaedah ini untuk mengaksesnya. Walau bagaimanapun, ini adalah rapuh kerana perubahan struktur dalaman dapat memecahkan kod anda. Kaedah querySelector
perlu dipanggil pada harta shadowRoot
.shadowRoot
: Jika anda mempunyai rujukan kepada elemen tersuai, anda boleh mengakses harta shadowRoot
untuk melintasi Shadow Dom. Contoh mengakses elemen menggunakan querySelector
:
<code class="javascript">const myComponent = document.querySelector('my-component'); const paragraph = myComponent.shadowRoot.querySelector('p'); paragraph.textContent = 'This text has been changed from the outside!';</code>
Contoh ini secara langsung mengakses elemen <p></p>
dalam dom bayangan. Walau bagaimanapun, ini umumnya tidak digalakkan. Lebih baik untuk mendedahkan kaedah dalam kelas MyComponent
anda yang membolehkan mengemas kini teks dengan cara yang terkawal dan boleh dipelihara. Contohnya:
<code class="javascript">class MyComponent extends HTMLElement { // ... (constructor as before) ... set textContent(newText) { this.shadowRoot.querySelector('p').textContent = newText; } }</code>
Sekarang anda boleh mengemas kini teks dengan selamat dan boleh diramalkan menggunakan: myComponent.textContent = "New text";
Pendekatan ini mengekalkan enkapsulasi dan mengekalkan kod anda lebih mantap.
Atas ialah kandungan terperinci Bagaimanakah saya menggunakan Shadow Dom untuk enkapsulasi dalam komponen web?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!