Это связано с последовательностью выполнения анализа.Когда тег <my-list>
обнаружен, он создается (и подключается) немедленно, до того, как вставляются его дочерние элементы.
В результате ${this.innerHTML}
вернет пустую строку в connectedCallback()
.
Вы можете подождать, пока дети не будут проанализированы, например, с помощью setTimeout()
:
class List extends HTMLElement {
connectedCallback() {
setTimeout( () =>
this.innerHTML = `<div class="list">${this.innerHTML}</div>`
)
}
}
Но вам лучше использовать Shadow DOM с <slot>
для вставки элементов светлого DOM:
class List extends HTMLElement {
connectedCallback() {
this.attachShadow( { mode: 'open' } )
.innerHTML = `<div class="list"><slot></slot></div>`
}
}
См. Пример ниже.
class ListItem extends HTMLElement {
connectedCallback() {
this.innerHTML = "<div>ListItem</div>";
}
}
class List extends HTMLElement {
connectedCallback() {
this.attachShadow( { mode: 'open' } )
.innerHTML = `<div class="list"><slot></slot></div>`
}
}
customElements.define("list-item", ListItem);
customElements.define("my-list", List);
<my-list>
<list-item></list-item>
<list-item></list-item>
<list-item></list-item>
</my-list>