Declarative Shadow DOM

๐Ÿ–Š
note

Baseline 2024 ใง่ฟฝๅŠ ใ•ใ‚ŒใŸใ€ใ“ใ‚Œใพใง JavaScript ใ‹ใ‚‰ใ—ใ‹็”Ÿๆˆใงใใชใ‹ใฃใŸ Shadow DOM ใ‚’ HTML ใงๅฎš็พฉใงใใ‚‹ใ‚ˆใ†ใซใชใ‚‹ๆฉŸ่ƒฝใงใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใฃใฆใ€Web Components ใ‚’ใ‚ตใƒผใƒใƒผใ‚ตใ‚คใƒ‰ใงใฎใƒฌใƒณใƒ€ใƒชใƒณใ‚ฐใซๅฏพๅฟœใ•ใ›ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚

ๆฌกใฎใ‚ˆใ†ใช HTML ใจใ—ใฆ่จ˜่ฟฐใ™ใ‚‹ใ“ใจใง Shadow DOM ใŒ็”Ÿๆˆใ•ใ‚Œใพใ™ใ€‚(ๅ‹•ไฝœใ‚ตใƒณใƒ—ใƒซ)

<my-custom-element data-count="12345">
    <template shadowrootmode="open">
        <style>
            * {
                margin: 0;
                padding: 0;
            }
            .container {
                display: flex;
                gap: 8px;
            }
            .counter {
                font-weight: bold;
            }
            .increment, .decrement {
                width: 20px;
                cursor: pointer;
            }
        </style>
        <div class="container">
        <p class="counter">12345</p>
        <button class="increment">+</button>
        <button class="decrement">-</button>
        </div>
    </template>
</my-custom-element>

ๅŒๅใง customElements.define ใ•ใ‚ŒใŸ HTMLElement ใŒใ‚ใ‚Œใฐใ€่‡ชๅ‹•็š„ใซใ‚ขใƒƒใƒ—ใƒ‡ใƒผใƒˆใ•ใ‚Œใ€ constructor ใ‚„ connectedCallback ใง Hydration ใ‚’่กŒใ†ใ“ใจใŒใงใใพใ™ใ€‚

class MyCustomElement extends HTMLElement {
    connectedCallback() {
        let count = parseInt(this.getAttribute('data-count'))
        this.shadowRoot.querySelector('.increment').addEventListener('click', () => {
            this.shadowRoot.querySelector('.counter').textContent = String(++count)
        })
        this.shadowRoot.querySelector('.decrement').addEventListener('click', () => {
            this.shadowRoot.querySelector('.counter').textContent = String(--count)
        })
    }
}
customElements.define("my-custom-element", MyCustomElement);

Declarative Shadow DOM ใฎๅฝขใง JavaScript ใ‹ใ‚‰่ฆ็ด ใ‚’่ฟฝๅŠ ใ™ใ‚‹ๅ ดๅˆใ€ $el.innerHTML = htmlString ใงใฏใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃไธŠใฎ็†็”ฑใ‹ใ‚‰ๅฎŸ่กŒใŒ่กŒใ‚ใ‚Œใšใ€ไปฃใ‚ใ‚Šใซ setHTMLUnsafe ใ‚„ parseHTMLUnsafe ใ‚’ๅˆฉ็”จใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚

Refs

yaakai.to